[llvm] [GlobalOpt] add support for CallInst and InvokeInst users (PR #221955)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 8 06:19:38 PDT 2026


https://github.com/im-lunex updated https://github.com/llvm/llvm-project/pull/221955

>From 00c9a7da6098e7b6084a1c8ff042ee7800ce4a02 Mon Sep 17 00:00:00 2001
From: im-lunex <thisissamir04 at gmail.com>
Date: Tue, 8 Sep 2026 16:43:18 +0600
Subject: [PATCH 1/3] [GlobalOpt] add support for CallInst and InvokeInst users

---
 llvm/lib/Transforms/IPO/GlobalOpt.cpp         |  3 ++-
 ...lInst-and-InvokeInst-users-in-GlobalOpt.ll | 21 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll

diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index 9892c6796517c..7496bd3789ca5 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -865,7 +865,8 @@ static bool OptimizeAwayTrappingUsesOfLoads(
               isa<ConstantExpr>(GlobalUser) || isa<CmpInst>(GlobalUser) ||
               isa<BitCastInst>(GlobalUser) ||
               isa<GetElementPtrInst>(GlobalUser) ||
-              isa<AddrSpaceCastInst>(GlobalUser)) &&
+              isa<AddrSpaceCastInst>(GlobalUser) || isa<CallInst>(GlobalUser) ||
+              isa<InvokeInst>(GlobalUser)) &&
              "Only expect load and stores!");
     }
   }
diff --git a/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll b/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
new file mode 100644
index 0000000000000..f20f2188e899f
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -passes=globalopt < %s | FileCheck %s
+
+ at g0 = internal global ptr null, align 8
+ at g30 = internal global ptr @g0, align 8
+
+declare void @g21()
+declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1)
+
+define i32 @main() {
+; CHECK-LABEL: define i32 @main() local_unnamed_addr {
+; CHECK-NEXT:    store ptr @g21, ptr @g0, align 8
+; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr null, ptr @g0, i64 0, i1 false)
+; CHECK-NEXT:    ret i32 0
+;
+  store ptr @g21, ptr @g0, align 8
+  %v = load ptr, ptr @g30, align 8
+  call void @llvm.memmove.p0.p0.i64(ptr null, ptr %v, i64 0, i1 false)
+  ret i32 0
+}
+

>From 461c1d45d949c7fa312f3a0350701e81cee4364d Mon Sep 17 00:00:00 2001
From: im-lunex <thisissamir04 at gmail.com>
Date: Tue, 8 Sep 2026 18:42:51 +0600
Subject: [PATCH 2/3] remove unnecessary assert in GlobalOpt and minimize the
 test

---
 llvm/lib/Transforms/IPO/GlobalOpt.cpp               | 10 ----------
 .../CallInst-and-InvokeInst-users-in-GlobalOpt.ll   | 13 +++++--------
 2 files changed, 5 insertions(+), 18 deletions(-)

diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index 7496bd3789ca5..badcf937d6d1c 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -858,16 +858,6 @@ static bool OptimizeAwayTrappingUsesOfLoads(
              "Must be storing *to* the global");
     } else {
       AllNonStoreUsesGone = false;
-
-      // If we get here we could have other crazy uses that are transitively
-      // loaded.
-      assert((isa<PHINode>(GlobalUser) || isa<SelectInst>(GlobalUser) ||
-              isa<ConstantExpr>(GlobalUser) || isa<CmpInst>(GlobalUser) ||
-              isa<BitCastInst>(GlobalUser) ||
-              isa<GetElementPtrInst>(GlobalUser) ||
-              isa<AddrSpaceCastInst>(GlobalUser) || isa<CallInst>(GlobalUser) ||
-              isa<InvokeInst>(GlobalUser)) &&
-             "Only expect load and stores!");
     }
   }
 
diff --git a/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll b/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
index f20f2188e899f..37ea8137ff467 100644
--- a/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
+++ b/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
@@ -2,20 +2,17 @@
 ; RUN: opt -S -passes=globalopt < %s | FileCheck %s
 
 @g0 = internal global ptr null, align 8
- at g30 = internal global ptr @g0, align 8
 
-declare void @g21()
 declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1)
 
 define i32 @main() {
-; CHECK-LABEL: define i32 @main() local_unnamed_addr {
-; CHECK-NEXT:    store ptr @g21, ptr @g0, align 8
-; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr null, ptr @g0, i64 0, i1 false)
+; CHECK-LABEL: define i32 @main() {
+; CHECK-NEXT:    store ptr @main, ptr @g0, align 8
+; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr @main, ptr @g0, i64 0, i1 false)
 ; CHECK-NEXT:    ret i32 0
 ;
-  store ptr @g21, ptr @g0, align 8
-  %v = load ptr, ptr @g30, align 8
-  call void @llvm.memmove.p0.p0.i64(ptr null, ptr %v, i64 0, i1 false)
+  store ptr @main, ptr @g0, align 8
+  call void @llvm.memmove.p0.p0.i64(ptr @main, ptr @g0, i64 0, i1 false)
   ret i32 0
 }
 

>From 117142799359bf3439384384cf4102129a37b9dd Mon Sep 17 00:00:00 2001
From: im-lunex <thisissamir04 at gmail.com>
Date: Tue, 8 Sep 2026 19:19:06 +0600
Subject: [PATCH 3/3] improve test-case

---
 ...-GlobalOpt.ll => CallInst-users-in-GlobalOpt.ll} | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
 rename llvm/test/Transforms/GlobalOpt/{CallInst-and-InvokeInst-users-in-GlobalOpt.ll => CallInst-users-in-GlobalOpt.ll} (53%)

diff --git a/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll b/llvm/test/Transforms/GlobalOpt/CallInst-users-in-GlobalOpt.ll
similarity index 53%
rename from llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
rename to llvm/test/Transforms/GlobalOpt/CallInst-users-in-GlobalOpt.ll
index 37ea8137ff467..e9e1915e5d755 100644
--- a/llvm/test/Transforms/GlobalOpt/CallInst-and-InvokeInst-users-in-GlobalOpt.ll
+++ b/llvm/test/Transforms/GlobalOpt/CallInst-users-in-GlobalOpt.ll
@@ -1,18 +1,17 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; test for issue (https://github.com/llvm/llvm-project/issues/221589)
 ; RUN: opt -S -passes=globalopt < %s | FileCheck %s
 
 @g0 = internal global ptr null, align 8
 
-declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1)
-
-define i32 @main() {
-; CHECK-LABEL: define i32 @main() {
+define i32 @main(ptr %p) {
+; CHECK-LABEL: define i32 @main(
+; CHECK-SAME: ptr [[P:%.*]]) {
 ; CHECK-NEXT:    store ptr @main, ptr @g0, align 8
-; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr @main, ptr @g0, i64 0, i1 false)
+; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[P]], ptr @g0, i64 0, i1 false)
 ; CHECK-NEXT:    ret i32 0
 ;
   store ptr @main, ptr @g0, align 8
-  call void @llvm.memmove.p0.p0.i64(ptr @main, ptr @g0, i64 0, i1 false)
+  call void @llvm.memmove.p0.p0.i64(ptr %p, ptr @g0, i64 0, i1 false)
   ret i32 0
 }
-



More information about the llvm-commits mailing list