[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