[llvm-branch-commits] [llvm] release/21.x: [GVN] Check IndirectBr in Predecessor Terminators (#151188) (PR #152965)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 11 00:32:39 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport a750fcb52bbf0ec0dc2022f73b1d48a4d43d8a07
Requested by: @<!-- -->nikic
---
Full diff: https://github.com/llvm/llvm-project/pull/152965.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp (+5-6)
- (modified) llvm/test/Transforms/GVN/cond_br.ll (+19)
``````````diff
diff --git a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
index ddd203f3acf71..42b1fdf17f389 100644
--- a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
+++ b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
@@ -111,15 +111,14 @@ BasicBlock *
llvm::SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum,
const CriticalEdgeSplittingOptions &Options,
const Twine &BBName) {
- assert(!isa<IndirectBrInst>(TI) &&
- "Cannot split critical edge from IndirectBrInst");
-
BasicBlock *TIBB = TI->getParent();
BasicBlock *DestBB = TI->getSuccessor(SuccNum);
- // Splitting the critical edge to a pad block is non-trivial. Don't do
- // it in this generic function.
- if (DestBB->isEHPad()) return nullptr;
+ // Splitting the critical edge to a pad block is non-trivial.
+ // And we cannot split block with IndirectBr as a terminator.
+ // Don't do it in this generic function.
+ if (DestBB->isEHPad() || isa<IndirectBrInst>(TI))
+ return nullptr;
if (Options.IgnoreUnreachableDests &&
isa<UnreachableInst>(DestBB->getFirstNonPHIOrDbgOrLifetime()))
diff --git a/llvm/test/Transforms/GVN/cond_br.ll b/llvm/test/Transforms/GVN/cond_br.ll
index 19166d17a8320..fb84b626c7455 100644
--- a/llvm/test/Transforms/GVN/cond_br.ll
+++ b/llvm/test/Transforms/GVN/cond_br.ll
@@ -53,3 +53,22 @@ if.end: ; preds = %if.else, %if.then
}
declare void @bar(i32)
+
+define void @indirectbr_could_not_split() {
+; CHECK-LABEL: define void @indirectbr_could_not_split() {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: br i1 false, label %[[IBR:.*]], label %[[EXIT:.*]]
+; CHECK: [[IBR]]:
+; CHECK-NEXT: indirectbr ptr null, [label %[[EXIT]], label %exit]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br i1 false, label %ibr, label %exit
+
+ibr:
+ indirectbr ptr null, [label %exit, label %exit]
+
+exit:
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/152965
More information about the llvm-branch-commits
mailing list