summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/IR/ConstantRange.cpp3
-rw-r--r--llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp38
2 files changed, 12 insertions, 29 deletions
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp
index 549886271ff..0d44c3815b3 100644
--- a/llvm/lib/IR/ConstantRange.cpp
+++ b/llvm/lib/IR/ConstantRange.cpp
@@ -238,8 +238,7 @@ ConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
switch (BinOp) {
default:
- // Conservative answer: empty set
- return getEmpty(BitWidth);
+ llvm_unreachable("Unsupported binary op");
case Instruction::Add: {
if (Unsigned)
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 2c31e4aa6cd..4e4715be61a 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -400,15 +400,12 @@ static bool processSwitch(SwitchInst *SI, LazyValueInfo *LVI,
// See if we can prove that the given overflow intrinsic will not overflow.
static bool willNotOverflow(WithOverflowInst *WO, LazyValueInfo *LVI) {
- Value *RHS = WO->getRHS();
- ConstantRange RRange = LVI->getConstantRange(RHS, WO->getParent(), WO);
+ ConstantRange LRange = LVI->getConstantRange(
+ WO->getLHS(), WO->getParent(), WO);
+ ConstantRange RRange = LVI->getConstantRange(
+ WO->getRHS(), WO->getParent(), WO);
ConstantRange NWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
WO->getBinaryOp(), RRange, WO->getNoWrapKind());
- // As an optimization, do not compute LRange if we do not need it.
- if (NWRegion.isEmptySet())
- return false;
- Value *LHS = WO->getLHS();
- ConstantRange LRange = LVI->getConstantRange(LHS, WO->getParent(), WO);
return NWRegion.contains(LRange);
}
@@ -626,36 +623,23 @@ static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
Value *LHS = BinOp->getOperand(0);
Value *RHS = BinOp->getOperand(1);
+ ConstantRange LRange = LVI->getConstantRange(LHS, BB, BinOp);
ConstantRange RRange = LVI->getConstantRange(RHS, BB, BinOp);
- // Initialize LRange only if we need it. If we know that guaranteed no wrap
- // range for the given RHS range is empty don't spend time calculating the
- // range for the LHS.
- Optional<ConstantRange> LRange;
- auto LazyLRange = [&] () {
- if (!LRange)
- LRange = LVI->getConstantRange(LHS, BB, BinOp);
- return LRange.getValue();
- };
-
bool Changed = false;
if (!NUW) {
ConstantRange NUWRange = ConstantRange::makeGuaranteedNoWrapRegion(
BinOp->getOpcode(), RRange, OBO::NoUnsignedWrap);
- if (!NUWRange.isEmptySet()) {
- bool NewNUW = NUWRange.contains(LazyLRange());
- BinOp->setHasNoUnsignedWrap(NewNUW);
- Changed |= NewNUW;
- }
+ bool NewNUW = NUWRange.contains(LRange);
+ BinOp->setHasNoUnsignedWrap(NewNUW);
+ Changed |= NewNUW;
}
if (!NSW) {
ConstantRange NSWRange = ConstantRange::makeGuaranteedNoWrapRegion(
BinOp->getOpcode(), RRange, OBO::NoSignedWrap);
- if (!NSWRange.isEmptySet()) {
- bool NewNSW = NSWRange.contains(LazyLRange());
- BinOp->setHasNoSignedWrap(NewNSW);
- Changed |= NewNSW;
- }
+ bool NewNSW = NSWRange.contains(LRange);
+ BinOp->setHasNoSignedWrap(NewNSW);
+ Changed |= NewNSW;
}
return Changed;
OpenPOWER on IntegriCloud