summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Scalar/LoopPredication.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopPredication.cpp b/llvm/lib/Transforms/Scalar/LoopPredication.cpp
index 2b031ba4184..8487278d3d6 100644
--- a/llvm/lib/Transforms/Scalar/LoopPredication.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopPredication.cpp
@@ -594,6 +594,7 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,
// resulting list of subconditions in Checks vector.
SmallVector<Value *, 4> Worklist(1, Condition);
SmallPtrSet<Value *, 4> Visited;
+ Value *WideableCond = nullptr;
do {
Value *Condition = Worklist.pop_back_val();
if (!Visited.insert(Condition).second)
@@ -607,6 +608,13 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,
continue;
}
+ if (match(Condition,
+ m_Intrinsic<Intrinsic::experimental_widenable_condition>())) {
+ // Pick any, we don't care which
+ WideableCond = Condition;
+ continue;
+ }
+
if (ICmpInst *ICI = dyn_cast<ICmpInst>(Condition)) {
if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander,
Builder)) {
@@ -619,6 +627,12 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl<Value *> &Checks,
// Save the condition as is if we can't widen it
Checks.push_back(Condition);
} while (!Worklist.empty());
+ // At the moment, our matching logic for wideable conditions implicitly
+ // assumes we preserve the form: (br (and Cond, WC())). FIXME
+ // Note that if there were multiple calls to wideable condition in the
+ // traversal, we only need to keep one, and which one is arbitrary.
+ if (WideableCond)
+ Checks.push_back(WideableCond);
return NumWidened;
}
@@ -662,10 +676,8 @@ bool LoopPredication::widenWidenableBranchGuardConditions(
TotalConsidered++;
SmallVector<Value *, 4> Checks;
IRBuilder<> Builder(cast<Instruction>(Preheader->getTerminator()));
- Value *Condition = nullptr, *WidenableCondition = nullptr;
- BasicBlock *GBB = nullptr, *DBB = nullptr;
- parseWidenableBranch(BI, Condition, WidenableCondition, GBB, DBB);
- unsigned NumWidened = collectChecks(Checks, Condition, Expander, Builder);
+ unsigned NumWidened = collectChecks(Checks, BI->getCondition(),
+ Expander, Builder);
if (NumWidened == 0)
return false;
@@ -679,11 +691,8 @@ bool LoopPredication::widenWidenableBranchGuardConditions(
LastCheck = Check;
else
LastCheck = Builder.CreateAnd(LastCheck, Check);
- // Make sure that the check contains widenable condition and therefore can be
- // further widened.
- LastCheck = Builder.CreateAnd(LastCheck, WidenableCondition);
- auto *OldCond = BI->getOperand(0);
- BI->setOperand(0, LastCheck);
+ auto *OldCond = BI->getCondition();
+ BI->setCondition(LastCheck);
assert(isGuardAsWidenableBranch(BI) &&
"Stopped being a guard after transform?");
RecursivelyDeleteTriviallyDeadInstructions(OldCond);
OpenPOWER on IntegriCloud