diff options
author | Andrew Trick <atrick@apple.com> | 2013-10-22 05:09:40 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2013-10-22 05:09:40 +0000 |
commit | 78fe4d62fb12fd3d77cac4d26ec1ab2010aace12 (patch) | |
tree | bbbd2f96a8ac725bae011a908e80e4dd2ea7981d | |
parent | fc678719d935ffb893a3e08905f0d00b649f9d4f (diff) | |
download | external_llvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.zip external_llvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.tar.gz external_llvm-78fe4d62fb12fd3d77cac4d26ec1ab2010aace12.tar.bz2 |
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.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 0512429..ca959ab 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 |