Skip to content

Commit fc46244

Browse files
committed
DAG: Lower single infinity is.fpclass tests to fcmp
InstCombine also should have taken care of this, but this should be helpful when the fcmp based lowering strategy tries to combine multiple tests.
1 parent b62d261 commit fc46244

File tree

5 files changed

+127
-111
lines changed

5 files changed

+127
-111
lines changed

llvm/lib/CodeGen/CodeGenCommonISel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ FPClassTest llvm::invertFPClassTestIfSimpler(FPClassTest Test, bool UseFCmp) {
202202
case fcSubnormal | fcZero | fcNan:
203203
return InvertedTest;
204204
case fcInf | fcNan:
205+
case fcPosInf | fcNan:
206+
case fcNegInf | fcNan:
205207
// If we're trying to use fcmp, we can take advantage of the nan check
206208
// behavior of the compare (but this is more instructions in the integer
207209
// expansion).

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8628,18 +8628,29 @@ SDValue TargetLowering::expandIS_FPCLASS(EVT ResultVT, SDValue Op,
86288628
return DAG.getSetCC(DL, ResultVT, Op, Op,
86298629
IsInvertedFP ? ISD::SETO : ISD::SETUO);
86308630

8631-
bool IsOrderedInf = FPTestMask == fcInf;
8632-
if ((FPTestMask == fcInf || FPTestMask == (fcInf | fcNan)) &&
8633-
isCondCodeLegalOrCustom(IsOrderedInf ? OrderedCmpOpcode
8634-
: UnorderedCmpOpcode,
8635-
OperandVT.getScalarType().getSimpleVT()) &&
8636-
isOperationLegalOrCustom(ISD::FABS, OperandVT.getScalarType())) {
8631+
if (OrderedFPTestMask == fcInf &&
8632+
isCondCodeLegalOrCustom(IsOrdered ? OrderedCmpOpcode
8633+
: UnorderedCmpOpcode,
8634+
OperandVT.getScalarType().getSimpleVT())) {
86378635
// isinf(x) --> fabs(x) == inf
86388636
SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
86398637
SDValue Inf =
86408638
DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
86418639
return DAG.getSetCC(DL, ResultVT, Abs, Inf,
8642-
IsOrderedInf ? OrderedCmpOpcode : UnorderedCmpOpcode);
8640+
IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
8641+
}
8642+
8643+
if (OrderedFPTestMask == fcPosInf || OrderedFPTestMask == fcNegInf) {
8644+
// isposinf(x) --> x == inf
8645+
// isneginf(x) --> x == -inf
8646+
// isposinf(x) || nan --> x u== inf
8647+
// isneginf(x) || nan --> x u== -inf
8648+
8649+
SDValue Inf = DAG.getConstantFP(
8650+
APFloat::getInf(Semantics, OrderedFPTestMask == fcNegInf), DL,
8651+
OperandVT);
8652+
return DAG.getSetCC(DL, ResultVT, Op, Inf,
8653+
IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
86438654
}
86448655

86458656
if (OrderedFPTestMask == (fcSubnormal | fcZero) && !IsOrdered) {

llvm/test/CodeGen/AArch64/isinf.ll

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,22 @@ define i32 @replace_isinf_call_f64(double %x) {
5858
define i32 @replace_isinf_call_f128(fp128 %x) {
5959
; CHECK-LABEL: replace_isinf_call_f128:
6060
; CHECK: // %bb.0:
61-
; CHECK-NEXT: str q0, [sp, #-16]!
62-
; CHECK-NEXT: .cfi_def_cfa_offset 16
63-
; CHECK-NEXT: ldp x9, x8, [sp], #16
64-
; CHECK-NEXT: and x8, x8, #0x7fffffffffffffff
65-
; CHECK-NEXT: eor x8, x8, #0x7fff000000000000
66-
; CHECK-NEXT: orr x8, x9, x8
67-
; CHECK-NEXT: cmp x8, #0
61+
; CHECK-NEXT: sub sp, sp, #32
62+
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
63+
; CHECK-NEXT: .cfi_def_cfa_offset 32
64+
; CHECK-NEXT: .cfi_offset w30, -16
65+
; CHECK-NEXT: str q0, [sp]
66+
; CHECK-NEXT: ldrb w8, [sp, #15]
67+
; CHECK-NEXT: and w8, w8, #0x7f
68+
; CHECK-NEXT: strb w8, [sp, #15]
69+
; CHECK-NEXT: adrp x8, .LCPI3_0
70+
; CHECK-NEXT: ldr q0, [sp]
71+
; CHECK-NEXT: ldr q1, [x8, :lo12:.LCPI3_0]
72+
; CHECK-NEXT: bl __eqtf2
73+
; CHECK-NEXT: cmp w0, #0
74+
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
6875
; CHECK-NEXT: cset w0, eq
76+
; CHECK-NEXT: add sp, sp, #32
6977
; CHECK-NEXT: ret
7078
%abs = tail call fp128 @llvm.fabs.f128(fp128 %x)
7179
%cmpinf = fcmp oeq fp128 %abs, 0xL00000000000000007FFF000000000000

llvm/test/CodeGen/X86/is_fpclass-fp80.ll

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -265,23 +265,24 @@ entry:
265265
define i1 @is_posinf_f80(x86_fp80 %x) nounwind {
266266
; X86-LABEL: is_posinf_f80:
267267
; X86: # %bb.0: # %entry
268-
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
269-
; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000
270-
; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx
271-
; X86-NEXT: xorl $32767, %eax # imm = 0x7FFF
272-
; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
273-
; X86-NEXT: orl %ecx, %eax
274-
; X86-NEXT: sete %al
268+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
269+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
270+
; X86-NEXT: fxch %st(1)
271+
; X86-NEXT: fucompp
272+
; X86-NEXT: fnstsw %ax
273+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
274+
; X86-NEXT: sahf
275+
; X86-NEXT: setae %al
275276
; X86-NEXT: retl
276277
;
277278
; X64-LABEL: is_posinf_f80:
278279
; X64: # %bb.0: # %entry
279-
; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
280-
; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
281-
; X64-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
282-
; X64-NEXT: xorq $32767, %rax # imm = 0x7FFF
283-
; X64-NEXT: orq %rcx, %rax
284-
; X64-NEXT: sete %al
280+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
281+
; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
282+
; X64-NEXT: fxch %st(1)
283+
; X64-NEXT: fucompi %st(1), %st
284+
; X64-NEXT: fstp %st(0)
285+
; X64-NEXT: setae %al
285286
; X64-NEXT: retq
286287
entry:
287288
%0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 512) ; 0x200 = "+inf"
@@ -291,23 +292,22 @@ entry:
291292
define i1 @is_neginf_f80(x86_fp80 %x) nounwind {
292293
; X86-LABEL: is_neginf_f80:
293294
; X86: # %bb.0: # %entry
294-
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
295-
; X86-NEXT: xorl $65535, %eax # imm = 0xFFFF
296-
; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000
297-
; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx
298-
; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
299-
; X86-NEXT: orl %ecx, %eax
300-
; X86-NEXT: sete %al
295+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
296+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
297+
; X86-NEXT: fucompp
298+
; X86-NEXT: fnstsw %ax
299+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
300+
; X86-NEXT: sahf
301+
; X86-NEXT: setae %al
301302
; X86-NEXT: retl
302303
;
303304
; X64-LABEL: is_neginf_f80:
304305
; X64: # %bb.0: # %entry
305-
; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
306-
; X64-NEXT: xorq $65535, %rax # imm = 0xFFFF
307-
; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
308-
; X64-NEXT: xorq {{[0-9]+}}(%rsp), %rcx
309-
; X64-NEXT: orq %rax, %rcx
310-
; X64-NEXT: sete %al
306+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
307+
; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
308+
; X64-NEXT: fucompi %st(1), %st
309+
; X64-NEXT: fstp %st(0)
310+
; X64-NEXT: setae %al
311311
; X64-NEXT: retq
312312
entry:
313313
%0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 4) ; "-inf"

llvm/test/CodeGen/X86/is_fpclass.ll

Lines changed: 66 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,20 @@ entry:
186186
define i1 @is_plus_inf_f(float %x) {
187187
; X86-LABEL: is_plus_inf_f:
188188
; X86: # %bb.0: # %entry
189-
; X86-NEXT: cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
190-
; X86-NEXT: sete %al
189+
; X86-NEXT: flds {{[0-9]+}}(%esp)
190+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
191+
; X86-NEXT: fxch %st(1)
192+
; X86-NEXT: fucompp
193+
; X86-NEXT: fnstsw %ax
194+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
195+
; X86-NEXT: sahf
196+
; X86-NEXT: setae %al
191197
; X86-NEXT: retl
192198
;
193199
; X64-LABEL: is_plus_inf_f:
194200
; X64: # %bb.0: # %entry
195-
; X64-NEXT: movd %xmm0, %eax
196-
; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
197-
; X64-NEXT: sete %al
201+
; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
202+
; X64-NEXT: setae %al
198203
; X64-NEXT: retq
199204
entry:
200205
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512) ; 0x200 = "+inf"
@@ -204,15 +209,20 @@ entry:
204209
define i1 @is_minus_inf_f(float %x) {
205210
; X86-LABEL: is_minus_inf_f:
206211
; X86: # %bb.0: # %entry
207-
; X86-NEXT: cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000
208-
; X86-NEXT: sete %al
212+
; X86-NEXT: flds {{[0-9]+}}(%esp)
213+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
214+
; X86-NEXT: fucompp
215+
; X86-NEXT: fnstsw %ax
216+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
217+
; X86-NEXT: sahf
218+
; X86-NEXT: setae %al
209219
; X86-NEXT: retl
210220
;
211221
; X64-LABEL: is_minus_inf_f:
212222
; X64: # %bb.0: # %entry
213-
; X64-NEXT: movd %xmm0, %eax
214-
; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
215-
; X64-NEXT: sete %al
223+
; X64-NEXT: movss {{.*#+}} xmm1 = [-Inf,0.0E+0,0.0E+0,0.0E+0]
224+
; X64-NEXT: ucomiss %xmm0, %xmm1
225+
; X64-NEXT: setae %al
216226
; X64-NEXT: retq
217227
entry:
218228
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4) ; "-inf"
@@ -222,15 +232,20 @@ entry:
222232
define i1 @not_is_minus_inf_f(float %x) {
223233
; X86-LABEL: not_is_minus_inf_f:
224234
; X86: # %bb.0: # %entry
225-
; X86-NEXT: cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000
226-
; X86-NEXT: setne %al
235+
; X86-NEXT: flds {{[0-9]+}}(%esp)
236+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
237+
; X86-NEXT: fucompp
238+
; X86-NEXT: fnstsw %ax
239+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
240+
; X86-NEXT: sahf
241+
; X86-NEXT: setb %al
227242
; X86-NEXT: retl
228243
;
229244
; X64-LABEL: not_is_minus_inf_f:
230245
; X64: # %bb.0: # %entry
231-
; X64-NEXT: movd %xmm0, %eax
232-
; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
233-
; X64-NEXT: setne %al
246+
; X64-NEXT: movss {{.*#+}} xmm1 = [-Inf,0.0E+0,0.0E+0,0.0E+0]
247+
; X64-NEXT: ucomiss %xmm0, %xmm1
248+
; X64-NEXT: setb %al
234249
; X64-NEXT: retq
235250
entry:
236251
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019) ; ~"-inf"
@@ -2116,24 +2131,19 @@ entry:
21162131
define i1 @is_plus_inf_or_nan_f(float %x) {
21172132
; X86-LABEL: is_plus_inf_or_nan_f:
21182133
; X86: # %bb.0:
2119-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
2120-
; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2121-
; X86-NEXT: sete %cl
2122-
; X86-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2123-
; X86-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001
2124-
; X86-NEXT: setge %al
2125-
; X86-NEXT: orb %cl, %al
2134+
; X86-NEXT: flds {{[0-9]+}}(%esp)
2135+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
2136+
; X86-NEXT: fucompp
2137+
; X86-NEXT: fnstsw %ax
2138+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
2139+
; X86-NEXT: sahf
2140+
; X86-NEXT: sete %al
21262141
; X86-NEXT: retl
21272142
;
21282143
; X64-LABEL: is_plus_inf_or_nan_f:
21292144
; X64: # %bb.0:
2130-
; X64-NEXT: movd %xmm0, %eax
2131-
; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2132-
; X64-NEXT: sete %cl
2133-
; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2134-
; X64-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001
2135-
; X64-NEXT: setge %al
2136-
; X64-NEXT: orb %cl, %al
2145+
; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2146+
; X64-NEXT: sete %al
21372147
; X64-NEXT: retq
21382148
%class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 515) ; 0x200|0x3 = "+inf|nan"
21392149
ret i1 %class
@@ -2142,24 +2152,19 @@ define i1 @is_plus_inf_or_nan_f(float %x) {
21422152
define i1 @is_minus_inf_or_nan_f(float %x) {
21432153
; X86-LABEL: is_minus_inf_or_nan_f:
21442154
; X86: # %bb.0:
2145-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
2146-
; X86-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
2147-
; X86-NEXT: sete %cl
2148-
; X86-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2149-
; X86-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001
2150-
; X86-NEXT: setge %al
2151-
; X86-NEXT: orb %cl, %al
2155+
; X86-NEXT: flds {{[0-9]+}}(%esp)
2156+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
2157+
; X86-NEXT: fucompp
2158+
; X86-NEXT: fnstsw %ax
2159+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
2160+
; X86-NEXT: sahf
2161+
; X86-NEXT: sete %al
21522162
; X86-NEXT: retl
21532163
;
21542164
; X64-LABEL: is_minus_inf_or_nan_f:
21552165
; X64: # %bb.0:
2156-
; X64-NEXT: movd %xmm0, %eax
2157-
; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
2158-
; X64-NEXT: sete %cl
2159-
; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2160-
; X64-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001
2161-
; X64-NEXT: setge %al
2162-
; X64-NEXT: orb %cl, %al
2166+
; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2167+
; X64-NEXT: sete %al
21632168
; X64-NEXT: retq
21642169
%class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 7) ; "-inf|nan"
21652170
ret i1 %class
@@ -2168,24 +2173,19 @@ define i1 @is_minus_inf_or_nan_f(float %x) {
21682173
define i1 @not_is_plus_inf_or_nan_f(float %x) {
21692174
; X86-LABEL: not_is_plus_inf_or_nan_f:
21702175
; X86: # %bb.0:
2171-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
2172-
; X86-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
2173-
; X86-NEXT: sete %cl
2174-
; X86-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2175-
; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2176-
; X86-NEXT: setl %al
2177-
; X86-NEXT: orb %cl, %al
2176+
; X86-NEXT: flds {{[0-9]+}}(%esp)
2177+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
2178+
; X86-NEXT: fucompp
2179+
; X86-NEXT: fnstsw %ax
2180+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
2181+
; X86-NEXT: sahf
2182+
; X86-NEXT: setne %al
21782183
; X86-NEXT: retl
21792184
;
21802185
; X64-LABEL: not_is_plus_inf_or_nan_f:
21812186
; X64: # %bb.0:
2182-
; X64-NEXT: movd %xmm0, %eax
2183-
; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000
2184-
; X64-NEXT: sete %cl
2185-
; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2186-
; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2187-
; X64-NEXT: setl %al
2188-
; X64-NEXT: orb %cl, %al
2187+
; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2188+
; X64-NEXT: setne %al
21892189
; X64-NEXT: retq
21902190
%class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 508) ; ~(0x200|0x3) = "~(+inf|nan)"
21912191
ret i1 %class
@@ -2194,24 +2194,19 @@ define i1 @not_is_plus_inf_or_nan_f(float %x) {
21942194
define i1 @not_is_minus_inf_or_nan_f(float %x) {
21952195
; X86-LABEL: not_is_minus_inf_or_nan_f:
21962196
; X86: # %bb.0:
2197-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
2198-
; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2199-
; X86-NEXT: sete %cl
2200-
; X86-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2201-
; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2202-
; X86-NEXT: setl %al
2203-
; X86-NEXT: orb %cl, %al
2197+
; X86-NEXT: flds {{[0-9]+}}(%esp)
2198+
; X86-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}
2199+
; X86-NEXT: fucompp
2200+
; X86-NEXT: fnstsw %ax
2201+
; X86-NEXT: # kill: def $ah killed $ah killed $ax
2202+
; X86-NEXT: sahf
2203+
; X86-NEXT: setne %al
22042204
; X86-NEXT: retl
22052205
;
22062206
; X64-LABEL: not_is_minus_inf_or_nan_f:
22072207
; X64: # %bb.0:
2208-
; X64-NEXT: movd %xmm0, %eax
2209-
; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2210-
; X64-NEXT: sete %cl
2211-
; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF
2212-
; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000
2213-
; X64-NEXT: setl %al
2214-
; X64-NEXT: orb %cl, %al
2208+
; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2209+
; X64-NEXT: setne %al
22152210
; X64-NEXT: retq
22162211
%class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1016) ; "~(-inf|nan)"
22172212
ret i1 %class

0 commit comments

Comments
 (0)