summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/IR/Instructions.cpp9
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp43
2 files changed, 20 insertions, 32 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 3b8d8d0c690..7d4b6df18d9 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -3149,15 +3149,18 @@ AddrSpaceCastInst::AddrSpaceCastInst(
//===----------------------------------------------------------------------===//
CmpInst::CmpInst(Type *ty, OtherOps op, Predicate predicate, Value *LHS,
- Value *RHS, const Twine &Name, Instruction *InsertBefore)
+ Value *RHS, const Twine &Name, Instruction *InsertBefore,
+ Instruction *FlagsSource)
: Instruction(ty, op,
OperandTraits<CmpInst>::op_begin(this),
OperandTraits<CmpInst>::operands(this),
InsertBefore) {
- Op<0>() = LHS;
- Op<1>() = RHS;
+ Op<0>() = LHS;
+ Op<1>() = RHS;
setPredicate((Predicate)predicate);
setName(Name);
+ if (FlagsSource)
+ copyIRFlags(FlagsSource);
}
CmpInst::CmpInst(Type *ty, OtherOps op, Predicate predicate, Value *LHS,
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 2381e26a1d8..c6dbfd92844 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5281,11 +5281,7 @@ static Instruction *foldFCmpReciprocalAndZero(FCmpInst &I, Instruction *LHSI,
if (C->isNegative())
Pred = I.getSwappedPredicate();
- // Finally emit the new fcmp.
- Value *X = LHSI->getOperand(1);
- FCmpInst *NewFCI = new FCmpInst(Pred, X, RHSC);
- NewFCI->copyFastMathFlags(&I);
- return NewFCI;
+ return new FCmpInst(Pred, LHSI->getOperand(1), RHSC, "", &I);
}
/// Optimize fabs(X) compared with zero.
@@ -5434,43 +5430,34 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
if (Instruction *Res = foldCmpLoadFromIndexedGlobal(GEP, GV, I))
return Res;
break;
- case Instruction::Call:
- if (Instruction *X = foldFabsWithFcmpZero(I))
- return X;
- break;
}
}
+ if (Instruction *R = foldFabsWithFcmpZero(I))
+ return R;
+
Value *X, *Y;
if (match(Op0, m_FNeg(m_Value(X)))) {
- if (match(Op1, m_FNeg(m_Value(Y)))) {
- // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
- Instruction *NewFCmp = new FCmpInst(I.getSwappedPredicate(), X, Y);
- NewFCmp->copyFastMathFlags(&I);
- return NewFCmp;
- }
+ // fcmp pred (fneg X), (fneg Y) -> fcmp swap(pred) X, Y
+ if (match(Op1, m_FNeg(m_Value(Y))))
+ return new FCmpInst(I.getSwappedPredicate(), X, Y, "", &I);
+ // fcmp pred (fneg X), C --> fcmp swap(pred) X, -C
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;
+ return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
}
}
if (match(Op0, m_FPExt(m_Value(X)))) {
- if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType()) {
- // fcmp (fpext X), (fpext Y) -> fcmp X, Y
- Instruction *NewFCmp = new FCmpInst(Pred, X, Y);
- NewFCmp->copyFastMathFlags(&I);
- return NewFCmp;
- }
+ // fcmp (fpext X), (fpext Y) -> fcmp X, Y
+ if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())
+ return new FCmpInst(Pred, X, Y, "", &I);
+ // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
const APFloat *C;
if (match(Op1, m_APFloat(C))) {
- // fcmp (fpext X), C -> fcmp X, (fptrunc C) if fptrunc is lossless
const fltSemantics &FPSem =
X->getType()->getScalarType()->getFltSemantics();
bool Lossy;
@@ -5485,9 +5472,7 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
((Fabs.compare(APFloat::getSmallestNormalized(FPSem)) !=
APFloat::cmpLessThan) || Fabs.isZero())) {
Constant *NewC = ConstantFP::get(X->getType(), TruncC);
- Instruction *NewFCmp = new FCmpInst(Pred, X, NewC);
- NewFCmp->copyFastMathFlags(&I);
- return NewFCmp;
+ return new FCmpInst(Pred, X, NewC, "", &I);
}
}
}
OpenPOWER on IntegriCloud