Skip to content

Commit e09b7dc

Browse files
committedMar 30, 2018
[SelectionDAG] Removing FABS folding from DAGCombiner
The code has bugs dealing with -0.0. Since D44550 introduced FABS pattern folding in InstCombine, this patch removes the now-redundant code that causes https://bugs.llvm.org/show_bug.cgi?id=36600. Patch by Mikhail Dvoretckii! Differential Revision: https://reviews.llvm.org/D44683 llvm-svn: 328872
1 parent 4dc1cdc commit e09b7dc

File tree

3 files changed

+12
-72
lines changed

3 files changed

+12
-72
lines changed
 

‎llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

-18
Original file line numberDiff line numberDiff line change
@@ -16854,24 +16854,6 @@ SDValue DAGCombiner::SimplifySelectCC(const SDLoc &DL, SDValue N0, SDValue N1,
1685416854
return !SCCC->isNullValue() ? N2 : N3;
1685516855
}
1685616856

16857-
// Check to see if we can simplify the select into an fabs node
16858-
if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1)) {
16859-
// Allow either -0.0 or 0.0
16860-
if (CFP->isZero()) {
16861-
// select (setg[te] X, +/-0.0), X, fneg(X) -> fabs
16862-
if ((CC == ISD::SETGE || CC == ISD::SETGT) &&
16863-
N0 == N2 && N3.getOpcode() == ISD::FNEG &&
16864-
N2 == N3.getOperand(0))
16865-
return DAG.getNode(ISD::FABS, DL, VT, N0);
16866-
16867-
// select (setl[te] X, +/-0.0), fneg(X), X -> fabs
16868-
if ((CC == ISD::SETLT || CC == ISD::SETLE) &&
16869-
N0 == N3 && N2.getOpcode() == ISD::FNEG &&
16870-
N2.getOperand(0) == N3)
16871-
return DAG.getNode(ISD::FABS, DL, VT, N3);
16872-
}
16873-
}
16874-
1687516857
// Turn "(a cond b) ? 1.0f : 2.0f" into "load (tmp + ((a cond b) ? 0 : 4)"
1687616858
// where "tmp" is a constant pool entry containing an array with 1.0 and 2.0
1687716859
// in it. This is a win when the constant is not otherwise available because

‎llvm/test/CodeGen/AArch64/fabs.ll

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s
33

4-
; FIXME:
5-
; PR36600: https://bugs.llvm.org/show_bug.cgi?id=36600
4+
; Test against PR36600: https://bugs.llvm.org/show_bug.cgi?id=36600
65
; This is not fabs. If X = -0.0, it should return -0.0 not 0.0.
76

87
define double @not_fabs(double %x) #0 {
98
; CHECK-LABEL: not_fabs:
109
; CHECK: // %bb.0:
11-
; CHECK-NEXT: fabs d0, d0
10+
; CHECK-NEXT: fneg d1, d0
11+
; CHECK-NEXT: fcmp d0, #0.0
12+
; CHECK-NEXT: fcsel d0, d1, d0, le
1213
; CHECK-NEXT: ret
1314
%cmp = fcmp nnan ole double %x, 0.0
1415
%sub = fsub nnan double -0.0, %x
@@ -21,7 +22,11 @@ define double @not_fabs(double %x) #0 {
2122
define float @still_not_fabs(float %x) #0 {
2223
; CHECK-LABEL: still_not_fabs:
2324
; CHECK: // %bb.0:
24-
; CHECK-NEXT: fabs s0, s0
25+
; CHECK-NEXT: adrp x8, .LCPI1_0
26+
; CHECK-NEXT: ldr s1, [x8, :lo12:.LCPI1_0]
27+
; CHECK-NEXT: fneg s2, s0
28+
; CHECK-NEXT: fcmp s0, s1
29+
; CHECK-NEXT: fcsel s0, s0, s2, ge
2530
; CHECK-NEXT: ret
2631
%cmp = fcmp nnan oge float %x, -0.0
2732
%sub = fsub nnan float -0.0, %x

‎llvm/test/CodeGen/X86/fabs.ll

+3-50
Original file line numberDiff line numberDiff line change
@@ -27,67 +27,20 @@ define float @test1(float %X) {
2727
ret float %Y
2828
}
2929

30-
define double @test2(double %X) {
30+
define x86_fp80 @test2(x86_fp80 %X) {
3131
; X87-LABEL: test2:
3232
; X87: # %bb.0:
33-
; X87-NEXT: fldl {{[0-9]+}}(%esp)
34-
; X87-NEXT: fldz
35-
; X87-NEXT: fchs
36-
; X87-NEXT: fxch %st(1)
37-
; X87-NEXT: fucom %st(1)
38-
; X87-NEXT: fstp %st(1)
39-
; X87-NEXT: fnstsw %ax
40-
; X87-NEXT: # kill: def $ah killed $ah killed $ax
41-
; X87-NEXT: sahf
42-
; X87-NEXT: fld %st(0)
43-
; X87-NEXT: fchs
44-
; X87-NEXT: jae .LBB1_2
45-
; X87-NEXT: # %bb.1:
46-
; X87-NEXT: fstp %st(1)
47-
; X87-NEXT: fldz
48-
; X87-NEXT: .LBB1_2:
49-
; X87-NEXT: fstp %st(0)
50-
; X87-NEXT: retl
51-
;
52-
; X87UNSAFE-LABEL: test2:
53-
; X87UNSAFE: # %bb.0:
54-
; X87UNSAFE-NEXT: fldl {{[0-9]+}}(%esp)
55-
; X87UNSAFE-NEXT: fabs
56-
; X87UNSAFE-NEXT: retl
57-
;
58-
; X64-LABEL: test2:
59-
; X64: # %bb.0:
60-
; X64-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
61-
; X64-NEXT: movapd %xmm1, %xmm2
62-
; X64-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm1[0]
63-
; X64-NEXT: xorpd %xmm0, %xmm2
64-
; X64-NEXT: cmplesd %xmm0, %xmm1
65-
; X64-NEXT: movapd %xmm1, %xmm3
66-
; X64-NEXT: andnpd %xmm2, %xmm3
67-
; X64-NEXT: andpd %xmm0, %xmm1
68-
; X64-NEXT: orpd %xmm3, %xmm1
69-
; X64-NEXT: movapd %xmm1, %xmm0
70-
; X64-NEXT: retq
71-
%Y = fcmp oge double %X, -0.0
72-
%Z = fsub double -0.0, %X
73-
%Q = select i1 %Y, double %X, double %Z
74-
ret double %Q
75-
}
76-
77-
define x86_fp80 @test3(x86_fp80 %X) {
78-
; X87-LABEL: test3:
79-
; X87: # %bb.0:
8033
; X87-NEXT: fldt {{[0-9]+}}(%esp)
8134
; X87-NEXT: fabs
8235
; X87-NEXT: retl
8336
;
84-
; X87UNSAFE-LABEL: test3:
37+
; X87UNSAFE-LABEL: test2:
8538
; X87UNSAFE: # %bb.0:
8639
; X87UNSAFE-NEXT: fldt {{[0-9]+}}(%esp)
8740
; X87UNSAFE-NEXT: fabs
8841
; X87UNSAFE-NEXT: retl
8942
;
90-
; X64-LABEL: test3:
43+
; X64-LABEL: test2:
9144
; X64: # %bb.0:
9245
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
9346
; X64-NEXT: fabs

0 commit comments

Comments
 (0)
Please sign in to comment.