aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ScalarEvolution.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-07-22 20:47:55 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-07-22 20:47:55 +0000
commit095f5b204ffafd65c919f5bf35d869a08d97e3d1 (patch)
tree130e304e2dba5b578ff67e98f7938f98dabdbe3b /llvm/lib/Analysis/ScalarEvolution.cpp
parent859278005dc06d344436700357ee674dcc426410 (diff)
downloadllvm-095f5b204ffafd65c919f5bf35d869a08d97e3d1.zip
llvm-095f5b204ffafd65c919f5bf35d869a08d97e3d1.tar.gz
llvm-095f5b204ffafd65c919f5bf35d869a08d97e3d1.tar.bz2
[SCEV] Extract out a helper function; NFC
The helper will get smarter in a later change, but right now this is just code reorganization. llvm-svn: 276467
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 32eda3f..ce99f82 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8578,6 +8578,16 @@ ScalarEvolution::isImpliedCondOperandsHelper(ICmpInst::Predicate Pred,
return false;
}
+Optional<APInt> ScalarEvolution::getConstantDifference(const SCEV *LHS,
+ const SCEV *RHS) {
+ if (const SCEVAddExpr *AddLHS = dyn_cast<SCEVAddExpr>(LHS))
+ if (AddLHS->getOperand(1) == RHS)
+ if (auto *Addend = dyn_cast<SCEVConstant>(AddLHS->getOperand(0)))
+ return Addend->getAPInt();
+
+ return None;
+}
+
bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
const SCEV *LHS,
const SCEV *RHS,
@@ -8588,9 +8598,8 @@ bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
// reduce the compile time impact of this optimization.
return false;
- const SCEVAddExpr *AddLHS = dyn_cast<SCEVAddExpr>(LHS);
- if (!AddLHS || AddLHS->getOperand(1) != FoundLHS ||
- !isa<SCEVConstant>(AddLHS->getOperand(0)))
+ Optional<APInt> Addend = getConstantDifference(LHS, FoundLHS);
+ if (!Addend)
return false;
APInt ConstFoundRHS = cast<SCEVConstant>(FoundRHS)->getAPInt();
@@ -8600,10 +8609,8 @@ bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
ConstantRange FoundLHSRange =
ConstantRange::makeAllowedICmpRegion(Pred, ConstFoundRHS);
- // Since `LHS` is `FoundLHS` + `AddLHS->getOperand(0)`, we can compute a range
- // for `LHS`:
- APInt Addend = cast<SCEVConstant>(AddLHS->getOperand(0))->getAPInt();
- ConstantRange LHSRange = FoundLHSRange.add(ConstantRange(Addend));
+ // Since `LHS` is `FoundLHS` + `Addend`, we can compute a range for `LHS`:
+ ConstantRange LHSRange = FoundLHSRange.add(ConstantRange(*Addend));
// We can also compute the range of values for `LHS` that satisfy the
// consequent, "`LHS` `Pred` `RHS`":