1 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=kaveri -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CIVI %s
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-ipra=0 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s
4 ; GCN-LABEL: {{^}}use_dispatch_ptr:
5 ; GCN: s_load_dword s{{[0-9]+}}, s[4:5]
6 define hidden void @use_dispatch_ptr() #1 {
7 %dispatch_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
8 %header_ptr = bitcast i8 addrspace(4)* %dispatch_ptr to i32 addrspace(4)*
9 %value = load volatile i32, i32 addrspace(4)* %header_ptr
13 ; GCN-LABEL: {{^}}kern_indirect_use_dispatch_ptr:
17 ; GCN: .amdhsa_user_sgpr_dispatch_ptr 1
18 define amdgpu_kernel void @kern_indirect_use_dispatch_ptr(i32) #1 {
19 call void @use_dispatch_ptr()
23 ; GCN-LABEL: {{^}}use_queue_ptr:
24 ; GCN: s_load_dword s{{[0-9]+}}, s[6:7]
25 define hidden void @use_queue_ptr() #1 {
26 %queue_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
27 %header_ptr = bitcast i8 addrspace(4)* %queue_ptr to i32 addrspace(4)*
28 %value = load volatile i32, i32 addrspace(4)* %header_ptr
32 ; GCN-LABEL: {{^}}kern_indirect_use_queue_ptr:
33 ; GCN: s_mov_b64 s[6:7], s[4:5]
34 ; GCN: .amdhsa_user_sgpr_queue_ptr 1
35 define amdgpu_kernel void @kern_indirect_use_queue_ptr(i32) #1 {
36 call void @use_queue_ptr()
40 ; GCN-LABEL: {{^}}use_queue_ptr_addrspacecast:
41 ; CIVI: s_load_dword [[APERTURE_LOAD:s[0-9]+]], s[6:7], 0x10
42 ; GFX9: s_getreg_b32 [[APERTURE_LOAD:s[0-9]+]]
43 ; CIVI: v_mov_b32_e32 v[[LO:[0-9]+]], 16
44 ; GCN-DAG: v_mov_b32_e32 v[[HI:[0-9]+]], [[APERTURE_LOAD]]
45 ; GFX9: {{flat|global}}_store_dword v{{\[[0-9]+}}:[[HI]]]
46 ; CIVI: {{flat|global}}_store_dword v[[[LO]]:[[HI]]]
47 define hidden void @use_queue_ptr_addrspacecast() #1 {
48 %asc = addrspacecast i32 addrspace(3)* inttoptr (i32 16 to i32 addrspace(3)*) to i32*
49 store volatile i32 0, i32* %asc
53 ; GCN-LABEL: {{^}}kern_indirect_use_queue_ptr_addrspacecast:
54 ; CIVI: s_mov_b64 s[6:7], s[4:5]
55 ; CIVI: .amdhsa_user_sgpr_queue_ptr 1
57 ; GFX9-NOT: s_mov_b64 s[6:7]
58 ; GFX9: .amdhsa_user_sgpr_queue_ptr 0
59 define amdgpu_kernel void @kern_indirect_use_queue_ptr_addrspacecast(i32) #1 {
60 call void @use_queue_ptr_addrspacecast()
64 ; Not really supported in callable functions.
65 ; GCN-LABEL: {{^}}use_kernarg_segment_ptr:
66 ; GCN: s_mov_b64 [[PTR:s\[[0-9]+:[0-9]+\]]], 0
67 ; GCN: s_load_dword s{{[0-9]+}}, [[PTR]], 0x0
68 define hidden void @use_kernarg_segment_ptr() #1 {
69 %kernarg_segment_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #0
70 %header_ptr = bitcast i8 addrspace(4)* %kernarg_segment_ptr to i32 addrspace(4)*
71 %value = load volatile i32, i32 addrspace(4)* %header_ptr
75 ; GCN-LABEL: {{^}}use_implicitarg_ptr:
76 ; GCN: s_load_dword s{{[0-9]+}}, s[8:9]
77 define hidden void @use_implicitarg_ptr() #1 {
78 %implicit.arg.ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
79 %header_ptr = bitcast i8 addrspace(4)* %implicit.arg.ptr to i32 addrspace(4)*
80 %value = load volatile i32, i32 addrspace(4)* %header_ptr
84 ; GCN-LABEL: {{^}}kern_indirect_use_kernarg_segment_ptr:
85 ; GCN: .amdhsa_user_sgpr_kernarg_segment_ptr 1
86 define amdgpu_kernel void @kern_indirect_use_kernarg_segment_ptr(i32) #1 {
87 call void @use_kernarg_segment_ptr()
91 ; GCN-LABEL: {{^}}use_dispatch_id:
93 define hidden void @use_dispatch_id() #1 {
94 %id = call i64 @llvm.amdgcn.dispatch.id()
95 call void asm sideeffect "; use $0", "s"(i64 %id)
99 ; No kernarg segment so that there is a mov to check. With kernarg
100 ; pointer enabled, it happens to end up in the right place anyway.
102 ; GCN-LABEL: {{^}}kern_indirect_use_dispatch_id:
103 ; GCN: s_mov_b64 s[10:11], s[4:5]
104 ; GCN: .amdhsa_user_sgpr_dispatch_id 1
105 define amdgpu_kernel void @kern_indirect_use_dispatch_id() #1 {
106 call void @use_dispatch_id()
110 ; GCN-LABEL: {{^}}use_workgroup_id_x:
113 define hidden void @use_workgroup_id_x() #1 {
114 %val = call i32 @llvm.amdgcn.workgroup.id.x()
115 call void asm sideeffect "; use $0", "s"(i32 %val)
119 ; GCN-LABEL: {{^}}use_stack_workgroup_id_x:
122 ; GCN: buffer_store_dword v0, off, s[0:3], s32{{$}}
125 define hidden void @use_stack_workgroup_id_x() #1 {
126 %alloca = alloca i32, addrspace(5)
127 store volatile i32 0, i32 addrspace(5)* %alloca
128 %val = call i32 @llvm.amdgcn.workgroup.id.x()
129 call void asm sideeffect "; use $0", "s"(i32 %val)
133 ; GCN-LABEL: {{^}}use_workgroup_id_y:
136 define hidden void @use_workgroup_id_y() #1 {
137 %val = call i32 @llvm.amdgcn.workgroup.id.y()
138 call void asm sideeffect "; use $0", "s"(i32 %val)
142 ; GCN-LABEL: {{^}}use_workgroup_id_z:
145 define hidden void @use_workgroup_id_z() #1 {
146 %val = call i32 @llvm.amdgcn.workgroup.id.z()
147 call void asm sideeffect "; use $0", "s"(i32 %val)
151 ; GCN-LABEL: {{^}}use_workgroup_id_xy:
154 define hidden void @use_workgroup_id_xy() #1 {
155 %val0 = call i32 @llvm.amdgcn.workgroup.id.x()
156 %val1 = call i32 @llvm.amdgcn.workgroup.id.y()
157 call void asm sideeffect "; use $0", "s"(i32 %val0)
158 call void asm sideeffect "; use $0", "s"(i32 %val1)
162 ; GCN-LABEL: {{^}}use_workgroup_id_xyz:
166 define hidden void @use_workgroup_id_xyz() #1 {
167 %val0 = call i32 @llvm.amdgcn.workgroup.id.x()
168 %val1 = call i32 @llvm.amdgcn.workgroup.id.y()
169 %val2 = call i32 @llvm.amdgcn.workgroup.id.z()
170 call void asm sideeffect "; use $0", "s"(i32 %val0)
171 call void asm sideeffect "; use $0", "s"(i32 %val1)
172 call void asm sideeffect "; use $0", "s"(i32 %val2)
176 ; GCN-LABEL: {{^}}use_workgroup_id_xz:
179 define hidden void @use_workgroup_id_xz() #1 {
180 %val0 = call i32 @llvm.amdgcn.workgroup.id.x()
181 %val1 = call i32 @llvm.amdgcn.workgroup.id.z()
182 call void asm sideeffect "; use $0", "s"(i32 %val0)
183 call void asm sideeffect "; use $0", "s"(i32 %val1)
187 ; GCN-LABEL: {{^}}use_workgroup_id_yz:
190 define hidden void @use_workgroup_id_yz() #1 {
191 %val0 = call i32 @llvm.amdgcn.workgroup.id.y()
192 %val1 = call i32 @llvm.amdgcn.workgroup.id.z()
193 call void asm sideeffect "; use $0", "s"(i32 %val0)
194 call void asm sideeffect "; use $0", "s"(i32 %val1)
198 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_x:
200 ; GCN: s_mov_b32 s12, s6
201 ; GCN: s_mov_b32 s32, 0
202 ; GCN: s_getpc_b64 s[4:5]
203 ; GCN-NEXT: s_add_u32 s4, s4, use_workgroup_id_x@rel32@lo+4
204 ; GCN-NEXT: s_addc_u32 s5, s5, use_workgroup_id_x@rel32@hi+12
208 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
209 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 0
210 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 0
211 define amdgpu_kernel void @kern_indirect_use_workgroup_id_x() #1 {
212 call void @use_workgroup_id_x()
216 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_y:
218 ; GCN: s_mov_b32 s13, s7
220 ; GCN: s_mov_b32 s32, 0
223 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
224 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
225 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 0
226 define amdgpu_kernel void @kern_indirect_use_workgroup_id_y() #1 {
227 call void @use_workgroup_id_y()
231 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_z:
234 ; GCN: s_mov_b32 s14, s7
238 ; GCN: s_mov_b32 s32, 0
241 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
242 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 0
243 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
244 define amdgpu_kernel void @kern_indirect_use_workgroup_id_z() #1 {
245 call void @use_workgroup_id_z()
249 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_xy:
251 ; GCN: s_mov_b32 s12, s6
252 ; GCN-NEXT: s_mov_b32 s13, s7
255 ; GCN: s_mov_b32 s32, 0
258 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
259 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
260 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 0
261 define amdgpu_kernel void @kern_indirect_use_workgroup_id_xy() #1 {
262 call void @use_workgroup_id_xy()
266 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_xyz:
267 ; GCN: s_mov_b32 s12, s6
268 ; GCN: s_mov_b32 s13, s7
269 ; GCN: s_mov_b32 s14, s8
270 ; GCN: s_mov_b32 s32, 0
273 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
274 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
275 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
276 define amdgpu_kernel void @kern_indirect_use_workgroup_id_xyz() #1 {
277 call void @use_workgroup_id_xyz()
281 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_xz:
284 ; GCN: s_mov_b32 s12, s6
285 ; GCN-NEXT: s_mov_b32 s14, s7
288 ; GCN: s_mov_b32 s32, 0
291 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
292 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 0
293 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
294 define amdgpu_kernel void @kern_indirect_use_workgroup_id_xz() #1 {
295 call void @use_workgroup_id_xz()
299 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_yz:
301 ; GCN: s_mov_b32 s13, s7
302 ; GCN: s_mov_b32 s14, s8
304 ; GCN: s_mov_b32 s32, 0
307 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
308 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
309 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
310 define amdgpu_kernel void @kern_indirect_use_workgroup_id_yz() #1 {
311 call void @use_workgroup_id_yz()
315 ; Argument is in right place already
316 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_x:
320 ; GCN: v_readlane_b32 s30, v40, 0
321 define hidden void @func_indirect_use_workgroup_id_x() #1 {
322 call void @use_workgroup_id_x()
326 ; Argument is in right place already. We are free to clobber other
328 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_y:
332 define hidden void @func_indirect_use_workgroup_id_y() #1 {
333 call void @use_workgroup_id_y()
337 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_z:
341 define hidden void @func_indirect_use_workgroup_id_z() #1 {
342 call void @use_workgroup_id_z()
346 ; GCN-LABEL: {{^}}other_arg_use_workgroup_id_x:
347 ; CIVI: flat_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0
348 ; GFX9: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0, off
350 define hidden void @other_arg_use_workgroup_id_x(i32 %arg0) #1 {
351 %val = call i32 @llvm.amdgcn.workgroup.id.x()
352 store volatile i32 %arg0, i32 addrspace(1)* undef
353 call void asm sideeffect "; use $0", "s"(i32 %val)
357 ; GCN-LABEL: {{^}}other_arg_use_workgroup_id_y:
358 ; CIVI: flat_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0
359 ; GFX9: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0, off
361 define hidden void @other_arg_use_workgroup_id_y(i32 %arg0) #1 {
362 %val = call i32 @llvm.amdgcn.workgroup.id.y()
363 store volatile i32 %arg0, i32 addrspace(1)* undef
364 call void asm sideeffect "; use $0", "s"(i32 %val)
368 ; GCN-LABEL: {{^}}other_arg_use_workgroup_id_z:
369 ; CIVI: flat_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0
370 ; GFX9: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, v0, off
372 define hidden void @other_arg_use_workgroup_id_z(i32 %arg0) #1 {
373 %val = call i32 @llvm.amdgcn.workgroup.id.z()
374 store volatile i32 %arg0, i32 addrspace(1)* undef
375 call void asm sideeffect "; use $0", "s"(i32 %val)
379 ; GCN-LABEL: {{^}}kern_indirect_other_arg_use_workgroup_id_x:
383 ; GCN-DAG: s_mov_b32 s12, s6
384 ; GCN-DAG: v_mov_b32_e32 v0, 0x22b
388 ; GCN-DAG: s_mov_b32 s32, 0
391 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
392 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 0
393 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 0
394 define amdgpu_kernel void @kern_indirect_other_arg_use_workgroup_id_x() #1 {
395 call void @other_arg_use_workgroup_id_x(i32 555)
399 ; GCN-LABEL: {{^}}kern_indirect_other_arg_use_workgroup_id_y:
400 ; GCN-DAG: v_mov_b32_e32 v0, 0x22b
401 ; GCN-DAG: s_mov_b32 s13, s7
403 ; GCN-DAG: s_mov_b32 s32, 0
406 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
407 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
408 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 0
409 define amdgpu_kernel void @kern_indirect_other_arg_use_workgroup_id_y() #1 {
410 call void @other_arg_use_workgroup_id_y(i32 555)
414 ; GCN-LABEL: {{^}}kern_indirect_other_arg_use_workgroup_id_z:
415 ; GCN-DAG: v_mov_b32_e32 v0, 0x22b
416 ; GCN-DAG: s_mov_b32 s14, s7
418 ; GCN: s_mov_b32 s32, 0
421 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
422 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 0
423 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
424 define amdgpu_kernel void @kern_indirect_other_arg_use_workgroup_id_z() #1 {
425 call void @other_arg_use_workgroup_id_z(i32 555)
429 ; GCN-LABEL: {{^}}use_every_sgpr_input:
430 ; GCN: buffer_store_dword v{{[0-9]+}}, off, s[0:3], s32{{$}}
431 ; GCN: s_load_dword s{{[0-9]+}}, s[4:5]
432 ; GCN: s_load_dword s{{[0-9]+}}, s[6:7]
433 ; GCN: s_load_dword s{{[0-9]+}}, s[8:9]
434 ; GCN: ; use s[10:11]
438 define hidden void @use_every_sgpr_input() #1 {
439 %alloca = alloca i32, align 4, addrspace(5)
440 store volatile i32 0, i32 addrspace(5)* %alloca
442 %dispatch_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
443 %dispatch_ptr.bc = bitcast i8 addrspace(4)* %dispatch_ptr to i32 addrspace(4)*
444 %val0 = load volatile i32, i32 addrspace(4)* %dispatch_ptr.bc
446 %queue_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
447 %queue_ptr.bc = bitcast i8 addrspace(4)* %queue_ptr to i32 addrspace(4)*
448 %val1 = load volatile i32, i32 addrspace(4)* %queue_ptr.bc
450 %implicitarg.ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
451 %implicitarg.ptr.bc = bitcast i8 addrspace(4)* %implicitarg.ptr to i32 addrspace(4)*
452 %val2 = load volatile i32, i32 addrspace(4)* %implicitarg.ptr.bc
454 %val3 = call i64 @llvm.amdgcn.dispatch.id()
455 call void asm sideeffect "; use $0", "s"(i64 %val3)
457 %val4 = call i32 @llvm.amdgcn.workgroup.id.x()
458 call void asm sideeffect "; use $0", "s"(i32 %val4)
460 %val5 = call i32 @llvm.amdgcn.workgroup.id.y()
461 call void asm sideeffect "; use $0", "s"(i32 %val5)
463 %val6 = call i32 @llvm.amdgcn.workgroup.id.z()
464 call void asm sideeffect "; use $0", "s"(i32 %val6)
469 ; GCN-LABEL: {{^}}kern_indirect_use_every_sgpr_input:
470 ; GCN: s_mov_b32 s13, s15
471 ; GCN: s_mov_b32 s12, s14
472 ; GCN: s_mov_b32 s14, s16
473 ; GCN: s_mov_b32 s32, 0
476 ; GCN: .amdhsa_user_sgpr_private_segment_buffer 1
477 ; GCN: .amdhsa_user_sgpr_dispatch_ptr 1
478 ; GCN: .amdhsa_user_sgpr_queue_ptr 1
479 ; GCN: .amdhsa_user_sgpr_kernarg_segment_ptr 1
480 ; GCN: .amdhsa_user_sgpr_dispatch_id 1
481 ; GCN: .amdhsa_user_sgpr_flat_scratch_init 1
482 ; GCN: .amdhsa_user_sgpr_private_segment_size 0
483 ; GCN: .amdhsa_system_sgpr_private_segment_wavefront_offset 1
484 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
485 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
486 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
487 ; GCN: .amdhsa_system_sgpr_workgroup_info 0
488 ; GCN: .amdhsa_system_vgpr_workitem_id 0
489 define amdgpu_kernel void @kern_indirect_use_every_sgpr_input(i8) #1 {
490 call void @use_every_sgpr_input()
494 ; We have to pass the kernarg segment, but there are no kernel
495 ; arguments so null is passed.
496 ; GCN-LABEL: {{^}}kern_indirect_use_every_sgpr_input_no_kernargs:
497 ; GCN: s_mov_b64 s[10:11], s[8:9]
498 ; GCN: s_mov_b64 s[8:9], 0{{$}}
499 ; GCN: s_mov_b32 s32, 0
502 ; GCN: .amdhsa_user_sgpr_private_segment_buffer 1
503 ; GCN: .amdhsa_user_sgpr_dispatch_ptr 1
504 ; GCN: .amdhsa_user_sgpr_queue_ptr 1
505 ; GCN: .amdhsa_user_sgpr_kernarg_segment_ptr 0
506 ; GCN: .amdhsa_user_sgpr_dispatch_id 1
507 ; GCN: .amdhsa_user_sgpr_flat_scratch_init 1
508 ; GCN: .amdhsa_user_sgpr_private_segment_size 0
509 ; GCN: .amdhsa_system_sgpr_private_segment_wavefront_offset 1
510 ; GCN: .amdhsa_system_sgpr_workgroup_id_x 1
511 ; GCN: .amdhsa_system_sgpr_workgroup_id_y 1
512 ; GCN: .amdhsa_system_sgpr_workgroup_id_z 1
513 ; GCN: .amdhsa_system_sgpr_workgroup_info 0
514 ; GCN: .amdhsa_system_vgpr_workitem_id 0
515 define amdgpu_kernel void @kern_indirect_use_every_sgpr_input_no_kernargs() #2 {
516 call void @use_every_sgpr_input()
520 ; GCN-LABEL: {{^}}func_indirect_use_every_sgpr_input:
534 ; GCN: s_or_saveexec_b64 s[16:17], -1
535 define hidden void @func_indirect_use_every_sgpr_input() #1 {
536 call void @use_every_sgpr_input()
540 ; GCN-LABEL: {{^}}func_use_every_sgpr_input_call_use_workgroup_id_xyz:
544 ; GCN: ; use s[10:11]
550 define hidden void @func_use_every_sgpr_input_call_use_workgroup_id_xyz() #1 {
551 %alloca = alloca i32, align 4, addrspace(5)
552 store volatile i32 0, i32 addrspace(5)* %alloca
554 %dispatch_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
555 %dispatch_ptr.bc = bitcast i8 addrspace(4)* %dispatch_ptr to i32 addrspace(4)*
556 %val0 = load volatile i32, i32 addrspace(4)* %dispatch_ptr.bc
558 %queue_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
559 %queue_ptr.bc = bitcast i8 addrspace(4)* %queue_ptr to i32 addrspace(4)*
560 %val1 = load volatile i32, i32 addrspace(4)* %queue_ptr.bc
562 %kernarg_segment_ptr = call noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
563 %kernarg_segment_ptr.bc = bitcast i8 addrspace(4)* %kernarg_segment_ptr to i32 addrspace(4)*
564 %val2 = load volatile i32, i32 addrspace(4)* %kernarg_segment_ptr.bc
566 %val3 = call i64 @llvm.amdgcn.dispatch.id()
567 call void asm sideeffect "; use $0", "s"(i64 %val3)
569 %val4 = call i32 @llvm.amdgcn.workgroup.id.x()
570 call void asm sideeffect "; use $0", "s"(i32 %val4)
572 %val5 = call i32 @llvm.amdgcn.workgroup.id.y()
573 call void asm sideeffect "; use $0", "s"(i32 %val5)
575 %val6 = call i32 @llvm.amdgcn.workgroup.id.z()
576 call void asm sideeffect "; use $0", "s"(i32 %val6)
578 call void @use_workgroup_id_xyz()
582 declare i32 @llvm.amdgcn.workgroup.id.x() #0
583 declare i32 @llvm.amdgcn.workgroup.id.y() #0
584 declare i32 @llvm.amdgcn.workgroup.id.z() #0
585 declare noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
586 declare noalias i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #0
587 declare noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
588 declare i64 @llvm.amdgcn.dispatch.id() #0
589 declare noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
591 attributes #0 = { nounwind readnone speculatable }
592 attributes #1 = { nounwind noinline }
593 attributes #2 = { nounwind noinline "amdgpu-implicitarg-num-bytes"="0" }