From b43581e7084b33fa4f41a638e9d1996b134cea20 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 May 2019 14:11:55 +0000 Subject: [PATCH] [CVP] Remove unnecessary checks for empty GNWR; NFC The guaranteed no-wrap region is never empty, it always contains at least zero, so these optimizations don't ever apply. To make this more obviously true, replace the conversative return in makeGNWR with an assertion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361698 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/ConstantRange.cpp | 3 +- .../Scalar/CorrelatedValuePropagation.cpp | 38 ++++++------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/lib/IR/ConstantRange.cpp b/lib/IR/ConstantRange.cpp index 549886271ff..0d44c3815b3 100644 --- a/lib/IR/ConstantRange.cpp +++ b/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/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp index 2c31e4aa6cd..4e4715be61a 100644 --- a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp +++ b/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 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; -- 2.40.0