@@ -243,3 +243,88 @@ define void @foo(ptr addrspace(3) %val) {
243243 ret void
244244}
245245
246+ define void @kernel_argument_promotion_pattern_intra_procedure (ptr %p , i32 %val ) {
247+ ; CHECK-LABEL: define void @kernel_argument_promotion_pattern_intra_procedure(
248+ ; CHECK-SAME: ptr [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
249+ ; CHECK-NEXT: [[P_CAST_0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(1)
250+ ; CHECK-NEXT: store i32 [[VAL]], ptr addrspace(1) [[P_CAST_0]], align 4
251+ ; CHECK-NEXT: ret void
252+ ;
253+ %p.cast.0 = addrspacecast ptr %p to ptr addrspace (1 )
254+ %p.cast.1 = addrspacecast ptr addrspace (1 ) %p.cast.0 to ptr
255+ store i32 %val , ptr %p.cast.1
256+ ret void
257+ }
258+
259+ define internal void @use_argument_after_promotion (ptr %p , i32 %val ) {
260+ ; CHECK-LABEL: define internal void @use_argument_after_promotion(
261+ ; CHECK-SAME: ptr [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
262+ ; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(1)
263+ ; CHECK-NEXT: store i32 [[VAL]], ptr addrspace(1) [[TMP1]], align 4
264+ ; CHECK-NEXT: ret void
265+ ;
266+ store i32 %val , ptr %p
267+ ret void
268+ }
269+
270+ define void @kernel_argument_promotion_pattern_inter_procedure (ptr %p , i32 %val ) {
271+ ; CHECK-LABEL: define void @kernel_argument_promotion_pattern_inter_procedure(
272+ ; CHECK-SAME: ptr [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
273+ ; CHECK-NEXT: call void @use_argument_after_promotion(ptr [[P]], i32 [[VAL]])
274+ ; CHECK-NEXT: ret void
275+ ;
276+ %p.cast.0 = addrspacecast ptr %p to ptr addrspace (1 )
277+ %p.cast.1 = addrspacecast ptr addrspace (1 ) %p.cast.0 to ptr
278+ call void @use_argument_after_promotion (ptr %p.cast.1 , i32 %val )
279+ ret void
280+ }
281+
282+ define void @vec_kernel_argument_promotion_pattern_intra_procedure (<2 x ptr > %p , i32 %val ) {
283+ ; CHECK-LABEL: define void @vec_kernel_argument_promotion_pattern_intra_procedure(
284+ ; CHECK-SAME: <2 x ptr> [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
285+ ; CHECK-NEXT: [[P_CAST_0:%.*]] = addrspacecast <2 x ptr> [[P]] to <2 x ptr addrspace(1)>
286+ ; CHECK-NEXT: [[P_CAST_1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[P_CAST_0]] to <2 x ptr>
287+ ; CHECK-NEXT: [[P1:%.*]] = extractelement <2 x ptr> [[P_CAST_1]], i32 0
288+ ; CHECK-NEXT: [[P2:%.*]] = extractelement <2 x ptr> [[P_CAST_1]], i32 1
289+ ; CHECK-NEXT: store i32 [[VAL]], ptr [[P1]], align 4
290+ ; CHECK-NEXT: store i32 [[VAL]], ptr [[P2]], align 4
291+ ; CHECK-NEXT: ret void
292+ ;
293+ %p.cast.0 = addrspacecast <2 x ptr > %p to <2 x ptr addrspace (1 )>
294+ %p.cast.1 = addrspacecast <2 x ptr addrspace (1 )> %p.cast.0 to <2 x ptr >
295+ %p1 = extractelement <2 x ptr > %p.cast.1 , i32 0
296+ %p2 = extractelement <2 x ptr > %p.cast.1 , i32 1
297+ store i32 %val , ptr %p1
298+ store i32 %val , ptr %p2
299+ ret void
300+ }
301+
302+ define internal void @use_vec_argument_after_promotion (<2 x ptr > %p , i32 %val ) {
303+ ; CHECK-LABEL: define internal void @use_vec_argument_after_promotion(
304+ ; CHECK-SAME: <2 x ptr> [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
305+ ; CHECK-NEXT: [[P1:%.*]] = extractelement <2 x ptr> [[P]], i32 0
306+ ; CHECK-NEXT: [[P2:%.*]] = extractelement <2 x ptr> [[P]], i32 1
307+ ; CHECK-NEXT: store i32 [[VAL]], ptr [[P1]], align 4
308+ ; CHECK-NEXT: store i32 [[VAL]], ptr [[P2]], align 4
309+ ; CHECK-NEXT: ret void
310+ ;
311+ %p1 = extractelement <2 x ptr > %p , i32 0
312+ %p2 = extractelement <2 x ptr > %p , i32 1
313+ store i32 %val , ptr %p1
314+ store i32 %val , ptr %p2
315+ ret void
316+ }
317+
318+ define void @vec_kernel_argument_promotion_pattern_inter_procedure (<2 x ptr > %p , i32 %val ) {
319+ ; CHECK-LABEL: define void @vec_kernel_argument_promotion_pattern_inter_procedure(
320+ ; CHECK-SAME: <2 x ptr> [[P:%.*]], i32 [[VAL:%.*]]) #[[ATTR0]] {
321+ ; CHECK-NEXT: [[P_CAST_0:%.*]] = addrspacecast <2 x ptr> [[P]] to <2 x ptr addrspace(1)>
322+ ; CHECK-NEXT: [[P_CAST_1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[P_CAST_0]] to <2 x ptr>
323+ ; CHECK-NEXT: call void @use_vec_argument_after_promotion(<2 x ptr> [[P_CAST_1]], i32 [[VAL]])
324+ ; CHECK-NEXT: ret void
325+ ;
326+ %p.cast.0 = addrspacecast <2 x ptr > %p to <2 x ptr addrspace (1 )>
327+ %p.cast.1 = addrspacecast <2 x ptr addrspace (1 )> %p.cast.0 to <2 x ptr >
328+ call void @use_vec_argument_after_promotion (<2 x ptr > %p.cast.1 , i32 %val )
329+ ret void
330+ }
0 commit comments