[PATCH] D53747: [NFC][SimpleLoopUnswitch] Make all checks before actual non-trivial unswitch
Max Kazantsev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 26 02:21:39 PDT 2018
mkazantsev updated this revision to Diff 171271.
mkazantsev marked an inline comment as done.
https://reviews.llvm.org/D53747
Files:
lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
Index: lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
===================================================================
--- lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
+++ lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
@@ -1792,11 +1792,11 @@
} 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,
- ScalarEvolution *SE) {
+ ScalarEvolution *SE, SmallVectorImpl<BasicBlock *> &ExitBlocks) {
auto *ParentBB = TI.getParent();
BranchInst *BI = dyn_cast<BranchInst>(&TI);
SwitchInst *SI = BI ? nullptr : cast<SwitchInst>(&TI);
@@ -1851,17 +1851,6 @@
// 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 @@
UnswitchCB(IsStillLoop, SibLoops);
++NumBranches;
- return true;
}
/// Recursively compute the cost of a dominator subtree based on the per-block
@@ -2241,6 +2229,19 @@
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 @@
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, DT,
+ LI, AC, UnswitchCB, SE, ExitBlocks);
+ return true;
}
/// Unswitch control flow predicated on loop invariant conditions.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53747.171271.patch
Type: text/x-patch
Size: 3022 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181026/071d516a/attachment.bin>
More information about the llvm-commits
mailing list