[llvm] 84717a7 - [GlobalOpt] Fix dead const handling in pointer root user cleanup (PR61674)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 24 06:19:53 PDT 2023


Author: Nikita Popov
Date: 2023-03-24T14:19:43+01:00
New Revision: 84717a78a3482a4d969c3e4fd9196f86a6870c7d

URL: https://github.com/llvm/llvm-project/commit/84717a78a3482a4d969c3e4fd9196f86a6870c7d
DIFF: https://github.com/llvm/llvm-project/commit/84717a78a3482a4d969c3e4fd9196f86a6870c7d.diff

LOG: [GlobalOpt] Fix dead const handling in pointer root user cleanup (PR61674)

Rather than cleanup up dead constant expressions as we go along,
do this once at the end. This aligns it with the
CleanupConstantGlobalUsers() implementation and avoids
any invalidation issues.

Fixes https://github.com/llvm/llvm-project/issues/61674.

Added: 
    llvm/test/Transforms/GlobalOpt/pr61674.ll

Modified: 
    llvm/lib/Transforms/IPO/GlobalOpt.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
index 1d5661119df84..fec8d7032916e 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -237,19 +237,8 @@ CleanupPointerRootUsers(GlobalVariable *GV,
           Dead.push_back(std::make_pair(I, MTI));
       }
     } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
-      if (CE->use_empty()) {
-        CE->destroyConstant();
-        Changed = true;
-      } else if (isa<GEPOperator>(CE))
+      if (isa<GEPOperator>(CE))
         append_range(Worklist, CE->users());
-    } else if (Constant *C = dyn_cast<Constant>(U)) {
-      if (isSafeToDestroyConstant(C)) {
-        C->destroyConstant();
-        // This could have invalidated UI, start over from scratch.
-        Dead.clear();
-        CleanupPointerRootUsers(GV, GetTLI);
-        return true;
-      }
     }
   }
 
@@ -271,6 +260,7 @@ CleanupPointerRootUsers(GlobalVariable *GV,
     }
   }
 
+  GV->removeDeadConstantUsers();
   return Changed;
 }
 

diff  --git a/llvm/test/Transforms/GlobalOpt/pr61674.ll b/llvm/test/Transforms/GlobalOpt/pr61674.ll
new file mode 100644
index 0000000000000..1ca86345107bf
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/pr61674.ll
@@ -0,0 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -S -passes=globalopt < %s | FileCheck %s
+
+; Test handling of dead constant expressions in CleanupPointerRootUsers().
+
+ at g = internal global [2 x [1 x [6 x ptr]]] zeroinitializer
+
+define void @test() {
+; CHECK-LABEL: define void @test() local_unnamed_addr {
+; CHECK-NEXT:    ret void
+;
+  store ptr null, ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), align 1
+  ret void
+
+dead:
+  zext i1 icmp ne (ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), ptr getelementptr inbounds ([6 x ptr], ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), i32 0, i32 5)) to i16
+  ret void
+}
+
+; uselistorder directives
+uselistorder ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), { 1, 2, 0 }


        


More information about the llvm-commits mailing list