summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 059f7523ff9..1946f8903b1 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5445,14 +5445,6 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
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(FCmpInst &I) {
}
}
- // 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))
OpenPOWER on IntegriCloud