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

Reply via email to