https://github.com/tru updated https://github.com/llvm/llvm-project/pull/152965
>From 6f5c887e557ff6baa98c871541e6b901de211739 Mon Sep 17 00:00:00 2001 From: hanbeom <kese...@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 +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits