[PATCH] D94833: [LICM] permit CallBr critical edge to default dest to be split
Nick Desaulniers via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 15 15:07:45 PST 2021
nickdesaulniers created this revision.
nickdesaulniers added reviewers: void, efriedma, jyknight.
Herald added subscribers: asbirlea, hiraditya.
nickdesaulniers requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Follow up to
commit 2fe457690da0 <https://reviews.llvm.org/rG2fe457690da0fc38bc7f9f1d0aee2ba6a6a16ada> ("Filter callbr insts from critical edge splitting")
@void and @efriedma pointed out in D88438 <https://reviews.llvm.org/D88438> that we can split a critical
edge from a CallBrInst if that edge is to the default (non-indirect)
destination.
Permit this such an edge to be split for LICM, and as a result of
D88438 <https://reviews.llvm.org/D88438>, we can now drop the guard from llvm::SplitAllCriticalEdges() as
it will simply call into llvm::SplitCriticalEdge() and hit the guard
there that was newly added in D88438 <https://reviews.llvm.org/D88438>.
Realistically, we shouldn't often see a CallBrInst will no indirect
destinations (otherwise, why use CallBrInst, as CallInst would suffice),
but still a modest cleanup of llvm::SplitAllCriticalEdges().
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D94833
Files:
llvm/lib/Transforms/Scalar/LICM.cpp
llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
Index: llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
===================================================================
--- llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -533,11 +533,11 @@
unsigned NumBroken = 0;
for (BasicBlock &BB : F) {
Instruction *TI = BB.getTerminator();
- if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI) &&
- !isa<CallBrInst>(TI))
- for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
- if (SplitCriticalEdge(TI, i, Options))
- ++NumBroken;
+ if (isa<IndirectBrInst>(TI))
+ continue;
+ for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
+ if (SplitCriticalEdge(TI, i, Options))
+ ++NumBroken;
}
return NumBroken;
}
Index: llvm/lib/Transforms/Scalar/LICM.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LICM.cpp
+++ llvm/lib/Transforms/Scalar/LICM.cpp
@@ -1542,10 +1542,12 @@
// predecessor fairly simple.
if (!SafetyInfo->getBlockColors().empty() && BB->getFirstNonPHI()->isEHPad())
return false;
- for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
- BasicBlock *BBPred = *PI;
- if (isa<IndirectBrInst>(BBPred->getTerminator()) ||
- isa<CallBrInst>(BBPred->getTerminator()))
+ for (BasicBlock *BBPred : predecessors(BB)) {
+ const Instruction *T = BBPred->getTerminator();
+ if (auto *CBR = dyn_cast<CallBrInst>(T))
+ if (CBR->getDefaultDest() != BB)
+ return false;
+ if (isa<IndirectBrInst>(T))
return false;
}
return true;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94833.317087.patch
Type: text/x-patch
Size: 1648 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210115/ed8867e4/attachment.bin>
More information about the llvm-commits
mailing list