summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2013-10-22 05:09:40 +0000
committerAndrew Trick <atrick@apple.com>2013-10-22 05:09:40 +0000
commit78fe4d62fb12fd3d77cac4d26ec1ab2010aace12 (patch)
treebbbd2f96a8ac725bae011a908e80e4dd2ea7981d
parentfc678719d935ffb893a3e08905f0d00b649f9d4f (diff)
downloadllvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.tar.gz
llvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.tar.bz2
llvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.tar.xz
Clarify SCEV comments.
We handle for(i=n; i>0; i -= s) by canonicalizing within SCEV to for(i=-n; i<0; i += s). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193147 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/ScalarEvolution.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 0512429ad8..ca959ab437 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -6394,11 +6394,14 @@ ScalarEvolution::HowManyLessThans(const SCEV *LHS, const SCEV *RHS,
// With unit stride, the iteration never steps past the limit value.
} else if (isKnownPositive(Step)) {
// Test whether a positive iteration can step past the limit value and
- // past the maximum value for its type in a single step. The NSW/NUW flags
- // can imply that stepping past RHS would immediately result in undefined
- // behavior. No self-wrap is not useful here because the loop counter may
- // signed or unsigned wrap but continue iterating and terminate with
- // defined behavior without ever self-wrapping.
+ // past the maximum value for its type in a single step. Constant negative
+ // stride should be rare because LHS > RHS comparisons are canonicalized
+ // to -LHS < -RHS.
+ //
+ // NSW/NUW flags imply that stepping past RHS would immediately result in
+ // undefined behavior. No self-wrap is not useful here because the loop
+ // counter may signed or unsigned wrap but continue iterating and
+ // terminate with defined behavior without ever self-wrapping.
const SCEV *One = getConstant(Step->getType(), 1);
if (isSigned) {
if (!AddRec->getNoWrapFlags(SCEV::FlagNSW)) {
@@ -6413,10 +6416,10 @@ ScalarEvolution::HowManyLessThans(const SCEV *LHS, const SCEV *RHS,
.ult(getUnsignedRange(RHS).getUnsignedMax()))
return getCouldNotCompute();
}
- } else
- // TODO: Handle negative strides here and below.
+ } else {
+ // Cannot handle variable stride.
return getCouldNotCompute();
-
+ }
// We know the LHS is of the form {n,+,s} and the RHS is some loop-invariant
// m. So, we count the number of iterations in which {n,+,s} < m is true.
// Note that we cannot simply return max(m-n,0)/s because it's not safe to