[llvm] [Attributor] Do not delete side-effect-free callbr (PR #205052)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 22 02:30:22 PDT 2026


https://github.com/lijinpei-amd updated https://github.com/llvm/llvm-project/pull/205052

>From 7b4c1f84b9150e99a38e1c57730813609e949cf5 Mon Sep 17 00:00:00 2001
From: Li Jinpei <jinpli at amd.com>
Date: Mon, 22 Jun 2026 15:26:16 +0800
Subject: [PATCH] [Attributor] Do not delete side-effect-free callbr

Fixes: https://github.com/llvm/llvm-project/issues/192012
---
 .../Transforms/IPO/AttributorAttributes.cpp   |  2 +-
 llvm/test/Transforms/Attributor/callbr.ll     | 21 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/Attributor/callbr.ll

diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index f67b87e6a8ad0..cec6bed0b4b84 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -4291,7 +4291,7 @@ struct AAIsDeadFloating : public AAIsDeadValueImpl {
         A.deleteAfterManifest(*FI);
         return ChangeStatus::CHANGED;
       }
-      if (isAssumedSideEffectFree(A, I) && !isa<InvokeInst>(I)) {
+      if (isAssumedSideEffectFree(A, I) && !isa<InvokeInst, CallBrInst>(I)) {
         A.deleteAfterManifest(*I);
         return ChangeStatus::CHANGED;
       }
diff --git a/llvm/test/Transforms/Attributor/callbr.ll b/llvm/test/Transforms/Attributor/callbr.ll
new file mode 100644
index 0000000000000..19f5a7404344b
--- /dev/null
+++ b/llvm/test/Transforms/Attributor/callbr.ll
@@ -0,0 +1,21 @@
+; RUN: opt -passes=attributor -verify-each -S < %s | FileCheck %s
+
+; Regression test for #192012: a side-effect-free callbr is still a terminator
+; and must not be queued for generic deletion after manifestation.
+define i32 @callbr_is_not_deleted_as_dead_callbase() {
+; CHECK-LABEL: define {{[^@]+}}@callbr_is_not_deleted_as_dead_callbase
+; CHECK:       entry:
+; CHECK-NEXT:    callbr void asm "", "!i"() #[[ATTR:[0-9]+]]
+; CHECK-NEXT:            to label %common.ret [label %common.ret]
+; CHECK:       common.ret:
+; CHECK-NEXT:    ret i32 0
+;
+entry:
+  callbr void asm "", "!i"() #0
+          to label %common.ret [label %common.ret]
+
+common.ret:
+  ret i32 0
+}
+
+attributes #0 = { nounwind memory(none) }



More information about the llvm-commits mailing list