mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
[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:
parent
eaf8532f7a
commit
51c83cddb6
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user