@@ -109,3 +109,69 @@ void func2(void) {
109109void 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