[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