Skip to content

Commit 26572ba

Browse files
authored
clang/OpenCL: Add baseline test showing broken codegen (#138862)
1 parent fa09d03 commit 26572ba

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

clang/test/CodeGenCXX/amdgcn-automatic-variable.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,27 @@ void func7() {
133133
use(&x);
134134
}
135135

136+
#define __private __attribute__((opencl_private))
137+
138+
// CHECK-LABEL: @_Z34explicit_private_address_space_ptrv(
139+
// CHECK-NEXT: entry:
140+
// CHECK-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)
141+
// CHECK-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
142+
// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)
143+
// CHECK-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr
144+
// CHECK-NEXT: [[ALLOCA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR]] to ptr
145+
// CHECK-NEXT: [[ALLOCA_ADDR_AS_PRIVATE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR_AS_PRIVATE]] to ptr
146+
// CHECK-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_ASCAST]], align 8
147+
// CHECK-NEXT: [[VAR_ASCAST_ASCAST:%.*]] = addrspacecast ptr [[VAR_ASCAST]] to ptr addrspace(5)
148+
// CHECK-NEXT: store ptr addrspace(5) [[VAR_ASCAST_ASCAST]], ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4
149+
// CHECK-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[ALLOCA_ADDR_AS_PRIVATE_ASCAST]], align 4
150+
// CHECK-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8
151+
// CHECK-NEXT: ret void
152+
//
153+
void explicit_private_address_space_ptr() {
154+
long var;
155+
long *alloca_addr = &var;
156+
157+
__private long *alloca_addr_as_private = (__private long *)&var;
158+
*alloca_addr_as_private = 8;
159+
}

clang/test/CodeGenOpenCL/amdgcn-automatic-variable.cl

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,69 @@ void func2(void) {
109109
void func3(void) {
110110
float a[16][1] = {{0.}};
111111
}
112+
113+
// CL12-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca(
114+
// CL12-SAME: ) #[[ATTR0]] {
115+
// CL12-NEXT: [[ENTRY:.*:]]
116+
// CL12-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)
117+
// CL12-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)
118+
// CL12-NEXT: store i64 5, ptr addrspace(5) [[VAR]], align 8
119+
// CL12-NEXT: store ptr addrspace(5) [[VAR]], ptr addrspace(5) [[ALLOCA_ADDR]], align 4
120+
// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[ALLOCA_ADDR]], align 4
121+
// CL12-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8
122+
// CL12-NEXT: ret void
123+
//
124+
// CL20-LABEL: define dso_local void @wrong_store_type_private_pointer_alloca(
125+
// CL20-SAME: ) #[[ATTR0]] {
126+
// CL20-NEXT: [[ENTRY:.*:]]
127+
// CL20-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)
128+
// CL20-NEXT: [[ALLOCA_ADDR:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)
129+
// CL20-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr
130+
// CL20-NEXT: [[ALLOCA_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR]] to ptr
131+
// CL20-NEXT: store i64 5, ptr [[VAR_ASCAST]], align 8
132+
// CL20-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_ASCAST]], align 4
133+
// CL20-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr [[ALLOCA_ADDR_ASCAST]], align 4
134+
// CL20-NEXT: store i64 8, ptr addrspace(5) [[TMP0]], align 8
135+
// CL20-NEXT: ret void
136+
//
137+
void wrong_store_type_private_pointer_alloca() {
138+
long var = 5;
139+
140+
// This needs to write an addrspace(5) pointer to the temporary alloca,
141+
// which should be allocated with the correct size.
142+
__private long *alloca_addr = &var;
143+
*alloca_addr = 8;
144+
}
145+
146+
// CL12-LABEL: define dso_local void @wrong_store_type_private_pointer_as_generic_alloca(
147+
// CL12-SAME: ) #[[ATTR0]] {
148+
// CL12-NEXT: [[ENTRY:.*:]]
149+
// CL12-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)
150+
// CL12-NEXT: [[ALLOCA_ADDR_AS_GENERIC:%.*]] = alloca ptr addrspace(5), align 4, addrspace(5)
151+
// CL12-NEXT: store i64 5, ptr addrspace(5) [[VAR]], align 8
152+
// CL12-NEXT: store ptr addrspace(5) [[VAR]], ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]], align 4
153+
// CL12-NEXT: [[TMP0:%.*]] = load ptr addrspace(5), ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]], align 4
154+
// CL12-NEXT: store i64 9, ptr addrspace(5) [[TMP0]], align 8
155+
// CL12-NEXT: ret void
156+
//
157+
// CL20-LABEL: define dso_local void @wrong_store_type_private_pointer_as_generic_alloca(
158+
// CL20-SAME: ) #[[ATTR0]] {
159+
// CL20-NEXT: [[ENTRY:.*:]]
160+
// CL20-NEXT: [[VAR:%.*]] = alloca i64, align 8, addrspace(5)
161+
// CL20-NEXT: [[ALLOCA_ADDR_AS_GENERIC:%.*]] = alloca ptr, align 8, addrspace(5)
162+
// CL20-NEXT: [[VAR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[VAR]] to ptr
163+
// CL20-NEXT: [[ALLOCA_ADDR_AS_GENERIC_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA_ADDR_AS_GENERIC]] to ptr
164+
// CL20-NEXT: store i64 5, ptr [[VAR_ASCAST]], align 8
165+
// CL20-NEXT: store ptr [[VAR_ASCAST]], ptr [[ALLOCA_ADDR_AS_GENERIC_ASCAST]], align 8
166+
// CL20-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ALLOCA_ADDR_AS_GENERIC_ASCAST]], align 8
167+
// CL20-NEXT: store i64 9, ptr [[TMP0]], align 8
168+
// CL20-NEXT: ret void
169+
//
170+
void wrong_store_type_private_pointer_as_generic_alloca() {
171+
long var = 5;
172+
173+
// This needs to write an addrspace(0) pointer to the temporary alloca in
174+
// CL2.0, which should be allocated with the correct size.
175+
long *alloca_addr_as_generic = &var;
176+
*alloca_addr_as_generic = 9;
177+
}

0 commit comments

Comments
 (0)