[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