diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-07-22 20:47:55 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-07-22 20:47:55 +0000 |
commit | 095f5b204ffafd65c919f5bf35d869a08d97e3d1 (patch) | |
tree | 130e304e2dba5b578ff67e98f7938f98dabdbe3b /llvm/lib/Analysis/ScalarEvolution.cpp | |
parent | 859278005dc06d344436700357ee674dcc426410 (diff) | |
download | llvm-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.cpp | 21 |
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`": |