summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-05-23 22:16:45 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-05-23 22:16:45 +0000
commit1b294079ced81c12b4285e5740c156c9c9876dc2 (patch)
treefaf073811c4ca6285f33c56049da75eea8993af6
parent526957f4ed99214aa1383faed72d837abf9a8abf (diff)
[IRCE] Optimize "uses" not branches; NFCI
This changes IRCE to optimize uses, and not branches. This change is NFCI since the uses we do inspect are in practice only ever going to be the condition use in conditional branches; but this flexibility will later allow us to analyze more complex expressions than just a direct branch on a range check. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270500 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp19
-rw-r--r--test/Transforms/IRCE/only-lower-check.ll2
-rw-r--r--test/Transforms/IRCE/only-upper-check.ll2
3 files changed, 12 insertions, 11 deletions
diff --git a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
index 5b4b6c14693..2b9f3f59c8e 100644
--- a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
+++ b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp
@@ -118,7 +118,7 @@ class InductiveRangeCheck {
const SCEV *Offset;
const SCEV *Scale;
Value *Length;
- BranchInst *Branch;
+ Use *CheckUse;
RangeCheckKind Kind;
static RangeCheckKind parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
@@ -129,8 +129,9 @@ class InductiveRangeCheck {
parseRangeCheck(Loop *L, ScalarEvolution &SE, Value *Condition,
const SCEV *&Index, Value *&UpperLimit);
- InductiveRangeCheck() :
- Offset(nullptr), Scale(nullptr), Length(nullptr), Branch(nullptr) { }
+ InductiveRangeCheck()
+ : Offset(nullptr), Scale(nullptr), Length(nullptr),
+ CheckUse(nullptr) {}
public:
const SCEV *getOffset() const { return Offset; }
@@ -149,9 +150,9 @@ public:
Length->print(OS);
else
OS << "(null)";
- OS << "\n Branch: ";
- getBranch()->print(OS);
- OS << "\n";
+ OS << "\n CheckUse: ";
+ getCheckUse()->getUser()->print(OS);
+ OS << " Operand: " << getCheckUse()->getOperandNo() << "\n";
}
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
@@ -160,7 +161,7 @@ public:
}
#endif
- BranchInst *getBranch() const { return Branch; }
+ Use *getCheckUse() const { return CheckUse; }
/// Represents an signed integer range [Range.getBegin(), Range.getEnd()). If
/// R.getEnd() sle R.getBegin(), then R denotes the empty range.
@@ -407,7 +408,7 @@ InductiveRangeCheck::create(BranchInst *BI, Loop *L, ScalarEvolution &SE,
IRC.Length = Length;
IRC.Offset = IndexAddRec->getStart();
IRC.Scale = IndexAddRec->getStepRecurrence(SE);
- IRC.Branch = BI;
+ IRC.CheckUse = &BI->getOperandUse(0);
IRC.Kind = RCKind;
return IRC;
}
@@ -1474,7 +1475,7 @@ bool InductiveRangeCheckElimination::runOnLoop(Loop *L, LPPassManager &LPM) {
ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
? ConstantInt::getTrue(Context)
: ConstantInt::getFalse(Context);
- IRC.getBranch()->setCondition(FoldedRangeCheck);
+ IRC.getCheckUse()->set(FoldedRangeCheck);
}
}
diff --git a/test/Transforms/IRCE/only-lower-check.ll b/test/Transforms/IRCE/only-lower-check.ll
index 69abc89c1a6..428c3aabdec 100644
--- a/test/Transforms/IRCE/only-lower-check.ll
+++ b/test/Transforms/IRCE/only-lower-check.ll
@@ -4,7 +4,7 @@
; CHECK-NEXT: InductiveRangeCheck:
; CHECK-NEXT: Kind: RANGE_CHECK_LOWER
; CHECK-NEXT: Offset: (-1 + %n) Scale: -1 Length: (null)
-; CHECK-NEXT: Branch: br i1 %abc, label %in.bounds, label %out.of.bounds
+; CHECK-NEXT: CheckUse: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1 Operand: 0
; CHECK-NEXT: irce: in function only_lower_check: constrained Loop at depth 1 containing: %loop<header><exiting>,%in.bounds<latch><exiting>
define void @only_lower_check(i32 *%arr, i32 *%a_len_ptr, i32 %n) {
diff --git a/test/Transforms/IRCE/only-upper-check.ll b/test/Transforms/IRCE/only-upper-check.ll
index dda3f3f6dd8..8e3e1ffe99b 100644
--- a/test/Transforms/IRCE/only-upper-check.ll
+++ b/test/Transforms/IRCE/only-upper-check.ll
@@ -4,7 +4,7 @@
; CHECK-NEXT:InductiveRangeCheck:
; CHECK-NEXT: Kind: RANGE_CHECK_UPPER
; CHECK-NEXT: Offset: %offset Scale: 1 Length: %len = load i32, i32* %a_len_ptr, !range !0
-; CHECK-NEXT: Branch: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
+; CHECK-NEXT: CheckUse: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1 Operand: 0
; CHECK-NEXT: irce: in function incrementing: constrained Loop at depth 1 containing: %loop<header><exiting>,%in.bounds<latch><exiting>
define void @incrementing(i32 *%arr, i32 *%a_len_ptr, i32 %n, i32 %offset) {