summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2015-03-24 19:29:18 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2015-03-24 19:29:18 +0000
commit337d46b36f619233309a1c3a148cfdbdebf96573 (patch)
tree95cee9b2987efe008c9c07a845c6286d42493ed3 /llvm/lib/Transforms
parent99d246d7d79603426a87fe89817f03c1c44f51b9 (diff)
downloadbcm5719-llvm-337d46b36f619233309a1c3a148cfdbdebf96573.tar.gz
bcm5719-llvm-337d46b36f619233309a1c3a148cfdbdebf96573.zip
[IRCE] Fix a regression introduced in r232444.
IRCE should not try to eliminate range checks that check an induction variable against a loop-varying length. llvm-svn: 233101
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index aa3a029fc88..a7c02433d37 100644
--- a/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -122,8 +122,9 @@ class InductiveRangeCheck {
BranchInst *Branch;
RangeCheckKind Kind;
- static RangeCheckKind parseRangeCheckICmp(ICmpInst *ICI, ScalarEvolution &SE,
- Value *&Index, Value *&Length);
+ static RangeCheckKind parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
+ ScalarEvolution &SE, Value *&Index,
+ Value *&Length);
static InductiveRangeCheck::RangeCheckKind
parseRangeCheck(Loop *L, ScalarEvolution &SE, Value *Condition,
@@ -255,8 +256,18 @@ const char *InductiveRangeCheck::rangeCheckKindToStr(
/// RANGE_CHECK_UPPER.
///
InductiveRangeCheck::RangeCheckKind
-InductiveRangeCheck::parseRangeCheckICmp(ICmpInst *ICI, ScalarEvolution &SE,
- Value *&Index, Value *&Length) {
+InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
+ ScalarEvolution &SE, Value *&Index,
+ Value *&Length) {
+
+ auto IsNonNegativeAndNotLoopVarying = [&SE, L](Value *V) {
+ const SCEV *S = SE.getSCEV(V);
+ if (isa<SCEVCouldNotCompute>(S))
+ return false;
+
+ return SE.getLoopDisposition(S, L) == ScalarEvolution::LoopInvariant &&
+ SE.isKnownNonNegative(S);
+ };
using namespace llvm::PatternMatch;
@@ -287,7 +298,7 @@ InductiveRangeCheck::parseRangeCheckICmp(ICmpInst *ICI, ScalarEvolution &SE,
return RANGE_CHECK_LOWER;
}
- if (SE.isKnownNonNegative(SE.getSCEV(LHS))) {
+ if (IsNonNegativeAndNotLoopVarying(LHS)) {
Index = RHS;
Length = LHS;
return RANGE_CHECK_UPPER;
@@ -298,7 +309,7 @@ InductiveRangeCheck::parseRangeCheckICmp(ICmpInst *ICI, ScalarEvolution &SE,
std::swap(LHS, RHS);
// fallthrough
case ICmpInst::ICMP_UGT:
- if (SE.isKnownNonNegative(SE.getSCEV(LHS))) {
+ if (IsNonNegativeAndNotLoopVarying(LHS)) {
Index = RHS;
Length = LHS;
return RANGE_CHECK_BOTH;
@@ -328,8 +339,8 @@ InductiveRangeCheck::parseRangeCheck(Loop *L, ScalarEvolution &SE,
if (!ICmpA || !ICmpB)
return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
- auto RCKindA = parseRangeCheckICmp(ICmpA, SE, IndexA, LengthA);
- auto RCKindB = parseRangeCheckICmp(ICmpB, SE, IndexB, LengthB);
+ auto RCKindA = parseRangeCheckICmp(L, ICmpA, SE, IndexA, LengthA);
+ auto RCKindB = parseRangeCheckICmp(L, ICmpB, SE, IndexB, LengthB);
if (RCKindA == InductiveRangeCheck::RANGE_CHECK_UNKNOWN ||
RCKindB == InductiveRangeCheck::RANGE_CHECK_UNKNOWN)
@@ -353,7 +364,7 @@ InductiveRangeCheck::parseRangeCheck(Loop *L, ScalarEvolution &SE,
if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) {
Value *IndexVal = nullptr;
- auto RCKind = parseRangeCheckICmp(ICI, SE, IndexVal, Length);
+ auto RCKind = parseRangeCheckICmp(L, ICI, SE, IndexVal, Length);
if (RCKind == InductiveRangeCheck::RANGE_CHECK_UNKNOWN)
return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
OpenPOWER on IntegriCloud