From d581679b9df40bea75891de343821137facbf8b5 Mon Sep 17 00:00:00 2001 From: Tyler Lanphear Date: Sat, 9 Sep 2023 03:15:05 -0700 Subject: [PATCH 1/3] [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 3be19f46ee847..658db532835a5 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 0000000000000..49a1be9eebb7f --- /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. + +@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 } From 6b9b8aafd26d581a5d22a43e9adf7a72209962e7 Mon Sep 17 00:00:00 2001 From: Tyler Lanphear Date: Sat, 9 Sep 2023 09:09:30 -0700 Subject: [PATCH 2/3] Address @arsenm review comments. --- .../test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll index 49a1be9eebb7f..452f511745dc4 100644 --- a/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll +++ b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll @@ -1,7 +1,6 @@ ; 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. @@ -9,7 +8,7 @@ target triple = "amdgcn-amd-amdhsa" @x = internal global i32 poison ; Function Attrs: norecurse -define amdgpu_kernel void @test(i32 %0) #0 { +define 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: From df2d197176eb8403311ce274e1ed3ec8eba0f909 Mon Sep 17 00:00:00 2001 From: Tyler Lanphear Date: Sat, 9 Sep 2023 09:14:51 -0700 Subject: [PATCH 3/3] Update test checks. --- llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll index 452f511745dc4..f3e0a3e78bee4 100644 --- a/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll +++ b/llvm/test/Transforms/GlobalOpt/global_alloca_diff_addrspaces.ll @@ -9,7 +9,7 @@ target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:3 ; Function Attrs: norecurse define void @test(i32 %0) #0 { -; CHECK-LABEL: define amdgpu_kernel void @test( +; CHECK-LABEL: define void @test( ; CHECK-SAME: i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: ret void