[IRCE] Add comments, NFC.

This change adds some comments that justify why a potentially
overflowing operation is safe.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232445 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sanjoy Das 2015-03-17 00:42:16 +00:00
parent eaf8532f7a
commit 51c83cddb6

View File

@ -845,12 +845,35 @@ LoopConstrainer::calculateSubRanges() const {
const SCEV *End = SE.getSCEV(MainLoopStructure.LoopExitAt);
bool Increasing = MainLoopStructure.IndVarIncreasing;
// We compute `Smallest` and `Greatest` such that [Smallest, Greatest) is the
// range of values the induction variable takes.
const SCEV *Smallest =
Increasing ? Start : SE.getAddExpr(End, SE.getSCEV(One));
const SCEV *Greatest =
Increasing ? End : SE.getAddExpr(Start, SE.getSCEV(One));
const SCEV *Smallest = nullptr, *Greatest = nullptr;
if (Increasing) {
Smallest = Start;
Greatest = End;
} else {
// These two computations may sign-overflow. Here is why that is okay:
//
// We know that the induction variable does not sign-overflow on any
// iteration except the last one, and it starts at `Start` and ends at
// `End`, decrementing by one every time.
//
// * if `Smallest` sign-overflows we know `End` is `INT_SMAX`. Since the
// induction variable is decreasing we know that that the smallest value
// the loop body is actually executed with is `INT_SMIN` == `Smallest`.
//
// * if `Greatest` sign-overflows, we know it can only be `INT_SMIN`. In
// that case, `Clamp` will always return `Smallest` and
// [`Result.LowLimit`, `Result.HighLimit`) = [`Smallest`, `Smallest`)
// will be an empty range. Returning an empty range is always safe.
//
Smallest = SE.getAddExpr(End, SE.getSCEV(One));
Greatest = SE.getAddExpr(Start, SE.getSCEV(One));
}
auto Clamp = [this, Smallest, Greatest](const SCEV *S) {
return SE.getSMaxExpr(Smallest, SE.getSMinExpr(Greatest, S));