[llvm] r328872 - [SelectionDAG] Removing FABS folding from DAGCombiner

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 30 08:42:52 PDT 2018


Author: spatel
Date: Fri Mar 30 08:42:52 2018
New Revision: 328872

URL: http://llvm.org/viewvc/llvm-project?rev=328872&view=rev
Log:
[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


Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
    llvm/trunk/test/CodeGen/AArch64/fabs.ll
    llvm/trunk/test/CodeGen/X86/fabs.ll

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=328872&r1=328871&r2=328872&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Mar 30 08:42:52 2018
@@ -16854,24 +16854,6 @@ SDValue DAGCombiner::SimplifySelectCC(co
     return !SCCC->isNullValue() ? N2 : N3;
   }
 
-  // Check to see if we can simplify the select into an fabs node
-  if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N1)) {
-    // Allow either -0.0 or 0.0
-    if (CFP->isZero()) {
-      // select (setg[te] X, +/-0.0), X, fneg(X) -> fabs
-      if ((CC == ISD::SETGE || CC == ISD::SETGT) &&
-          N0 == N2 && N3.getOpcode() == ISD::FNEG &&
-          N2 == N3.getOperand(0))
-        return DAG.getNode(ISD::FABS, DL, VT, N0);
-
-      // select (setl[te] X, +/-0.0), fneg(X), X -> fabs
-      if ((CC == ISD::SETLT || CC == ISD::SETLE) &&
-          N0 == N3 && N2.getOpcode() == ISD::FNEG &&
-          N2.getOperand(0) == N3)
-        return DAG.getNode(ISD::FABS, DL, VT, N3);
-    }
-  }
-
   // Turn "(a cond b) ? 1.0f : 2.0f" into "load (tmp + ((a cond b) ? 0 : 4)"
   // where "tmp" is a constant pool entry containing an array with 1.0 and 2.0
   // in it.  This is a win when the constant is not otherwise available because

Modified: llvm/trunk/test/CodeGen/AArch64/fabs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/fabs.ll?rev=328872&r1=328871&r2=328872&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/fabs.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/fabs.ll Fri Mar 30 08:42:52 2018
@@ -1,14 +1,15 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s
 
-; FIXME:
-; PR36600: https://bugs.llvm.org/show_bug.cgi?id=36600
+; Test against PR36600: https://bugs.llvm.org/show_bug.cgi?id=36600
 ; This is not fabs. If X = -0.0, it should return -0.0 not 0.0.
 
 define double @not_fabs(double %x) #0 {
 ; CHECK-LABEL: not_fabs:
 ; CHECK:       // %bb.0:
-; CHECK-NEXT:    fabs d0, d0
+; CHECK-NEXT:    fneg d1, d0
+; CHECK-NEXT:    fcmp d0, #0.0
+; CHECK-NEXT:    fcsel d0, d1, d0, le
 ; CHECK-NEXT:    ret
   %cmp = fcmp nnan ole double %x, 0.0
   %sub = fsub nnan double -0.0, %x
@@ -21,7 +22,11 @@ define double @not_fabs(double %x) #0 {
 define float @still_not_fabs(float %x) #0 {
 ; CHECK-LABEL: still_not_fabs:
 ; CHECK:       // %bb.0:
-; CHECK-NEXT:    fabs s0, s0
+; CHECK-NEXT:    adrp x8, .LCPI1_0
+; CHECK-NEXT:    ldr s1, [x8, :lo12:.LCPI1_0]
+; CHECK-NEXT:    fneg s2, s0
+; CHECK-NEXT:    fcmp s0, s1
+; CHECK-NEXT:    fcsel s0, s0, s2, ge
 ; CHECK-NEXT:    ret
   %cmp = fcmp nnan oge float %x, -0.0
   %sub = fsub nnan float -0.0, %x

Modified: llvm/trunk/test/CodeGen/X86/fabs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fabs.ll?rev=328872&r1=328871&r2=328872&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fabs.ll (original)
+++ llvm/trunk/test/CodeGen/X86/fabs.ll Fri Mar 30 08:42:52 2018
@@ -27,67 +27,20 @@ define float @test1(float %X) {
   ret float %Y
 }
 
-define double @test2(double %X) {
+define x86_fp80 @test2(x86_fp80 %X) {
 ; X87-LABEL: test2:
 ; X87:       # %bb.0:
-; X87-NEXT:    fldl {{[0-9]+}}(%esp)
-; X87-NEXT:    fldz
-; X87-NEXT:    fchs
-; X87-NEXT:    fxch %st(1)
-; X87-NEXT:    fucom %st(1)
-; X87-NEXT:    fstp %st(1)
-; X87-NEXT:    fnstsw %ax
-; X87-NEXT:    # kill: def $ah killed $ah killed $ax
-; X87-NEXT:    sahf
-; X87-NEXT:    fld %st(0)
-; X87-NEXT:    fchs
-; X87-NEXT:    jae .LBB1_2
-; X87-NEXT:  # %bb.1:
-; X87-NEXT:    fstp %st(1)
-; X87-NEXT:    fldz
-; X87-NEXT:  .LBB1_2:
-; X87-NEXT:    fstp %st(0)
-; X87-NEXT:    retl
-;
-; X87UNSAFE-LABEL: test2:
-; X87UNSAFE:       # %bb.0:
-; X87UNSAFE-NEXT:    fldl {{[0-9]+}}(%esp)
-; X87UNSAFE-NEXT:    fabs
-; X87UNSAFE-NEXT:    retl
-;
-; X64-LABEL: test2:
-; X64:       # %bb.0:
-; X64-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
-; X64-NEXT:    movapd %xmm1, %xmm2
-; X64-NEXT:    unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm1[0]
-; X64-NEXT:    xorpd %xmm0, %xmm2
-; X64-NEXT:    cmplesd %xmm0, %xmm1
-; X64-NEXT:    movapd %xmm1, %xmm3
-; X64-NEXT:    andnpd %xmm2, %xmm3
-; X64-NEXT:    andpd %xmm0, %xmm1
-; X64-NEXT:    orpd %xmm3, %xmm1
-; X64-NEXT:    movapd %xmm1, %xmm0
-; X64-NEXT:    retq
-  %Y = fcmp oge double %X, -0.0
-  %Z = fsub double -0.0, %X
-  %Q = select i1 %Y, double %X, double %Z
-  ret double %Q
-}
-
-define x86_fp80 @test3(x86_fp80 %X) {
-; X87-LABEL: test3:
-; X87:       # %bb.0:
 ; X87-NEXT:    fldt {{[0-9]+}}(%esp)
 ; X87-NEXT:    fabs
 ; X87-NEXT:    retl
 ;
-; X87UNSAFE-LABEL: test3:
+; X87UNSAFE-LABEL: test2:
 ; X87UNSAFE:       # %bb.0:
 ; X87UNSAFE-NEXT:    fldt {{[0-9]+}}(%esp)
 ; X87UNSAFE-NEXT:    fabs
 ; X87UNSAFE-NEXT:    retl
 ;
-; X64-LABEL: test3:
+; X64-LABEL: test2:
 ; X64:       # %bb.0:
 ; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
 ; X64-NEXT:    fabs




More information about the llvm-commits mailing list