[PATCH] D144468: [GlobalOpt] Extend CleanupPointerRootUsers to handle CE users.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 28 02:51:42 PST 2023
fhahn updated this revision to Diff 501063.
fhahn marked an inline comment as done.
fhahn added a comment.
Herald added a subscriber: steven_wu.
Rebase on top of c34936465c5648f825414fe76ccad7a9ad82dddd <https://reviews.llvm.org/rGc34936465c5648f825414fe76ccad7a9ad82dddd> which adds a test with non GEP constant expressions.
Also update ThinLTO test.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D144468/new/
https://reviews.llvm.org/D144468
Files:
llvm/lib/Transforms/IPO/GlobalOpt.cpp
llvm/test/ThinLTO/X86/import-constant.ll
llvm/test/Transforms/GlobalOpt/cleanup-pointer-root-users-gep-constexpr.ll
Index: llvm/test/Transforms/GlobalOpt/cleanup-pointer-root-users-gep-constexpr.ll
===================================================================
--- llvm/test/Transforms/GlobalOpt/cleanup-pointer-root-users-gep-constexpr.ll
+++ llvm/test/Transforms/GlobalOpt/cleanup-pointer-root-users-gep-constexpr.ll
@@ -16,14 +16,6 @@
define void @stores_single_use_gep_constexpr() {
; CHECK-LABEL: @stores_single_use_gep_constexpr(
; CHECK-NEXT: entry:
-; CHECK-NEXT: store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR:%.*]], ptr @global.20ptr, i64 0, i32 1), align 8
-; CHECK-NEXT: store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 2), align 8
-; CHECK-NEXT: store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 3), align 8
-; CHECK-NEXT: store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 4), align 8
-; CHECK-NEXT: store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 5), align 8
-; CHECK-NEXT: store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 6), align 8
-; CHECK-NEXT: store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 7), align 8
-; CHECK-NEXT: store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 8), align 8
; CHECK-NEXT: ret void
;
entry:
@@ -42,8 +34,6 @@
define void @stores_multi_use_gep_constexpr() {
; CHECK-LABEL: @stores_multi_use_gep_constexpr(
; CHECK-NEXT: entry:
-; CHECK-NEXT: store i32 0, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR:%.*]], ptr @global.20ptr, i64 0, i32 16), align 8
-; CHECK-NEXT: store i32 0, ptr getelementptr inbounds ([[STRUCT_GLOBAL_20PTR]], ptr @global.20ptr, i64 0, i32 16), align 8
; CHECK-NEXT: ret void
;
entry:
Index: llvm/test/ThinLTO/X86/import-constant.ll
===================================================================
--- llvm/test/ThinLTO/X86/import-constant.ll
+++ llvm/test/ThinLTO/X86/import-constant.ll
@@ -32,11 +32,11 @@
; IMPORT-NEXT: @_ZL3Obj.llvm.{{.*}} = available_externally hidden constant %struct.S { i32 4, i32 8, ptr @val }
; IMPORT-NEXT: @outer = internal local_unnamed_addr global %struct.Q zeroinitializer
-; OPT: @outer = internal unnamed_addr global %struct.Q zeroinitializer
+; @outer is a write-only variable that's stored to once, so the store and the global can be removed.
+; OPT-NOT: @outer
; OPT: define dso_local i32 @main()
; OPT-NEXT: entry:
-; OPT-NEXT: store ptr null, ptr getelementptr inbounds (%struct.Q, ptr @outer, i64 1, i32 0)
; OPT-NEXT: ret i32 12
; NOREFS: @_ZL3Obj.llvm.{{.*}} = external hidden constant %struct.S
Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp
===================================================================
--- llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -206,8 +206,13 @@
// chain of computation and the store to the global in Dead[n].second.
SmallVector<std::pair<Instruction *, Instruction *>, 32> Dead;
+ SmallVector<User *> Worklist(GV->users());
+ SmallPtrSet<User *, 8> Seen;
// Constants can't be pointers to dynamically allocated memory.
- for (User *U : llvm::make_early_inc_range(GV->users())) {
+ while (!Worklist.empty()) {
+ User *U = Worklist.pop_back_val();
+ if (!Seen.insert(U).second)
+ continue;
if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
Value *V = SI->getValueOperand();
if (isa<Constant>(V)) {
@@ -238,7 +243,8 @@
if (CE->use_empty()) {
CE->destroyConstant();
Changed = true;
- }
+ } else
+ append_range(Worklist, CE->users());
} else if (Constant *C = dyn_cast<Constant>(U)) {
if (isSafeToDestroyConstant(C)) {
C->destroyConstant();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144468.501063.patch
Type: text/x-patch
Size: 3954 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230228/3cda769f/attachment.bin>
More information about the llvm-commits
mailing list