diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp index 96db249584e..e8f67a689f4 100644 --- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp @@ -1792,10 +1792,10 @@ void visitDomSubTree(DominatorTree &DT, BasicBlock *BB, CallableT Callable) { } while (!DomWorklist.empty()); } -static bool unswitchNontrivialInvariants( +static void unswitchNontrivialInvariants( Loop &L, Instruction &TI, ArrayRef<Value *> Invariants, - DominatorTree &DT, LoopInfo &LI, AssumptionCache &AC, - function_ref<void(bool, ArrayRef<Loop *>)> UnswitchCB, + SmallVectorImpl<BasicBlock *> &ExitBlocks, DominatorTree &DT, LoopInfo &LI, + AssumptionCache &AC, function_ref<void(bool, ArrayRef<Loop *>)> UnswitchCB, ScalarEvolution *SE) { auto *ParentBB = TI.getParent(); BranchInst *BI = dyn_cast<BranchInst>(&TI); @@ -1851,17 +1851,6 @@ static bool unswitchNontrivialInvariants( // whatever reason). assert(LI.getLoopFor(ParentBB) == &L && "Branch in an inner loop!"); - SmallVector<BasicBlock *, 4> ExitBlocks; - L.getUniqueExitBlocks(ExitBlocks); - - // We cannot unswitch if exit blocks contain a cleanuppad instruction as we - // don't know how to split those exit blocks. - // FIXME: We should teach SplitBlock to handle this and remove this - // restriction. - for (auto *ExitBB : ExitBlocks) - if (isa<CleanupPadInst>(ExitBB->getFirstNonPHI())) - return false; - // Compute the parent loop now before we start hacking on things. Loop *ParentL = L.getParentLoop(); @@ -2145,7 +2134,6 @@ static bool unswitchNontrivialInvariants( UnswitchCB(IsStillLoop, SibLoops); ++NumBranches; - return true; } /// Recursively compute the cost of a dominator subtree based on the per-block @@ -2241,6 +2229,19 @@ unswitchBestCondition(Loop &L, DominatorTree &DT, LoopInfo &LI, if (containsIrreducibleCFG<const BasicBlock *>(RPOT, LI)) return false; + SmallVector<BasicBlock *, 4> ExitBlocks; + L.getUniqueExitBlocks(ExitBlocks); + + // We cannot unswitch if exit blocks contain a cleanuppad instruction as we + // don't know how to split those exit blocks. + // FIXME: We should teach SplitBlock to handle this and remove this + // restriction. + for (auto *ExitBB : ExitBlocks) + if (isa<CleanupPadInst>(ExitBB->getFirstNonPHI())) { + dbgs() << "Cannot unswitch because of cleanuppad in exit block\n"; + return false; + } + LLVM_DEBUG( dbgs() << "Considering " << UnswitchCandidates.size() << " non-trivial loop invariant conditions for unswitching.\n"); @@ -2374,11 +2375,12 @@ unswitchBestCondition(Loop &L, DominatorTree &DT, LoopInfo &LI, return false; } - LLVM_DEBUG(dbgs() << " Trying to unswitch non-trivial (cost = " + LLVM_DEBUG(dbgs() << " Unswitching non-trivial (cost = " << BestUnswitchCost << ") terminator: " << *BestUnswitchTI << "\n"); - return unswitchNontrivialInvariants( - L, *BestUnswitchTI, BestUnswitchInvariants, DT, LI, AC, UnswitchCB, SE); + unswitchNontrivialInvariants(L, *BestUnswitchTI, BestUnswitchInvariants, + ExitBlocks, DT, LI, AC, UnswitchCB, SE); + return true; } /// Unswitch control flow predicated on loop invariant conditions. |