From 2f2c88671c4bd9398ac9adeeb1c8ed65034948a5 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 2 Apr 2019 02:42:57 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357448 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopPredication.cpp | 27 +++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Scalar/LoopPredication.cpp b/lib/Transforms/Scalar/LoopPredication.cpp index 2b031ba4184..8487278d3d6 100644 --- a/lib/Transforms/Scalar/LoopPredication.cpp +++ b/lib/Transforms/Scalar/LoopPredication.cpp @@ -594,6 +594,7 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl &Checks, // resulting list of subconditions in Checks vector. SmallVector Worklist(1, Condition); SmallPtrSet Visited; + Value *WideableCond = nullptr; do { Value *Condition = Worklist.pop_back_val(); if (!Visited.insert(Condition).second) @@ -607,6 +608,13 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl &Checks, continue; } + if (match(Condition, + m_Intrinsic())) { + // Pick any, we don't care which + WideableCond = Condition; + continue; + } + if (ICmpInst *ICI = dyn_cast(Condition)) { if (auto NewRangeCheck = widenICmpRangeCheck(ICI, Expander, Builder)) { @@ -619,6 +627,12 @@ unsigned LoopPredication::collectChecks(SmallVectorImpl &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 Checks; IRBuilder<> Builder(cast(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); -- 2.50.1