Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / callee-special-input-sgprs-fixed-abi.ll
blob3f0c627641ac9cc3e7c0b3d405952baa0f90b320
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
10   ret void
13 ; GCN-LABEL: {{^}}kern_indirect_use_dispatch_ptr:
14 ; GCN-NOT: s[4:5]
15 ; GCN-NOT: s4
16 ; GCN-NOT: s5
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()
20   ret void
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
29   ret void
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()
37   ret void
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
50   ret void
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()
61   ret void
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
72   ret void
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
81   ret void
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()
88   ret void
91 ; GCN-LABEL: {{^}}use_dispatch_id:
92 ; GCN: ; use s[10:11]
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)
96   ret void
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()
107   ret void
110 ; GCN-LABEL: {{^}}use_workgroup_id_x:
111 ; GCN: s_waitcnt
112 ; GCN: ; use s12
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)
116   ret void
119 ; GCN-LABEL: {{^}}use_stack_workgroup_id_x:
120 ; GCN: s_waitcnt
121 ; GCN-NOT: s32
122 ; GCN: buffer_store_dword v0, off, s[0:3], s32{{$}}
123 ; GCN: ; use s12
124 ; GCN: s_setpc_b64
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)
130   ret void
133 ; GCN-LABEL: {{^}}use_workgroup_id_y:
134 ; GCN: s_waitcnt
135 ; GCN: ; use s13
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)
139   ret void
142 ; GCN-LABEL: {{^}}use_workgroup_id_z:
143 ; GCN: s_waitcnt
144 ; GCN: ; use s14
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)
148   ret void
151 ; GCN-LABEL: {{^}}use_workgroup_id_xy:
152 ; GCN: ; use s12
153 ; GCN: ; use s13
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)
159   ret void
162 ; GCN-LABEL: {{^}}use_workgroup_id_xyz:
163 ; GCN: ; use s12
164 ; GCN: ; use s13
165 ; GCN: ; use s14
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)
173   ret void
176 ; GCN-LABEL: {{^}}use_workgroup_id_xz:
177 ; GCN: ; use s12
178 ; GCN: ; use s14
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)
184   ret void
187 ; GCN-LABEL: {{^}}use_workgroup_id_yz:
188 ; GCN: ; use s13
189 ; GCN: ; use s14
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)
195   ret void
198 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_x:
199 ; GCN-NOT: s6
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
205 ; GCN: s_swappc_b64
206 ; GCN-NEXT: s_endpgm
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()
213   ret void
216 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_y:
217 ; GCN-NOT: s12
218 ; GCN: s_mov_b32 s13, s7
219 ; GCN-NOT: s12
220 ; GCN: s_mov_b32 s32, 0
221 ; GCN: s_swappc_b64
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()
228   ret void
231 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_z:
232 ; GCN-NOT: s12
233 ; GCN-NOT: s13
234 ; GCN: s_mov_b32 s14, s7
235 ; GCN-NOT: s12
236 ; GCN-NOT: s13
238 ; GCN: s_mov_b32 s32, 0
239 ; GCN: s_swappc_b64
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()
246   ret void
249 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_xy:
250 ; GCN-NOT: s14
251 ; GCN: s_mov_b32 s12, s6
252 ; GCN-NEXT: s_mov_b32 s13, s7
253 ; GCN-NOT: s14
255 ; GCN: s_mov_b32 s32, 0
256 ; GCN: s_swappc_b64
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()
263   ret void
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
271 ; GCN: s_swappc_b64
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()
278   ret void
281 ; GCN-LABEL: {{^}}kern_indirect_use_workgroup_id_xz:
283 ; GCN-NOT: s13
284 ; GCN: s_mov_b32 s12, s6
285 ; GCN-NEXT: s_mov_b32 s14, s7
286 ; GCN-NOT: s13
288 ; GCN: s_mov_b32 s32, 0
289 ; GCN: s_swappc_b64
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()
296   ret void
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
305 ; GCN: s_swappc_b64
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()
312   ret void
315 ; Argument is in right place already
316 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_x:
317 ; GCN-NOT: s12
318 ; GCN-NOT: s13
319 ; GCN-NOT: s14
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()
323   ret void
326 ; Argument is in right place already. We are free to clobber other
327 ; SGPR arguments
328 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_y:
329 ; GCN-NOT: s12
330 ; GCN-NOT: s13
331 ; GCN-NOT: s14
332 define hidden void @func_indirect_use_workgroup_id_y() #1 {
333   call void @use_workgroup_id_y()
334   ret void
337 ; GCN-LABEL: {{^}}func_indirect_use_workgroup_id_z:
338 ; GCN-NOT: s12
339 ; GCN-NOT: s13
340 ; GCN-NOT: s14
341 define hidden void @func_indirect_use_workgroup_id_z() #1 {
342   call void @use_workgroup_id_z()
343   ret void
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
349 ; GCN: ; use s12
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)
354   ret void
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
360 ; GCN: ; use s13
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)
365   ret void
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
371 ; GCN: ; use s14
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)
376   ret void
379 ; GCN-LABEL: {{^}}kern_indirect_other_arg_use_workgroup_id_x:
381 ; GCN-NOT: s13
382 ; GCN-NOT: s14
383 ; GCN-DAG: s_mov_b32 s12, s6
384 ; GCN-DAG: v_mov_b32_e32 v0, 0x22b
385 ; GCN-NOT: s13
386 ; GCN-NOT: s14
388 ; GCN-DAG: s_mov_b32 s32, 0
389 ; GCN: s_swappc_b64
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)
396   ret void
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
404 ; GCN: s_swappc_b64
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)
411   ret void
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
419 ; GCN: s_swappc_b64
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)
426   ret void
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]
435 ; GCN: ; use s12
436 ; GCN: ; use s13
437 ; GCN: ; use s14
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)
466   ret void
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
474 ; GCN: s_swappc_b64
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()
491   ret void
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
500 ; GCN: s_swappc_b64
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()
517   ret void
520 ; GCN-LABEL: {{^}}func_indirect_use_every_sgpr_input:
521 ; GCN-NOT: s6
522 ; GCN-NOT: s7
523 ; GCN-NOT: s8
524 ; GCN-NOT: s9
525 ; GCN-NOT: s10
526 ; GCN-NOT: s11
527 ; GCN-NOT: s12
528 ; GCN-NOT: s13
529 ; GCN-NOT: s[6:7]
530 ; GCN-NOT: s[8:9]
531 ; GCN-NOT: s[10:11]
532 ; GCN-NOT: s[12:13]
533 ; GCN-NOT: s14
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()
537   ret void
540 ; GCN-LABEL: {{^}}func_use_every_sgpr_input_call_use_workgroup_id_xyz:
541 ; GCN-NOT: s12
542 ; GCN-NOT: s13
543 ; GCN-NOT: s14
544 ; GCN: ; use s[10:11]
545 ; GCN: ; use s12
546 ; GCN: ; use s13
547 ; GCN: ; use s14
549 ; GCN: s_swappc_b64
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()
579   ret void
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" }