From: Philip Reames Date: Tue, 2 Apr 2019 02:42:57 +0000 (+0000) Subject: [LoopPredication] Simplify widenable condition handling [NFC] X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2f2c88671c4bd9398ac9adeeb1c8ed65034948a5;p=llvm [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 --- 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);