summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2015-03-17 00:42:16 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2015-03-17 00:42:16 +0000
commit7a0b7f5996cbce5a204754a60d5cb12df69a28fe (patch)
treec3c12aca4463d8e90b53c4370c9392d2da147d44
parente2cde6f195914c19f2c1e1e8c6d34a539c95c7f7 (diff)
downloadbcm5719-llvm-7a0b7f5996cbce5a204754a60d5cb12df69a28fe.tar.gz
bcm5719-llvm-7a0b7f5996cbce5a204754a60d5cb12df69a28fe.zip
[IRCE] Add comments, NFC.
This change adds some comments that justify why a potentially overflowing operation is safe. llvm-svn: 232445
-rw-r--r--llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index 0429aeeb49e..22ce7119cb7 100644
--- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -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));
OpenPOWER on IntegriCloud