[llvm] r346234 - [InstCombine] propagate fast-math-flags when folding fcmp+fneg

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 6 07:49:45 PST 2018


Author: spatel
Date: Tue Nov  6 07:49:45 2018
New Revision: 346234

URL: http://llvm.org/viewvc/llvm-project?rev=346234&view=rev
Log:
[InstCombine] propagate fast-math-flags when folding fcmp+fneg

This is another part of solving PR39475:
https://bugs.llvm.org/show_bug.cgi?id=39475

This might be enough to fix that particular issue, but as noted
with the FIXME, we're still dropping FMF on other folds around here.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
    llvm/trunk/test/Transforms/InstCombine/fcmp.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=346234&r1=346233&r2=346234&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Tue Nov  6 07:49:45 2018
@@ -5445,14 +5445,6 @@ Instruction *InstCombiner::visitFCmpInst
       if (Instruction *NV = foldFCmpIntToFPConst(I, LHSI, RHSC))
         return NV;
       break;
-    case Instruction::FSub: {
-      // fcmp pred (fneg x), C -> fcmp swap(pred) x, -C
-      Value *Op;
-      if (match(LHSI, m_FNeg(m_Value(Op))))
-        return new FCmpInst(I.getSwappedPredicate(), Op,
-                            ConstantExpr::getFNeg(RHSC));
-      break;
-    }
     case Instruction::FDiv:
       if (Instruction *NV = foldFCmpReciprocalAndZero(I, LHSI, RHSC))
         return NV;
@@ -5472,10 +5464,23 @@ Instruction *InstCombiner::visitFCmpInst
   }
   }
 
-  // fcmp pred (fneg x), (fneg y) -> fcmp swap(pred) x, y
   Value *X, *Y;
-  if (match(Op0, m_FNeg(m_Value(X))) && match(Op1, m_FNeg(m_Value(Y))))
-    return new FCmpInst(I.getSwappedPredicate(), X, Y);
+  if (match(Op0, m_FNeg(m_Value(X)))) {
+    if (match(Op1, m_FNeg(m_Value(Y)))) {
+      // FIXME: Drops FMF.
+      // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
+      return new FCmpInst(I.getSwappedPredicate(), X, Y);
+    }
+
+    Constant *C;
+    if (match(Op1, m_Constant(C))) {
+      // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
+      Constant *NegC = ConstantExpr::getFNeg(C);
+      Instruction *NewFCmp = new FCmpInst(I.getSwappedPredicate(), X, NegC);
+      NewFCmp->copyFastMathFlags(&I);
+      return NewFCmp;
+    }
+  }
 
   // fcmp (fpext x), (fpext y) -> fcmp x, y
   if (FPExtInst *LHSExt = dyn_cast<FPExtInst>(Op0))

Modified: llvm/trunk/test/Transforms/InstCombine/fcmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fcmp.ll?rev=346234&r1=346233&r2=346234&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fcmp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fcmp.ll Tue Nov  6 07:49:45 2018
@@ -82,7 +82,7 @@ define <2 x i1> @fneg_constant_swap_pred
 
 define i1 @fneg_fmf(float %x) {
 ; CHECK-LABEL: @fneg_fmf(
-; CHECK-NEXT:    [[R:%.*]] = fcmp oeq float [[X:%.*]], -4.200000e+01
+; CHECK-NEXT:    [[R:%.*]] = fcmp fast oeq float [[X:%.*]], -4.200000e+01
 ; CHECK-NEXT:    ret i1 [[R]]
 ;
   %n = fsub fast float -0.0, %x
@@ -94,7 +94,7 @@ define i1 @fneg_fmf(float %x) {
 
 define <2 x i1> @fcmp_fneg_fmf_vec(<2 x float> %x) {
 ; CHECK-LABEL: @fcmp_fneg_fmf_vec(
-; CHECK-NEXT:    [[R:%.*]] = fcmp ule <2 x float> [[X:%.*]], <float -4.200000e+01, float 1.900000e+01>
+; CHECK-NEXT:    [[R:%.*]] = fcmp reassoc nnan ule <2 x float> [[X:%.*]], <float -4.200000e+01, float 1.900000e+01>
 ; CHECK-NEXT:    ret <2 x i1> [[R]]
 ;
   %n = fsub nsz <2 x float> zeroinitializer, %x




More information about the llvm-commits mailing list