diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/ConstantRange.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp | 38 |
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; |

