https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/138862
>From decbf5b3a2cbb4f8844b9556fbfafec73c117687 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Wed, 7 May 2025 08:38:49 +0200 Subject: [PATCH 1/2] clang/OpenCL: Add baseline test showing broken codegen --- .../CodeGenCXX/amdgcn-automatic-variable.cpp | 24 ++++++++++ .../amdgcn-automatic-variable.cl | 45 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp b/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp index c1f9310141000..0f425d78c3332 100644 --- a/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp +++ b/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp @@ -133,3 +133,27 @@ void func7() { use(&x); } +#define __private __attribute__((opencl_private)) + +// CHECK-LABEL: @_Z34explicit_private_address_space_ptrv( +// CHECK-NEXT: entry: +// CHECK-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) +// CHECK-NEXT: [[PLONGP:%.*]] = alloca ptr, align 8, addrspace(5) +// CHECK-NEXT: [[PLONGP_B:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CHECK-NEXT: [[PLONG_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONG]] to ptr +// CHECK-NEXT: [[PLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP]] to ptr +// CHECK-NEXT: [[PLONGP_B_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP_B]] to ptr +// CHECK-NEXT: store ptr [[PLONG_ASCAST]], ptr [[PLONGP_ASCAST]], align 8 +// CHECK-NEXT: [[PLONG_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[PLONG_ASCAST]] to ptr addrspace(5) +// CHECK-NEXT: store ptr addrspace(5) [[PLONG_ASCAST_ASCAST]], ptr [[PLONGP_B_ASCAST]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PLONGP_ASCAST]], align 8 +// CHECK-NEXT: store i64 8, ptr [[TMP0]], align 8 +// CHECK-NEXT: ret void +// +void explicit_private_address_space_ptr() { + long plong; + long *plongp = &plong; + + __private long *plongp_b = (__private long *)&plong; + *plongp = 8; +} diff --git a/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl b/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl index dba6519966eb5..b252f1041d68c 100644 --- a/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl +++ b/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl @@ -109,3 +109,48 @@ void func2(void) { void func3(void) { float a[16][1] = {{0.}}; } + +// CL12-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca( +// CL12-SAME: ) #[[ATTR0]] { +// CL12-NEXT: [[ENTRY:.*:]] +// CL12-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) +// CL12-NEXT: [[PLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL12-NEXT: [[GLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL12-NEXT: store i64 5, ptr addrspace(5) [[PLONG]], align 8 +// CL12-NEXT: store ptr addrspace(5) [[PLONG]], ptr addrspace(5) [[PLONGP]], align 4 +// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[PLONGP]], align 4 +// CL12-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8 +// CL12-NEXT: store ptr addrspace(5) [[PLONG]], ptr addrspace(5) [[GLONGP]], align 4 +// CL12-NEXT: [[TMP1:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[GLONGP]], align 4 +// CL12-NEXT: store i64 9, ptr addrspace(5) [[TMP1]], align 8 +// CL12-NEXT: ret void +// +// CL20-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca( +// CL20-SAME: ) #[[ATTR0]] { +// CL20-NEXT: [[ENTRY:.*:]] +// CL20-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) +// CL20-NEXT: [[PLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL20-NEXT: [[GLONGP:%.*]] = alloca ptr, align 8, addrspace(5) +// CL20-NEXT: [[PLONG_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONG]] to ptr +// CL20-NEXT: [[PLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP]] to ptr +// CL20-NEXT: [[GLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[GLONGP]] to ptr +// CL20-NEXT: store i64 5, ptr [[PLONG_ASCAST]], align 8 +// CL20-NEXT: store ptr [[PLONG_ASCAST]], ptr [[PLONGP_ASCAST]], align 4 +// CL20-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[PLONGP_ASCAST]], align 4 +// CL20-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8 +// CL20-NEXT: store ptr [[PLONG_ASCAST]], ptr [[GLONGP_ASCAST]], align 8 +// CL20-NEXT: [[TMP1:%.*]] = load ptr, ptr [[GLONGP_ASCAST]], align 8 +// CL20-NEXT: store i64 9, ptr [[TMP1]], align 8 +// CL20-NEXT: ret void +// +void wrong_store_type_private_pointer_alloca() { + long plong = 5; + + // This needs to write an addrspace(5) pointer to the temporary alloca + __private long *plongp = &plong; + *plongp = 8; + + // This needs to write an addrspace(0) pointer to the temporary alloca in CL2.0 + long *glongp = &plong; + *glongp = 9; +} >From e82e94d968394900b2e0f30294b619ac79cd4162 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Wed, 7 May 2025 20:27:43 +0200 Subject: [PATCH 2/2] Split and rename test --- .../CodeGenCXX/amdgcn-automatic-variable.cpp | 30 ++++---- .../amdgcn-automatic-variable.cl | 77 ++++++++++++------- 2 files changed, 64 insertions(+), 43 deletions(-) diff --git a/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp b/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp index 0f425d78c3332..3c2a624bd4f95 100644 --- a/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp +++ b/clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp @@ -137,23 +137,23 @@ void func7() { // CHECK-LABEL: @_Z34explicit_private_address_space_ptrv( // CHECK-NEXT: entry: -// CHECK-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) -// CHECK-NEXT: [[PLONGP:%.*]] = alloca ptr, align 8, addrspace(5) -// CHECK-NEXT: [[PLONGP_B:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) -// CHECK-NEXT: [[PLONG_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONG]] to ptr -// CHECK-NEXT: [[PLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP]] to ptr -// CHECK-NEXT: [[PLONGP_B_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP_B]] to ptr -// CHECK-NEXT: store ptr [[PLONG_ASCAST]], ptr [[PLONGP_ASCAST]], align 8 -// CHECK-NEXT: [[PLONG_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[PLONG_ASCAST]] to ptr addrspace(5) -// CHECK-NEXT: store ptr addrspace(5) [[PLONG_ASCAST_ASCAST]], ptr [[PLONGP_B_ASCAST]], align 4 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PLONGP_ASCAST]], align 8 -// CHECK-NEXT: store i64 8, ptr [[TMP0]], align 8 +// CHECK-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5) +// CHECK-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr, align 8, addrspace(5) +// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CHECK-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr +// CHECK-NEXT: [[ALLOCA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR]] to ptr +// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR_AS_PRIVATE]] to ptr +// CHECK-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_ASCAST]], align 8 +// CHECK-NEXT: [[VAR_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[VAR_ASCAST]] to ptr addrspace(5) +// CHECK-NEXT: store ptr addrspace(5) [[VAR_ASCAST_ASCAST]], ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4 +// CHECK-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8 // CHECK-NEXT: ret void // void explicit_private_address_space_ptr() { - long plong; - long *plongp = &plong; + long var; + long *alloca_addr = &var; - __private long *plongp_b = (__private long *)&plong; - *plongp = 8; + __private long *alloca_addr_as_private = (__private long *)&var; + *alloca_addr_as_private = 8; } diff --git a/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl b/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl index b252f1041d68c..e28120adc0364 100644 --- a/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl +++ b/clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl @@ -113,44 +113,65 @@ void func3(void) { // CL12-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca( // CL12-SAME: ) #[[ATTR0]] { // CL12-NEXT: [[ENTRY:.*:]] -// CL12-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) -// CL12-NEXT: [[PLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) -// CL12-NEXT: [[GLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) -// CL12-NEXT: store i64 5, ptr addrspace(5) [[PLONG]], align 8 -// CL12-NEXT: store ptr addrspace(5) [[PLONG]], ptr addrspace(5) [[PLONGP]], align 4 -// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[PLONGP]], align 4 +// CL12-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5) +// CL12-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL12-NEXT: store i64 5, ptr addrspace(5) [[VAR]], align 8 +// CL12-NEXT: store ptr addrspace(5) [[VAR]], ptr addrspace(5) [[ALLOCA_ADDR]], align 4 +// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[ALLOCA_ADDR]], align 4 // CL12-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8 -// CL12-NEXT: store ptr addrspace(5) [[PLONG]], ptr addrspace(5) [[GLONGP]], align 4 -// CL12-NEXT: [[TMP1:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[GLONGP]], align 4 -// CL12-NEXT: store i64 9, ptr addrspace(5) [[TMP1]], align 8 // CL12-NEXT: ret void // // CL20-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca( // CL20-SAME: ) #[[ATTR0]] { // CL20-NEXT: [[ENTRY:.*:]] -// CL20-NEXT: [[PLONG:%.*]] = alloca i64, align 8, addrspace(5) -// CL20-NEXT: [[PLONGP:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) -// CL20-NEXT: [[GLONGP:%.*]] = alloca ptr, align 8, addrspace(5) -// CL20-NEXT: [[PLONG_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONG]] to ptr -// CL20-NEXT: [[PLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[PLONGP]] to ptr -// CL20-NEXT: [[GLONGP_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[GLONGP]] to ptr -// CL20-NEXT: store i64 5, ptr [[PLONG_ASCAST]], align 8 -// CL20-NEXT: store ptr [[PLONG_ASCAST]], ptr [[PLONGP_ASCAST]], align 4 -// CL20-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[PLONGP_ASCAST]], align 4 +// CL20-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5) +// CL20-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL20-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr +// CL20-NEXT: [[ALLOCA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR]] to ptr +// CL20-NEXT: store i64 5, ptr [[VAR_ASCAST]], align 8 +// CL20-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_ASCAST]], align 4 +// CL20-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[ALLOCA_ADDR_ASCAST]], align 4 // CL20-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8 -// CL20-NEXT: store ptr [[PLONG_ASCAST]], ptr [[GLONGP_ASCAST]], align 8 -// CL20-NEXT: [[TMP1:%.*]] = load ptr, ptr [[GLONGP_ASCAST]], align 8 -// CL20-NEXT: store i64 9, ptr [[TMP1]], align 8 // CL20-NEXT: ret void // void wrong_store_type_private_pointer_alloca() { - long plong = 5; + long var = 5; - // This needs to write an addrspace(5) pointer to the temporary alloca - __private long *plongp = &plong; - *plongp = 8; + // This needs to write an addrspace(5) pointer to the temporary alloca, + // which should be allocated with the correct size. + __private long *alloca_addr = &var; + *alloca_addr = 8; +} + +// CL12-LABEL: define dso_local void @wrong_store_type_private_pointer_as_generic_alloca( +// CL12-SAME: ) #[[ATTR0]] { +// CL12-NEXT: [[ENTRY:.*:]] +// CL12-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5) +// CL12-NEXT: [[ALLOCA_ADDR_AS_GENERIC:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5) +// CL12-NEXT: store i64 5, ptr addrspace(5) [[VAR]], align 8 +// CL12-NEXT: store ptr addrspace(5) [[VAR]], ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]], align 4 +// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]], align 4 +// CL12-NEXT: store i64 9, ptr addrspace(5) [[TMP0]], align 8 +// CL12-NEXT: ret void +// +// CL20-LABEL: define dso_local void @wrong_store_type_private_pointer_as_generic_alloca( +// CL20-SAME: ) #[[ATTR0]] { +// CL20-NEXT: [[ENTRY:.*:]] +// CL20-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5) +// CL20-NEXT: [[ALLOCA_ADDR_AS_GENERIC:%.*]] = alloca ptr, align 8, addrspace(5) +// CL20-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr +// CL20-NEXT: [[ALLOCA_ADDR_AS_GENERIC_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]] to ptr +// CL20-NEXT: store i64 5, ptr [[VAR_ASCAST]], align 8 +// CL20-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_AS_GENERIC_ASCAST]], align 8 +// CL20-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ALLOCA_ADDR_AS_GENERIC_ASCAST]], align 8 +// CL20-NEXT: store i64 9, ptr [[TMP0]], align 8 +// CL20-NEXT: ret void +// +void wrong_store_type_private_pointer_as_generic_alloca() { + long var = 5; - // This needs to write an addrspace(0) pointer to the temporary alloca in CL2.0 - long *glongp = &plong; - *glongp = 9; + // This needs to write an addrspace(0) pointer to the temporary alloca in + // CL2.0, which should be allocated with the correct size. + long *alloca_addr_as_generic = &var; + *alloca_addr_as_generic = 9; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits