https://github.com/Keenuts updated https://github.com/llvm/llvm-project/pull/122103
From c11ace708fab316f422e12cf9785a5a362d7250c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brio...@google.com> Date: Thu, 28 Nov 2024 15:00:56 +0100 Subject: [PATCH 1/2] [SPIR-V] Add hlsl_private address space for SPIR-V MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In SPIR-V, private global variables have the `Private` storage class. This PR adds a new address space which allows frontend to emit variable with this storage class. Before this change, global variable were emitted with the 'Function' storage class, which was wrong. Signed-off-by: Nathan Gauër <brio...@google.com> --- clang/include/clang/Basic/AddressSpaces.h | 1 + clang/lib/AST/TypePrinter.cpp | 2 + clang/lib/Basic/TargetInfo.cpp | 2 + clang/lib/Basic/Targets/AArch64.h | 1 + clang/lib/Basic/Targets/AMDGPU.cpp | 2 + clang/lib/Basic/Targets/DirectX.h | 21 +++++---- clang/lib/Basic/Targets/NVPTX.h | 1 + clang/lib/Basic/Targets/SPIR.h | 46 ++++++++++--------- clang/lib/Basic/Targets/SystemZ.h | 1 + clang/lib/Basic/Targets/TCE.h | 1 + clang/lib/Basic/Targets/WebAssembly.h | 1 + clang/lib/Basic/Targets/X86.h | 1 + clang/lib/CodeGen/CodeGenModule.cpp | 17 +++++++ clang/test/CodeGenHLSL/GlobalDestructors.hlsl | 2 +- ...uffer_with_static_global_and_function.hlsl | 22 +++++---- .../test/CodeGenHLSL/out-of-line-static.hlsl | 27 +++++++++++ .../SemaTemplate/address_space-dependent.cpp | 4 +- 17 files changed, 107 insertions(+), 45 deletions(-) create mode 100644 clang/test/CodeGenHLSL/out-of-line-static.hlsl diff --git a/clang/include/clang/Basic/AddressSpaces.h b/clang/include/clang/Basic/AddressSpaces.h index d18bfe54931f9..5787e6dac0e36 100644 --- a/clang/include/clang/Basic/AddressSpaces.h +++ b/clang/include/clang/Basic/AddressSpaces.h @@ -59,6 +59,7 @@ enum class LangAS : unsigned { // HLSL specific address spaces. hlsl_groupshared, hlsl_constant, + hlsl_private, // Wasm specific address spaces. wasm_funcref, diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 8762cc7b1e4e1..1486e2477f4e5 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -2576,6 +2576,8 @@ std::string Qualifiers::getAddrSpaceAsString(LangAS AS) { return "groupshared"; case LangAS::hlsl_constant: return "hlsl_constant"; + case LangAS::hlsl_private: + return "hlsl_private"; case LangAS::wasm_funcref: return "__funcref"; default: diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 0699ec686e4e6..ab13c32f6943e 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -47,6 +47,8 @@ static const LangASMap FakeAddrSpaceMap = { 11, // ptr32_uptr 12, // ptr64 13, // hlsl_groupshared + 14, // hlsl_constant + 15, // hlsl_private 20, // wasm_funcref }; diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 9b6451bd06316..58822e467ce39 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -45,6 +45,7 @@ static const unsigned ARM64AddrSpaceMap[] = { static_cast<unsigned>(AArch64AddrSpace::ptr64), 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index a42b4589fb5ac..513e7fe22597f 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -60,6 +60,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64 llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant + llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private }; const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { @@ -85,6 +86,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64 llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant + llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private }; } // namespace targets } // namespace clang diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h index 6e3ddad626341..0610216ae7065 100644 --- a/clang/lib/Basic/Targets/DirectX.h +++ b/clang/lib/Basic/Targets/DirectX.h @@ -33,16 +33,17 @@ static const unsigned DirectXAddrSpaceMap[] = { 0, // cuda_constant 0, // cuda_shared // SYCL address space values for this map are dummy - 0, // sycl_global - 0, // sycl_global_device - 0, // sycl_global_host - 0, // sycl_local - 0, // sycl_private - 0, // ptr32_sptr - 0, // ptr32_uptr - 0, // ptr64 - 3, // hlsl_groupshared - 2, // hlsl_constant + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local + 0, // sycl_private + 0, // ptr32_sptr + 0, // ptr32_uptr + 0, // ptr64 + 3, // hlsl_groupshared + 2, // hlsl_constant + 10, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h index 6a868c42e1265..041596929ff5b 100644 --- a/clang/lib/Basic/Targets/NVPTX.h +++ b/clang/lib/Basic/Targets/NVPTX.h @@ -47,6 +47,7 @@ static const unsigned NVPTXAddrSpaceMap[] = { 0, // ptr64 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index 610efa1fe00d9..e3a69dc3b0584 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -38,16 +38,17 @@ static const unsigned SPIRDefIsPrivMap[] = { 0, // cuda_constant 0, // cuda_shared // SYCL address space values for this map are dummy - 0, // sycl_global - 0, // sycl_global_device - 0, // sycl_global_host - 0, // sycl_local - 0, // sycl_private - 0, // ptr32_sptr - 0, // ptr32_uptr - 0, // ptr64 - 0, // hlsl_groupshared - 2, // hlsl_constant + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local + 0, // sycl_private + 0, // ptr32_sptr + 0, // ptr32_uptr + 0, // ptr64 + 0, // hlsl_groupshared + 2, // hlsl_constant + 10, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref @@ -70,18 +71,19 @@ static const unsigned SPIRDefIsGenMap[] = { // cuda_constant pointer can be casted to default/"flat" pointer, but in // SPIR-V casts between constant and generic pointers are not allowed. For // this reason cuda_constant is mapped to SPIR-V CrossWorkgroup. - 1, // cuda_constant - 3, // cuda_shared - 1, // sycl_global - 5, // sycl_global_device - 6, // sycl_global_host - 3, // sycl_local - 0, // sycl_private - 0, // ptr32_sptr - 0, // ptr32_uptr - 0, // ptr64 - 0, // hlsl_groupshared - 0, // hlsl_constant + 1, // cuda_constant + 3, // cuda_shared + 1, // sycl_global + 5, // sycl_global_device + 6, // sycl_global_host + 3, // sycl_local + 0, // sycl_private + 0, // ptr32_sptr + 0, // ptr32_uptr + 0, // ptr64 + 0, // hlsl_groupshared + 0, // hlsl_constant + 10, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/Basic/Targets/SystemZ.h b/clang/lib/Basic/Targets/SystemZ.h index 4ca3f53f83cba..4d1509b84e82b 100644 --- a/clang/lib/Basic/Targets/SystemZ.h +++ b/clang/lib/Basic/Targets/SystemZ.h @@ -43,6 +43,7 @@ static const unsigned ZOSAddressMap[] = { 0, // ptr64 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private 0 // wasm_funcref }; diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h index 46c70de8f9ec1..44de8aae52a16 100644 --- a/clang/lib/Basic/Targets/TCE.h +++ b/clang/lib/Basic/Targets/TCE.h @@ -52,6 +52,7 @@ static const unsigned TCEOpenCLAddrSpaceMap[] = { 0, // ptr64 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index fb48c786a7edb..e786f9a3db68e 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -43,6 +43,7 @@ static const unsigned WebAssemblyAddrSpaceMap[] = { 0, // ptr64 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private 20, // wasm_funcref }; diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 205edcab9ccb3..d44561dd42997 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -47,6 +47,7 @@ static const unsigned X86AddrSpaceMap[] = { 272, // ptr64 0, // hlsl_groupshared 0, // hlsl_constant + 0, // hlsl_private // Wasm address space values for this target are dummy values, // as it is only enabled for Wasm targets. 20, // wasm_funcref diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index bca0a932b3495..0490fd7c317aa 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -5386,6 +5386,23 @@ LangAS CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D) { if (OpenMPRuntime->hasAllocateAttributeForGlobalVar(D, AS)) return AS; } + + if (LangOpts.HLSL) { + if (D == nullptr) + return LangAS::hlsl_private; + + // Except resources (Uniform, UniformConstant) & instanglble (handles) + if (D->getType()->isHLSLResourceType() || + D->getType()->isHLSLIntangibleType()) + return D->getType().getAddressSpace(); + + if (D->getStorageClass() != SC_Static) + return D->getType().getAddressSpace(); + + LangAS AS = D->getType().getAddressSpace(); + return AS == LangAS::Default ? LangAS::hlsl_private : AS; + } + return getTargetCodeGenInfo().getGlobalVarAddressSpace(*this, D); } diff --git a/clang/test/CodeGenHLSL/GlobalDestructors.hlsl b/clang/test/CodeGenHLSL/GlobalDestructors.hlsl index f98318601134b..62489457ff086 100644 --- a/clang/test/CodeGenHLSL/GlobalDestructors.hlsl +++ b/clang/test/CodeGenHLSL/GlobalDestructors.hlsl @@ -71,7 +71,7 @@ void main(unsigned GI : SV_GroupIndex) { // NOINLINE: define internal void @_GLOBAL__D_a() [[IntAttr:\#[0-9]+]] // NOINLINE-NEXT: entry: -// NOINLINE-NEXT: call void @_ZN4TailD1Ev(ptr @_ZZ3WagvE1T) +// NOINLINE-NEXT: call void @_ZN4TailD1Ev(ptr addrspacecast (ptr addrspace(10) @_ZZ3WagvE1T to ptr)) // NOINLINE-NEXT: call void @_ZN6PupperD1Ev(ptr @GlobalPup) // NOINLINE-NEXT: ret void diff --git a/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl b/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl index 99f40d8fc93d7..edd8c0455a138 100644 --- a/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl +++ b/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl @@ -3,23 +3,25 @@ // CHECK: %__cblayout_A = type <{ float }> -// CHECK: @A.cb = external constant target("dx.CBuffer", target("dx.Layout", %__cblayout_A, 4, 0)) -// CHECK: @a = external addrspace(2) global float, align 4 -// CHECK-DAG: @_ZL1b = internal global float 3.000000e+00, align 4 // CHECK-NOT: @B.cb +cbuffer B { + // intentionally empty +} +// CHECK-DAG: @_ZL1b = internal addrspace(10) global float 3.000000e+00, align 4 +static float b = 3; + +// CHECK-DAG: @A.cb = external constant target("dx.CBuffer", target("dx.Layout", %__cblayout_A, 4, 0)) cbuffer A { +// CHECK-DAG: @a = external addrspace(2) global float, align 4 float a; - static float b = 3; - float foo() { return a + b; } -} -cbuffer B { - // intentionally empty +// CHECK: define {{.*}} float @_Z3foov() #0 { +// CHECK-DAG: load float, ptr addrspace(2) @a, align 4 +// CHECK-DAG: load float, ptr addrspacecast (ptr addrspace(10) @_ZL1b to ptr), align 4 + float foo() { return a + b; } } -// CHECK: define {{.*}} float @_Z3foov() #0 { -// CHECK: load float, ptr addrspace(2) @a, align 4 extern float bar() { return foo(); diff --git a/clang/test/CodeGenHLSL/out-of-line-static.hlsl b/clang/test/CodeGenHLSL/out-of-line-static.hlsl new file mode 100644 index 0000000000000..98666560dabd4 --- /dev/null +++ b/clang/test/CodeGenHLSL/out-of-line-static.hlsl @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -std=hlsl202x -emit-llvm -o - -disable-llvm-passes %s | FileCheck %s --check-prefixes=CHECK +// RUN: %clang_cc1 -triple spirv-pc-vulkan1.3-compute -std=hlsl202x -emit-llvm -o - -disable-llvm-passes %s | FileCheck %s --check-prefixes=CHECK + +struct S { + static int Value; +}; + +int S::Value = 1; +// CHECK: @_ZN1S5ValueE = global i32 1, align 4 + +[shader("compute")] +[numthreads(1,1,1)] +void main() { + S s; + int value1, value2; +// CHECK: %s = alloca %struct.S, align 1 +// CHECK: %value1 = alloca i32, align 4 +// CHECK: %value2 = alloca i32, align 4 + +// CHECK: [[tmp:%.*]] = load i32, ptr @_ZN1S5ValueE, align 4 +// CHECK: store i32 [[tmp]], ptr %value1, align 4 + value1 = S::Value; + +// CHECK: [[tmp:%.*]] = load i32, ptr @_ZN1S5ValueE, align 4 +// CHECK: store i32 [[tmp]], ptr %value2, align 4 + value2 = s.Value; +} diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index eb8dbc69a945e..3e73e909746a5 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -43,7 +43,7 @@ void neg() { template <long int I> void tooBig() { - __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388585)}} + __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388584)}} } template <long int I> @@ -101,7 +101,7 @@ int main() { car<1, 2, 3>(); // expected-note {{in instantiation of function template specialization 'car<1, 2, 3>' requested here}} HasASTemplateFields<1> HASTF; neg<-1>(); // expected-note {{in instantiation of function template specialization 'neg<-1>' requested here}} - correct<0x7FFFE9>(); + correct<0x7FFFE8>(); tooBig<8388650>(); // expected-note {{in instantiation of function template specialization 'tooBig<8388650L>' requested here}} __attribute__((address_space(1))) char *x; From 383d9668cd7bad55c46d6784cc6d915ffe345579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brio...@google.com> Date: Thu, 6 Mar 2025 16:58:52 +0100 Subject: [PATCH 2/2] add FIXME note --- clang/lib/Basic/Targets/AMDGPU.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index 513e7fe22597f..4f628a8264459 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -60,7 +60,9 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64 llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared llvm::AMDGPUAS::CONSTANT_ADDRESS, // hlsl_constant - llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private + // FIXME(pr/122103): hlsl_private -> PRIVATE is wrong, but at least this + // will break loudly. + llvm::AMDGPUAS::PRIVATE_ADDRESS, // hlsl_private }; const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits