diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-03-24 19:29:18 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-03-24 19:29:18 +0000 |
commit | 337d46b36f619233309a1c3a148cfdbdebf96573 (patch) | |
tree | 95cee9b2987efe008c9c07a845c6286d42493ed3 /llvm/lib/Transforms | |
parent | 99d246d7d79603426a87fe89817f03c1c44f51b9 (diff) | |
download | bcm5719-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.cpp | 29 |
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; |