mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
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
This commit is contained in:
parent
fc678719d9
commit
78fe4d62fb
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user