[llvm] r357448 - [LoopPredication] Simplify widenable condition handling [NFC]
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 1 19:42:57 PDT 2019
Author: reames
Date: Mon Apr 1 19:42:57 2019
New Revision: 357448
URL: http://llvm.org/viewvc/llvm-project?rev=357448&view=rev
Log:
[LoopPredication] Simplify widenable condition handling [NFC]
The code doesn't actually need any of the information about the widenable condition at this level. The only thing we need is to ensure the WC call is the last thing anded in, and even that is a quirk we should really look to remove.
Modified:
llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp?rev=357448&r1=357447&r2=357448&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopPredication.cpp Mon Apr 1 19:42:57 2019
@@ -594,6 +594,7 @@ unsigned LoopPredication::collectChecks(
// 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(
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(
// 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::widenWidenableBran
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::widenWidenableBran
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);
More information about the llvm-commits
mailing list