Skip to content

Commit b46e768

Browse files
authored
[DAGCombine] Fold setcc_eq infinity into is.fpclass (#67829)
1 parent b8cbc5c commit b46e768

File tree

3 files changed

+35
-40
lines changed

3 files changed

+35
-40
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5104,6 +5104,21 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
51045104
}
51055105
}
51065106

5107+
// setueq/setoeq X, (fabs Inf) -> is_fpclass X, fcInf
5108+
if (isOperationLegalOrCustom(ISD::IS_FPCLASS, N0.getValueType()) &&
5109+
!isFPImmLegal(CFP->getValueAPF(), CFP->getValueType(0))) {
5110+
bool IsFabs = N0.getOpcode() == ISD::FABS;
5111+
SDValue Op = IsFabs ? N0.getOperand(0) : N0;
5112+
if ((Cond == ISD::SETOEQ || Cond == ISD::SETUEQ) && CFP->isInfinity()) {
5113+
FPClassTest Flag = CFP->isNegative() ? (IsFabs ? fcNone : fcNegInf)
5114+
: (IsFabs ? fcInf : fcPosInf);
5115+
if (Cond == ISD::SETUEQ)
5116+
Flag |= fcNan;
5117+
return DAG.getNode(ISD::IS_FPCLASS, dl, VT, Op,
5118+
DAG.getTargetConstant(Flag, dl, MVT::i32));
5119+
}
5120+
}
5121+
51075122
// If the condition is not legal, see if we can find an equivalent one
51085123
// which is legal.
51095124
if (!isCondCodeLegal(Cond, N0.getSimpleValueType())) {

llvm/test/CodeGen/PowerPC/fp-classify.ll

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,9 @@ define zeroext i1 @abs_isinff(float %x) {
1818
;
1919
; P9-LABEL: abs_isinff:
2020
; P9: # %bb.0: # %entry
21-
; P9-NEXT: addis 3, 2, .LCPI0_0@toc@ha
22-
; P9-NEXT: xsabsdp 0, 1
23-
; P9-NEXT: li 4, 1
24-
; P9-NEXT: lfs 1, .LCPI0_0@toc@l(3)
21+
; P9-NEXT: xststdcsp 0, 1, 48
2522
; P9-NEXT: li 3, 0
26-
; P9-NEXT: fcmpu 0, 0, 1
23+
; P9-NEXT: li 4, 1
2724
; P9-NEXT: iseleq 3, 4, 3
2825
; P9-NEXT: blr
2926
entry:
@@ -46,12 +43,9 @@ define zeroext i1 @abs_isinf(double %x) {
4643
;
4744
; P9-LABEL: abs_isinf:
4845
; P9: # %bb.0: # %entry
49-
; P9-NEXT: addis 3, 2, .LCPI1_0@toc@ha
50-
; P9-NEXT: xsabsdp 0, 1
51-
; P9-NEXT: li 4, 1
52-
; P9-NEXT: lfs 1, .LCPI1_0@toc@l(3)
46+
; P9-NEXT: xststdcdp 0, 1, 48
5347
; P9-NEXT: li 3, 0
54-
; P9-NEXT: fcmpu 0, 0, 1
48+
; P9-NEXT: li 4, 1
5549
; P9-NEXT: iseleq 3, 4, 3
5650
; P9-NEXT: blr
5751
entry:
@@ -91,13 +85,9 @@ define zeroext i1 @abs_isinfq(fp128 %x) {
9185
;
9286
; P9-LABEL: abs_isinfq:
9387
; P9: # %bb.0: # %entry
94-
; P9-NEXT: addis 3, 2, .LCPI2_0@toc@ha
95-
; P9-NEXT: xsabsqp 2, 2
96-
; P9-NEXT: li 4, 1
97-
; P9-NEXT: addi 3, 3, .LCPI2_0@toc@l
98-
; P9-NEXT: lxv 35, 0(3)
88+
; P9-NEXT: xststdcqp 0, 2, 48
9989
; P9-NEXT: li 3, 0
100-
; P9-NEXT: xscmpuqp 0, 2, 3
90+
; P9-NEXT: li 4, 1
10191
; P9-NEXT: iseleq 3, 4, 3
10292
; P9-NEXT: blr
10393
entry:
@@ -119,12 +109,10 @@ define zeroext i1 @abs_isinfornanf(float %x) {
119109
;
120110
; P9-LABEL: abs_isinfornanf:
121111
; P9: # %bb.0: # %entry
122-
; P9-NEXT: addis 3, 2, .LCPI3_0@toc@ha
123-
; P9-NEXT: xsabsdp 0, 1
124-
; P9-NEXT: lfs 1, .LCPI3_0@toc@l(3)
125-
; P9-NEXT: li 3, 1
126-
; P9-NEXT: fcmpu 0, 0, 1
127-
; P9-NEXT: isellt 3, 0, 3
112+
; P9-NEXT: xststdcsp 0, 1, 112
113+
; P9-NEXT: li 3, 0
114+
; P9-NEXT: li 4, 1
115+
; P9-NEXT: iseleq 3, 4, 3
128116
; P9-NEXT: blr
129117
entry:
130118
%0 = tail call float @llvm.fabs.f32(float %x)
@@ -145,12 +133,10 @@ define zeroext i1 @abs_isinfornan(double %x) {
145133
;
146134
; P9-LABEL: abs_isinfornan:
147135
; P9: # %bb.0: # %entry
148-
; P9-NEXT: addis 3, 2, .LCPI4_0@toc@ha
149-
; P9-NEXT: xsabsdp 0, 1
150-
; P9-NEXT: lfs 1, .LCPI4_0@toc@l(3)
151-
; P9-NEXT: li 3, 1
152-
; P9-NEXT: fcmpu 0, 0, 1
153-
; P9-NEXT: isellt 3, 0, 3
136+
; P9-NEXT: xststdcdp 0, 1, 112
137+
; P9-NEXT: li 3, 0
138+
; P9-NEXT: li 4, 1
139+
; P9-NEXT: iseleq 3, 4, 3
154140
; P9-NEXT: blr
155141
entry:
156142
%0 = tail call double @llvm.fabs.f64(double %x)
@@ -212,13 +198,10 @@ define zeroext i1 @abs_isinfornanq(fp128 %x) {
212198
;
213199
; P9-LABEL: abs_isinfornanq:
214200
; P9: # %bb.0: # %entry
215-
; P9-NEXT: addis 3, 2, .LCPI5_0@toc@ha
216-
; P9-NEXT: xsabsqp 2, 2
217-
; P9-NEXT: addi 3, 3, .LCPI5_0@toc@l
218-
; P9-NEXT: lxv 35, 0(3)
219-
; P9-NEXT: li 3, 1
220-
; P9-NEXT: xscmpuqp 0, 2, 3
221-
; P9-NEXT: isellt 3, 0, 3
201+
; P9-NEXT: xststdcqp 0, 2, 112
202+
; P9-NEXT: li 3, 0
203+
; P9-NEXT: li 4, 1
204+
; P9-NEXT: iseleq 3, 4, 3
222205
; P9-NEXT: blr
223206
entry:
224207
%0 = tail call fp128 @llvm.fabs.f128(fp128 %x)

llvm/test/CodeGen/PowerPC/is_fpclass.ll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,9 @@ define i1 @isinf_float(float %x) nounwind {
117117
define i1 @isinf_ppc_fp128(ppc_fp128 %x) nounwind {
118118
; CHECK-LABEL: isinf_ppc_fp128:
119119
; CHECK: # %bb.0:
120-
; CHECK-NEXT: addis 3, 2, .LCPI9_0@toc@ha
121-
; CHECK-NEXT: xsabsdp 0, 1
122-
; CHECK-NEXT: li 4, 1
123-
; CHECK-NEXT: lfs 1, .LCPI9_0@toc@l(3)
120+
; CHECK-NEXT: xststdcdp 0, 1, 48
124121
; CHECK-NEXT: li 3, 0
125-
; CHECK-NEXT: fcmpu 0, 0, 1
122+
; CHECK-NEXT: li 4, 1
126123
; CHECK-NEXT: iseleq 3, 4, 3
127124
; CHECK-NEXT: blr
128125
%1 = call i1 @llvm.is.fpclass.ppcf128(ppc_fp128 %x, i32 516) ; 0x204 = "inf"

0 commit comments

Comments
 (0)