[llvm] [GlobalOpt] Handle DL.getAllocaAddrSpace() != 0 (PR #65847)

Tyler Lanphear via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 9 03:27:50 PDT 2023


https://github.com/tylanphear created https://github.com/llvm/llvm-project/pull/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.

>From d581679b9df40bea75891de343821137facbf8b5 Mon Sep 17 00:00:00 2001
From: Tyler Lanphear <tylanphear at gmail.com>
Date: Sat, 9 Sep 2023 03:15:05 -0700
Subject: [PATCH] [GlobalOpt] Handle DL.getAllocaAddrSpace() != 0

Fix crash on RAUW due to alloca's 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.
---
 llvm/lib/Transforms/IPO/GlobalOpt.cpp         |  2 +-
 .../global_alloca_diff_addrspaces.ll          | 23 +++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll

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..49a1be9eebb7f53
--- /dev/null
+++ b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll
@@ -0,0 +1,23 @@
+; 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"
+target triple = "amdgcn-amd-amdhsa"
+
+; Check that we don't convert the global into an alloca if their respective address
+; spaces differ, and the alloca addrspace is non-zero.
+
+ at x = internal global i32 poison
+
+; Function Attrs: norecurse
+define amdgpu_kernel void @test(i32 %0) #0 {
+; CHECK-LABEL: define amdgpu_kernel 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