[llvm] b52db60 - GlobalOpt: Drop code to handle typed pointers

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 29 06:48:29 PDT 2023


Author: Matt Arsenault
Date: 2023-04-29T09:48:21-04:00
New Revision: b52db60cbbb2b258acb4aad056aba7ad3ca572fa

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

LOG: GlobalOpt: Drop code to handle typed pointers

Fixes assert with pointers with different address spaces. We
could keep looking through addrspacecast, but it would require
checking for null handling of the access address space.

Fixes #62384

Added: 
    llvm/test/Transforms/GlobalOpt/issue62384.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 50b90944c4526..bae94fd763d08 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1145,9 +1145,6 @@ optimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal,
           nullptr /* F */,
           GV->getInitializer()->getType()->getPointerAddressSpace())) {
     if (Constant *SOVC = dyn_cast<Constant>(StoredOnceVal)) {
-      if (GV->getInitializer()->getType() != SOVC->getType())
-        SOVC = ConstantExpr::getBitCast(SOVC, GV->getInitializer()->getType());
-
       // Optimize away any trapping uses of the loaded value.
       if (OptimizeAwayTrappingUsesOfLoads(GV, SOVC, DL, GetTLI))
         return true;

diff  --git a/llvm/test/Transforms/GlobalOpt/issue62384.ll b/llvm/test/Transforms/GlobalOpt/issue62384.ll
new file mode 100644
index 0000000000000..cc2bc8940b891
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/issue62384.ll
@@ -0,0 +1,80 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -S -p=globalopt %s | FileCheck %s
+
+
+ at llvm.used = appending global [1 x ptr] [ptr @ctor]
+ at gv0 = internal addrspace(1) global ptr null
+ at gv1 = internal addrspace(1) global ptr addrspace(3) null
+ at gv2 = internal addrspace(1) global ptr addrspace(1) null
+ at gv3 = internal addrspace(1) global ptr addrspace(1) null
+
+define internal void @ctor() {
+; CHECK-LABEL: define internal void @ctor() {
+; CHECK-NEXT:    tail call fastcc void @init0(ptr addrspacecast (ptr addrspace(1) null to ptr))
+; CHECK-NEXT:    tail call fastcc void @init1(ptr addrspacecast (ptr addrspace(3) null to ptr))
+; CHECK-NEXT:    tail call fastcc void @init2(ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)))
+; CHECK-NEXT:    tail call fastcc void @init3(ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)))
+; CHECK-NEXT:    ret void
+;
+  tail call void @init0(ptr addrspacecast (ptr addrspace(1) null to ptr))
+  tail call void @init1(ptr addrspacecast (ptr addrspace(3) null to ptr))
+  tail call void @init2(ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)))
+  tail call void @init3(ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)))
+  ret void
+}
+
+define internal void @init0(ptr %T) {
+; CHECK-LABEL: define internal fastcc void @init0
+; CHECK-SAME: (ptr [[T:%.*]]) unnamed_addr {
+; CHECK-NEXT:    [[LD:%.*]] = load ptr, ptr addrspace(1) @gv0, align 8
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr [[LD]], null
+; CHECK-NEXT:    store ptr addrspacecast (ptr addrspace(1) null to ptr), ptr addrspace(1) @gv0, align 8
+; CHECK-NEXT:    ret void
+;
+  %ld = load ptr, ptr addrspace(1) @gv0, align 8
+  %cmp = icmp eq ptr %ld, null
+  store ptr addrspacecast (ptr addrspace(1) null to ptr), ptr addrspace(1) @gv0, align 8
+  ret void
+}
+
+define internal void @init1(ptr %T) {
+; CHECK-LABEL: define internal fastcc void @init1
+; CHECK-SAME: (ptr [[T:%.*]]) unnamed_addr {
+; CHECK-NEXT:    [[LD:%.*]] = load ptr addrspace(3), ptr addrspace(1) @gv1, align 4
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(3) [[LD]], null
+; CHECK-NEXT:    store ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspace(1) @gv1, align 8
+; CHECK-NEXT:    ret void
+;
+  %ld = load ptr addrspace(3), ptr addrspace(1) @gv1, align 4
+  %cmp = icmp eq ptr addrspace(3) %ld, null
+  store ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspace(1) @gv1, align 8
+  ret void
+}
+
+define internal void @init2(ptr addrspace(1) %T) {
+; CHECK-LABEL: define internal fastcc void @init2
+; CHECK-SAME: (ptr addrspace(1) [[T:%.*]]) unnamed_addr {
+; CHECK-NEXT:    [[LD:%.*]] = load ptr addrspace(1), ptr addrspace(1) @gv2, align 4
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(1) [[LD]], null
+; CHECK-NEXT:    store ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)), ptr addrspace(1) @gv2, align 8
+; CHECK-NEXT:    ret void
+;
+  %ld = load ptr addrspace(1), ptr addrspace(1) @gv2, align 4
+  %cmp = icmp eq ptr addrspace(1) %ld, null
+  store ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)), ptr addrspace(1) @gv2, align 8
+  ret void
+}
+
+define internal void @init3(ptr addrspace(1) %T) {
+; CHECK-LABEL: define internal fastcc void @init3
+; CHECK-SAME: (ptr addrspace(1) [[T:%.*]]) unnamed_addr {
+; CHECK-NEXT:    [[LD:%.*]] = load ptr addrspace(1), ptr addrspace(1) @gv3, align 4
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(1) [[LD]], null
+; CHECK-NEXT:    store ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)), ptr addrspace(1) @gv3, align 8
+; CHECK-NEXT:    ret void
+;
+  %ld = load ptr addrspace(1), ptr addrspace(1) @gv3, align 4
+  %cmp = icmp eq ptr addrspace(1) %ld, null
+  store ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)), ptr addrspace(1) @gv3, align 8
+  ret void
+}


        


More information about the llvm-commits mailing list