[llvm] r270802 - [IRCE] Refactor out a parseRangeCheckFromCond; NFC
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed May 25 17:08:44 PDT 2016
Author: sanjoy
Date: Wed May 25 19:08:24 2016
New Revision: 270802
URL: http://llvm.org/viewvc/llvm-project?rev=270802&view=rev
Log:
[IRCE] Refactor out a parseRangeCheckFromCond; NFC
This will later hold more general logic to parse conjunctions of range
checks.
Modified:
llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp?rev=270802&r1=270801&r2=270802&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp Wed May 25 19:08:24 2016
@@ -125,9 +125,8 @@ class InductiveRangeCheck {
ScalarEvolution &SE, Value *&Index,
Value *&Length);
- static InductiveRangeCheck::RangeCheckKind
- parseRangeCheck(Loop *L, ScalarEvolution &SE, Value *Condition,
- Value *&Index, Value *&UpperLimit);
+ static Optional<InductiveRangeCheck>
+ parseRangeCheckFromCond(Loop *L, ScalarEvolution &SE, Use &ConditionUse);
InductiveRangeCheck()
: Offset(nullptr), Scale(nullptr), Length(nullptr),
@@ -313,14 +312,17 @@ InductiveRangeCheck::parseRangeCheckICmp
llvm_unreachable("default clause returns!");
}
-/// Parses an arbitrary condition into a range check. `Length` is set only if
-/// the range check is recognized to be `RANGE_CHECK_UPPER` or stronger.
-InductiveRangeCheck::RangeCheckKind
-InductiveRangeCheck::parseRangeCheck(Loop *L, ScalarEvolution &SE,
- Value *Condition, Value *&Index,
- Value *&Length) {
+/// Parses an arbitrary condition into an inductive range check.
+Optional<InductiveRangeCheck>
+InductiveRangeCheck::parseRangeCheckFromCond(Loop *L, ScalarEvolution &SE,
+ Use &ConditionUse) {
using namespace llvm::PatternMatch;
+ Value *Condition = ConditionUse.get();
+
+ Value *Length, *Index;
+ InductiveRangeCheck::RangeCheckKind RCKind;
+
Value *A = nullptr;
Value *B = nullptr;
@@ -330,31 +332,42 @@ InductiveRangeCheck::parseRangeCheck(Loo
ICmpInst *ICmpA = dyn_cast<ICmpInst>(A), *ICmpB = dyn_cast<ICmpInst>(B);
if (!ICmpA || !ICmpB)
- return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
+ return None;
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)
- return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
-
- if (IndexA != IndexB)
- return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
-
- if (LengthA != nullptr && LengthB != nullptr && LengthA != LengthB)
- return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
+ RCKindB == InductiveRangeCheck::RANGE_CHECK_UNKNOWN ||
+ IndexA != IndexB ||
+ (LengthA != nullptr && LengthB != nullptr && LengthA != LengthB))
+ return None;
Index = IndexA;
Length = LengthA == nullptr ? LengthB : LengthA;
-
- return (InductiveRangeCheck::RangeCheckKind)(RCKindA | RCKindB);
+ RCKind = (InductiveRangeCheck::RangeCheckKind)(RCKindA | RCKindB);
+ } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) {
+ RCKind = parseRangeCheckICmp(L, ICI, SE, Index, Length);
+ if (RCKind == InductiveRangeCheck::RANGE_CHECK_UNKNOWN)
+ return None;
+ } else {
+ return None;
}
- if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition))
- return parseRangeCheckICmp(L, ICI, SE, Index, Length);
+ const auto *IndexAddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(Index));
+ bool IsAffineIndex =
+ IndexAddRec && (IndexAddRec->getLoop() == L) && IndexAddRec->isAffine();
- return InductiveRangeCheck::RANGE_CHECK_UNKNOWN;
+ if (!IsAffineIndex)
+ return None;
+
+ InductiveRangeCheck IRC;
+ IRC.Length = Length;
+ IRC.Offset = IndexAddRec->getStart();
+ IRC.Scale = IndexAddRec->getStepRecurrence(SE);
+ IRC.CheckUse = &ConditionUse;
+ IRC.Kind = RCKind;
+ return IRC;
}
Optional<InductiveRangeCheck>
@@ -366,35 +379,11 @@ InductiveRangeCheck::create(BranchInst *
BranchProbability LikelyTaken(15, 16);
- if (BPI.getEdgeProbability(BI->getParent(), (unsigned) 0) < LikelyTaken)
- return None;
-
- Value *Length = nullptr, *Index = nullptr;
-
- auto RCKind = InductiveRangeCheck::parseRangeCheck(L, SE, BI->getCondition(),
- Index, Length);
-
- if (RCKind == InductiveRangeCheck::RANGE_CHECK_UNKNOWN)
+ if (BPI.getEdgeProbability(BI->getParent(), (unsigned)0) < LikelyTaken)
return None;
- assert(Index && "contract with parseRangeCheck!");
- assert((!(RCKind & InductiveRangeCheck::RANGE_CHECK_UPPER) || Length) &&
- "contract with parseRangeCheck!");
-
- const auto *IndexAddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(Index));
- bool IsAffineIndex =
- IndexAddRec && (IndexAddRec->getLoop() == L) && IndexAddRec->isAffine();
-
- if (!IsAffineIndex)
- return None;
-
- InductiveRangeCheck IRC;
- IRC.Length = Length;
- IRC.Offset = IndexAddRec->getStart();
- IRC.Scale = IndexAddRec->getStepRecurrence(SE);
- IRC.CheckUse = &BI->getOperandUse(0);
- IRC.Kind = RCKind;
- return IRC;
+ return InductiveRangeCheck::parseRangeCheckFromCond(L, SE,
+ BI->getOperandUse(0));
}
namespace {
More information about the llvm-commits
mailing list