1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[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.

llvm-svn: 361698
This commit is contained in:
Nikita Popov 2019-05-25 14:11:55 +00:00
parent f5a3cdd398
commit 2301567c31
2 changed files with 12 additions and 29 deletions

View File

@ -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)

View File

@ -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;