[llvm-branch-commits] [llvm] release/21.x: [GVN] Check IndirectBr in Predecessor Terminators (#151188) (PR #152965)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 11 05:10:49 PDT 2025
https://github.com/tru updated https://github.com/llvm/llvm-project/pull/152965
>From 6f5c887e557ff6baa98c871541e6b901de211739 Mon Sep 17 00:00:00 2001
From: hanbeom <kese111 at gmail.com>
Date: Mon, 11 Aug 2025 16:25:52 +0900
Subject: [PATCH] [GVN] Check IndirectBr in Predecessor Terminators (#151188)
Critical edges with an IndirectBr terminator cannot be split.
Add a check it to prevent assertion failures.
Fixes: #150229
(cherry picked from commit a750fcb52bbf0ec0dc2022f73b1d48a4d43d8a07)
---
.../Transforms/Utils/BreakCriticalEdges.cpp | 11 +++++------
llvm/test/Transforms/GVN/cond_br.ll | 19 +++++++++++++++++++
2 files changed, 24 insertions(+), 6 deletions(-)
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
+}
More information about the llvm-branch-commits
mailing list