diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopPredication.cpp | 27 |
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); |