[llvm] 52f6f41 - [GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 (#65847)

via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 9 10:12:46 PDT 2023


Author: Tyler Lanphear
Date: 2023-09-09T10:12:42-07:00
New Revision: 52f6f418c78586817f78f3429991672073a05931

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

LOG: [GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 (#65847)

Fix crash on RAUW due to locals and globals having different address
spaces. This is the intent of the original code, but it assumes the
alloca address space is 0. This patch fixes the code to check that the
global's address space matches `DL.getAllocaAddrSpace()` instead.

Fixes #65155

Added: 
    llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.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 3be19f46ee8478d..658db532835a504 100644
--- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp
@@ -1453,7 +1453,7 @@ processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS,
   if (!GS.HasMultipleAccessingFunctions &&
       GS.AccessingFunction &&
       GV->getValueType()->isSingleValueType() &&
-      GV->getType()->getAddressSpace() == 0 &&
+      GV->getType()->getAddressSpace() == DL.getAllocaAddrSpace() &&
       !GV->isExternallyInitialized() &&
       GS.AccessingFunction->doesNotRecurse() &&
       isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV,

diff  --git a/llvm/test/Transforms/GlobalOpt/global_alloca_
diff _addrspaces.ll b/llvm/test/Transforms/GlobalOpt/global_alloca_
diff _addrspaces.ll
new file mode 100644
index 000000000000000..f3e0a3e78bee4b1
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/global_alloca_
diff _addrspaces.ll
@@ -0,0 +1,22 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt -S -passes=globalopt < %s | FileCheck %s
+target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8"
+
+; Check that we don't convert the global into an alloca if their respective address
+; spaces 
diff er, and the alloca addrspace is non-zero.
+
+ at x = internal global i32 poison
+
+; Function Attrs: norecurse
+define void @test(i32 %0) #0 {
+; CHECK-LABEL: define void @test(
+; CHECK-SAME: i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i32 %0, ptr @x, align 4
+  ret void
+}
+
+attributes #0 = { norecurse }


        


More information about the llvm-commits mailing list