1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=0 < %s | FileCheck -check-prefix=VARABI %s
3; RUN: llc -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=1 < %s | FileCheck -check-prefixes=FIXEDABI,FIXEDABI-SDAG %s
4; RUN: llc -global-isel -amdhsa-code-object-version=3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -amdgpu-fixed-function-abi=1 < %s | FileCheck -check-prefixes=FIXEDABI,FIXEDABI-GISEL %s
5
6; Test with gfx803 so that
7; addrspacecast/llvm.amdgcn.is.shared/llvm.amdgcn.is.private require
8; the queue ptr.  Tests with code object v3 to test
9; llvm.trap/llvm.debugtrap that require the queue ptr.
10
11
12declare hidden void @requires_all_inputs()
13
14; This function incorrectly is marked with the hints that the callee
15; does not require the implicit arguments to the function. Make sure
16; we do not crash.
17define void @parent_func_missing_inputs() #0 {
18; VARABI-LABEL: parent_func_missing_inputs:
19; VARABI:       ; %bb.0:
20; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
21; VARABI-NEXT:    s_or_saveexec_b64 s[4:5], -1
22; VARABI-NEXT:    buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill
23; VARABI-NEXT:    s_mov_b64 exec, s[4:5]
24; VARABI-NEXT:    v_writelane_b32 v40, s33, 2
25; VARABI-NEXT:    s_mov_b32 s33, s32
26; VARABI-NEXT:    s_addk_i32 s32, 0x400
27; VARABI-NEXT:    v_writelane_b32 v40, s30, 0
28; VARABI-NEXT:    v_writelane_b32 v40, s31, 1
29; VARABI-NEXT:    s_getpc_b64 s[4:5]
30; VARABI-NEXT:    s_add_u32 s4, s4, requires_all_inputs@rel32@lo+4
31; VARABI-NEXT:    s_addc_u32 s5, s5, requires_all_inputs@rel32@hi+12
32; VARABI-NEXT:    s_swappc_b64 s[30:31], s[4:5]
33; VARABI-NEXT:    v_readlane_b32 s4, v40, 0
34; VARABI-NEXT:    v_readlane_b32 s5, v40, 1
35; VARABI-NEXT:    s_addk_i32 s32, 0xfc00
36; VARABI-NEXT:    v_readlane_b32 s33, v40, 2
37; VARABI-NEXT:    s_or_saveexec_b64 s[6:7], -1
38; VARABI-NEXT:    buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload
39; VARABI-NEXT:    s_mov_b64 exec, s[6:7]
40; VARABI-NEXT:    s_waitcnt vmcnt(0)
41; VARABI-NEXT:    s_setpc_b64 s[4:5]
42;
43; FIXEDABI-LABEL: parent_func_missing_inputs:
44; FIXEDABI:       ; %bb.0:
45; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
46; FIXEDABI-NEXT:    s_or_saveexec_b64 s[16:17], -1
47; FIXEDABI-NEXT:    buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill
48; FIXEDABI-NEXT:    s_mov_b64 exec, s[16:17]
49; FIXEDABI-NEXT:    v_writelane_b32 v40, s33, 2
50; FIXEDABI-NEXT:    s_mov_b32 s33, s32
51; FIXEDABI-NEXT:    s_addk_i32 s32, 0x400
52; FIXEDABI-NEXT:    v_writelane_b32 v40, s30, 0
53; FIXEDABI-NEXT:    v_writelane_b32 v40, s31, 1
54; FIXEDABI-NEXT:    s_getpc_b64 s[16:17]
55; FIXEDABI-NEXT:    s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4
56; FIXEDABI-NEXT:    s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12
57; FIXEDABI-NEXT:    s_swappc_b64 s[30:31], s[16:17]
58; FIXEDABI-NEXT:    v_readlane_b32 s4, v40, 0
59; FIXEDABI-NEXT:    v_readlane_b32 s5, v40, 1
60; FIXEDABI-NEXT:    s_addk_i32 s32, 0xfc00
61; FIXEDABI-NEXT:    v_readlane_b32 s33, v40, 2
62; FIXEDABI-NEXT:    s_or_saveexec_b64 s[6:7], -1
63; FIXEDABI-NEXT:    buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload
64; FIXEDABI-NEXT:    s_mov_b64 exec, s[6:7]
65; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
66; FIXEDABI-NEXT:    s_setpc_b64 s[4:5]
67  call void @requires_all_inputs()
68  ret void
69}
70
71define amdgpu_kernel void @parent_kernel_missing_inputs() #0 {
72; VARABI-LABEL: parent_kernel_missing_inputs:
73; VARABI:       ; %bb.0:
74; VARABI-NEXT:    s_add_i32 s4, s4, s9
75; VARABI-NEXT:    s_lshr_b32 flat_scratch_hi, s4, 8
76; VARABI-NEXT:    s_add_u32 s0, s0, s9
77; VARABI-NEXT:    s_addc_u32 s1, s1, 0
78; VARABI-NEXT:    s_mov_b32 s32, 0
79; VARABI-NEXT:    s_mov_b32 flat_scratch_lo, s5
80; VARABI-NEXT:    s_getpc_b64 s[4:5]
81; VARABI-NEXT:    s_add_u32 s4, s4, requires_all_inputs@rel32@lo+4
82; VARABI-NEXT:    s_addc_u32 s5, s5, requires_all_inputs@rel32@hi+12
83; VARABI-NEXT:    s_swappc_b64 s[30:31], s[4:5]
84; VARABI-NEXT:    s_endpgm
85;
86; FIXEDABI-SDAG-LABEL: parent_kernel_missing_inputs:
87; FIXEDABI-SDAG:       ; %bb.0:
88; FIXEDABI-SDAG-NEXT:    s_add_i32 s10, s10, s15
89; FIXEDABI-SDAG-NEXT:    s_lshr_b32 flat_scratch_hi, s10, 8
90; FIXEDABI-SDAG-NEXT:    v_lshlrev_b32_e32 v1, 10, v1
91; FIXEDABI-SDAG-NEXT:    s_add_u32 s0, s0, s15
92; FIXEDABI-SDAG-NEXT:    v_lshlrev_b32_e32 v2, 20, v2
93; FIXEDABI-SDAG-NEXT:    v_or_b32_e32 v0, v0, v1
94; FIXEDABI-SDAG-NEXT:    s_mov_b32 flat_scratch_lo, s11
95; FIXEDABI-SDAG-NEXT:    s_addc_u32 s1, s1, 0
96; FIXEDABI-SDAG-NEXT:    s_mov_b64 s[10:11], s[8:9]
97; FIXEDABI-SDAG-NEXT:    v_or_b32_e32 v31, v0, v2
98; FIXEDABI-SDAG-NEXT:    s_mov_b64 s[8:9], 0
99; FIXEDABI-SDAG-NEXT:    s_mov_b32 s32, 0
100; FIXEDABI-SDAG-NEXT:    s_getpc_b64 s[16:17]
101; FIXEDABI-SDAG-NEXT:    s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4
102; FIXEDABI-SDAG-NEXT:    s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12
103; FIXEDABI-SDAG-NEXT:    s_swappc_b64 s[30:31], s[16:17]
104; FIXEDABI-SDAG-NEXT:    s_endpgm
105;
106; FIXEDABI-GISEL-LABEL: parent_kernel_missing_inputs:
107; FIXEDABI-GISEL:       ; %bb.0:
108; FIXEDABI-GISEL-NEXT:    s_add_i32 s10, s10, s15
109; FIXEDABI-GISEL-NEXT:    s_lshr_b32 flat_scratch_hi, s10, 8
110; FIXEDABI-GISEL-NEXT:    v_lshlrev_b32_e32 v1, 10, v1
111; FIXEDABI-GISEL-NEXT:    s_add_u32 s0, s0, s15
112; FIXEDABI-GISEL-NEXT:    v_or_b32_e32 v0, v0, v1
113; FIXEDABI-GISEL-NEXT:    v_lshlrev_b32_e32 v1, 20, v2
114; FIXEDABI-GISEL-NEXT:    s_mov_b32 flat_scratch_lo, s11
115; FIXEDABI-GISEL-NEXT:    s_addc_u32 s1, s1, 0
116; FIXEDABI-GISEL-NEXT:    s_mov_b64 s[10:11], s[8:9]
117; FIXEDABI-GISEL-NEXT:    v_or_b32_e32 v31, v0, v1
118; FIXEDABI-GISEL-NEXT:    s_mov_b64 s[8:9], 0
119; FIXEDABI-GISEL-NEXT:    s_mov_b32 s32, 0
120; FIXEDABI-GISEL-NEXT:    s_getpc_b64 s[16:17]
121; FIXEDABI-GISEL-NEXT:    s_add_u32 s16, s16, requires_all_inputs@rel32@lo+4
122; FIXEDABI-GISEL-NEXT:    s_addc_u32 s17, s17, requires_all_inputs@rel32@hi+12
123; FIXEDABI-GISEL-NEXT:    s_swappc_b64 s[30:31], s[16:17]
124; FIXEDABI-GISEL-NEXT:    s_endpgm
125  call void @requires_all_inputs()
126  ret void
127}
128
129; Function is marked with amdgpu-no-workitem-id-* but uses them anyway
130define void @marked_func_use_workitem_id(i32 addrspace(1)* %ptr) #0 {
131; VARABI-LABEL: marked_func_use_workitem_id:
132; VARABI:       ; %bb.0:
133; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
134; VARABI-NEXT:    v_and_b32_e32 v3, 0x3ff, v2
135; VARABI-NEXT:    flat_store_dword v[0:1], v3
136; VARABI-NEXT:    s_waitcnt vmcnt(0)
137; VARABI-NEXT:    v_bfe_u32 v3, v2, 10, 10
138; VARABI-NEXT:    v_bfe_u32 v2, v2, 20, 10
139; VARABI-NEXT:    flat_store_dword v[0:1], v3
140; VARABI-NEXT:    s_waitcnt vmcnt(0)
141; VARABI-NEXT:    flat_store_dword v[0:1], v2
142; VARABI-NEXT:    s_waitcnt vmcnt(0)
143; VARABI-NEXT:    s_setpc_b64 s[30:31]
144;
145; FIXEDABI-SDAG-LABEL: marked_func_use_workitem_id:
146; FIXEDABI-SDAG:       ; %bb.0:
147; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
148; FIXEDABI-SDAG-NEXT:    v_and_b32_e32 v2, 0x3ff, v31
149; FIXEDABI-SDAG-NEXT:    flat_store_dword v[0:1], v2
150; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0)
151; FIXEDABI-SDAG-NEXT:    v_bfe_u32 v2, v31, 10, 10
152; FIXEDABI-SDAG-NEXT:    flat_store_dword v[0:1], v2
153; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0)
154; FIXEDABI-SDAG-NEXT:    v_bfe_u32 v2, v31, 20, 10
155; FIXEDABI-SDAG-NEXT:    flat_store_dword v[0:1], v2
156; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0)
157; FIXEDABI-SDAG-NEXT:    s_setpc_b64 s[30:31]
158;
159; FIXEDABI-GISEL-LABEL: marked_func_use_workitem_id:
160; FIXEDABI-GISEL:       ; %bb.0:
161; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
162; FIXEDABI-GISEL-NEXT:    v_and_b32_e32 v2, 0x3ff, v31
163; FIXEDABI-GISEL-NEXT:    v_bfe_u32 v3, v31, 10, 10
164; FIXEDABI-GISEL-NEXT:    v_bfe_u32 v4, v31, 20, 10
165; FIXEDABI-GISEL-NEXT:    flat_store_dword v[0:1], v2
166; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0)
167; FIXEDABI-GISEL-NEXT:    flat_store_dword v[0:1], v3
168; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0)
169; FIXEDABI-GISEL-NEXT:    flat_store_dword v[0:1], v4
170; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0)
171; FIXEDABI-GISEL-NEXT:    s_setpc_b64 s[30:31]
172  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
173  %id.y = call i32 @llvm.amdgcn.workitem.id.y()
174  %id.z = call i32 @llvm.amdgcn.workitem.id.z()
175  store volatile i32 %id.x, i32 addrspace(1)* %ptr
176  store volatile i32 %id.y, i32 addrspace(1)* %ptr
177  store volatile i32 %id.z, i32 addrspace(1)* %ptr
178  ret void
179}
180
181; Function is marked with amdgpu-no-workitem-id-* but uses them anyway
182define amdgpu_kernel void @marked_kernel_use_workitem_id(i32 addrspace(1)* %ptr) #0 {
183; VARABI-LABEL: marked_kernel_use_workitem_id:
184; VARABI:       ; %bb.0:
185; VARABI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
186; VARABI-NEXT:    s_waitcnt lgkmcnt(0)
187; VARABI-NEXT:    v_mov_b32_e32 v4, s1
188; VARABI-NEXT:    v_mov_b32_e32 v3, s0
189; VARABI-NEXT:    flat_store_dword v[3:4], v0
190; VARABI-NEXT:    s_waitcnt vmcnt(0)
191; VARABI-NEXT:    flat_store_dword v[3:4], v1
192; VARABI-NEXT:    s_waitcnt vmcnt(0)
193; VARABI-NEXT:    flat_store_dword v[3:4], v2
194; VARABI-NEXT:    s_waitcnt vmcnt(0)
195; VARABI-NEXT:    s_endpgm
196;
197; FIXEDABI-LABEL: marked_kernel_use_workitem_id:
198; FIXEDABI:       ; %bb.0:
199; FIXEDABI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
200; FIXEDABI-NEXT:    s_waitcnt lgkmcnt(0)
201; FIXEDABI-NEXT:    v_mov_b32_e32 v4, s1
202; FIXEDABI-NEXT:    v_mov_b32_e32 v3, s0
203; FIXEDABI-NEXT:    flat_store_dword v[3:4], v0
204; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
205; FIXEDABI-NEXT:    flat_store_dword v[3:4], v1
206; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
207; FIXEDABI-NEXT:    flat_store_dword v[3:4], v2
208; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
209; FIXEDABI-NEXT:    s_endpgm
210  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
211  %id.y = call i32 @llvm.amdgcn.workitem.id.y()
212  %id.z = call i32 @llvm.amdgcn.workitem.id.z()
213  store volatile i32 %id.x, i32 addrspace(1)* %ptr
214  store volatile i32 %id.y, i32 addrspace(1)* %ptr
215  store volatile i32 %id.z, i32 addrspace(1)* %ptr
216  ret void
217}
218
219define void @marked_func_use_workgroup_id(i32 addrspace(1)* %ptr) #0 {
220; VARABI-LABEL: marked_func_use_workgroup_id:
221; VARABI:       ; %bb.0:
222; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
223; VARABI-NEXT:    v_mov_b32_e32 v2, s4
224; VARABI-NEXT:    flat_store_dword v[0:1], v2
225; VARABI-NEXT:    s_waitcnt vmcnt(0)
226; VARABI-NEXT:    v_mov_b32_e32 v2, s5
227; VARABI-NEXT:    flat_store_dword v[0:1], v2
228; VARABI-NEXT:    s_waitcnt vmcnt(0)
229; VARABI-NEXT:    v_mov_b32_e32 v2, s6
230; VARABI-NEXT:    flat_store_dword v[0:1], v2
231; VARABI-NEXT:    s_waitcnt vmcnt(0)
232; VARABI-NEXT:    s_setpc_b64 s[30:31]
233;
234; FIXEDABI-LABEL: marked_func_use_workgroup_id:
235; FIXEDABI:       ; %bb.0:
236; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s12
238; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
239; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
240; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s13
241; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
242; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
243; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s14
244; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
245; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
246; FIXEDABI-NEXT:    s_setpc_b64 s[30:31]
247  %id.x = call i32 @llvm.amdgcn.workgroup.id.x()
248  %id.y = call i32 @llvm.amdgcn.workgroup.id.y()
249  %id.z = call i32 @llvm.amdgcn.workgroup.id.z()
250  store volatile i32 %id.x, i32 addrspace(1)* %ptr
251  store volatile i32 %id.y, i32 addrspace(1)* %ptr
252  store volatile i32 %id.z, i32 addrspace(1)* %ptr
253  ret void
254}
255
256define amdgpu_kernel void @marked_kernel_use_workgroup_id(i32 addrspace(1)* %ptr) #0 {
257; VARABI-LABEL: marked_kernel_use_workgroup_id:
258; VARABI:       ; %bb.0:
259; VARABI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
260; VARABI-NEXT:    v_mov_b32_e32 v2, s6
261; VARABI-NEXT:    s_waitcnt lgkmcnt(0)
262; VARABI-NEXT:    v_mov_b32_e32 v0, s0
263; VARABI-NEXT:    v_mov_b32_e32 v1, s1
264; VARABI-NEXT:    flat_store_dword v[0:1], v2
265; VARABI-NEXT:    s_waitcnt vmcnt(0)
266; VARABI-NEXT:    v_mov_b32_e32 v2, s7
267; VARABI-NEXT:    flat_store_dword v[0:1], v2
268; VARABI-NEXT:    s_waitcnt vmcnt(0)
269; VARABI-NEXT:    v_mov_b32_e32 v2, s8
270; VARABI-NEXT:    flat_store_dword v[0:1], v2
271; VARABI-NEXT:    s_waitcnt vmcnt(0)
272; VARABI-NEXT:    s_endpgm
273;
274; FIXEDABI-LABEL: marked_kernel_use_workgroup_id:
275; FIXEDABI:       ; %bb.0:
276; FIXEDABI-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
277; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s6
278; FIXEDABI-NEXT:    s_waitcnt lgkmcnt(0)
279; FIXEDABI-NEXT:    v_mov_b32_e32 v0, s0
280; FIXEDABI-NEXT:    v_mov_b32_e32 v1, s1
281; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
282; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
283; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s7
284; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
285; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
286; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s8
287; FIXEDABI-NEXT:    flat_store_dword v[0:1], v2
288; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
289; FIXEDABI-NEXT:    s_endpgm
290  %id.x = call i32 @llvm.amdgcn.workgroup.id.x()
291  %id.y = call i32 @llvm.amdgcn.workgroup.id.y()
292  %id.z = call i32 @llvm.amdgcn.workgroup.id.z()
293  store volatile i32 %id.x, i32 addrspace(1)* %ptr
294  store volatile i32 %id.y, i32 addrspace(1)* %ptr
295  store volatile i32 %id.z, i32 addrspace(1)* %ptr
296  ret void
297}
298
299define void @marked_func_use_other_sgpr(i64 addrspace(1)* %ptr) #0 {
300; VARABI-LABEL: marked_func_use_other_sgpr:
301; VARABI:       ; %bb.0:
302; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
303; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
304; VARABI-NEXT:    s_waitcnt vmcnt(0)
305; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
306; VARABI-NEXT:    s_waitcnt vmcnt(0)
307; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
308; VARABI-NEXT:    s_waitcnt vmcnt(0)
309; VARABI-NEXT:    s_setpc_b64 s[30:31]
310;
311; FIXEDABI-LABEL: marked_func_use_other_sgpr:
312; FIXEDABI:       ; %bb.0:
313; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
314; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s6
315; FIXEDABI-NEXT:    v_mov_b32_e32 v3, s7
316; FIXEDABI-NEXT:    flat_load_ubyte v2, v[2:3] glc
317; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
318; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s8
319; FIXEDABI-NEXT:    v_mov_b32_e32 v3, s9
320; FIXEDABI-NEXT:    flat_load_ubyte v2, v[2:3] glc
321; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
322; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s4
323; FIXEDABI-NEXT:    v_mov_b32_e32 v3, s5
324; FIXEDABI-NEXT:    flat_load_ubyte v2, v[2:3] glc
325; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
326; FIXEDABI-NEXT:    v_mov_b32_e32 v2, s10
327; FIXEDABI-NEXT:    v_mov_b32_e32 v3, s11
328; FIXEDABI-NEXT:    flat_store_dwordx2 v[0:1], v[2:3]
329; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
330; FIXEDABI-NEXT:    s_setpc_b64 s[30:31]
331  %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
332  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
333  %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
334  %dispatch.id = call i64 @llvm.amdgcn.dispatch.id()
335  %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr
336  %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr
337  %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr
338  store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr
339  ret void
340}
341
342define amdgpu_kernel void @marked_kernel_use_other_sgpr(i64 addrspace(1)* %ptr) #0 {
343; VARABI-LABEL: marked_kernel_use_other_sgpr:
344; VARABI:       ; %bb.0:
345; VARABI-NEXT:    s_add_u32 s0, s4, 8
346; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
347; VARABI-NEXT:    s_addc_u32 s1, s5, 0
348; VARABI-NEXT:    s_waitcnt vmcnt(0)
349; VARABI-NEXT:    v_mov_b32_e32 v0, s0
350; VARABI-NEXT:    v_mov_b32_e32 v1, s1
351; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
352; VARABI-NEXT:    s_waitcnt vmcnt(0)
353; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
354; VARABI-NEXT:    s_endpgm
355;
356; FIXEDABI-LABEL: marked_kernel_use_other_sgpr:
357; FIXEDABI:       ; %bb.0:
358; FIXEDABI-NEXT:    s_add_u32 s0, s4, 8
359; FIXEDABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
360; FIXEDABI-NEXT:    s_addc_u32 s1, s5, 0
361; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
362; FIXEDABI-NEXT:    v_mov_b32_e32 v0, s0
363; FIXEDABI-NEXT:    v_mov_b32_e32 v1, s1
364; FIXEDABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
365; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
366; FIXEDABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
367; FIXEDABI-NEXT:    s_endpgm
368  %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
369  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
370  %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
371  %dispatch.id = call i64 @llvm.amdgcn.dispatch.id()
372  %queue.load = load volatile i8, i8 addrspace(4)* %queue.ptr
373  %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr
374  %dispatch.load = load volatile i8, i8 addrspace(4)* %dispatch.ptr
375  store volatile i64 %dispatch.id, i64 addrspace(1)* %ptr
376  ret void
377}
378
379define amdgpu_kernel void @marked_kernel_nokernargs_implicitarg_ptr() #0 {
380; VARABI-LABEL: marked_kernel_nokernargs_implicitarg_ptr:
381; VARABI:       ; %bb.0:
382; VARABI-NEXT:    v_mov_b32_e32 v0, 0
383; VARABI-NEXT:    v_mov_b32_e32 v1, 0
384; VARABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
385; VARABI-NEXT:    s_endpgm
386;
387; FIXEDABI-LABEL: marked_kernel_nokernargs_implicitarg_ptr:
388; FIXEDABI:       ; %bb.0:
389; FIXEDABI-NEXT:    v_mov_b32_e32 v0, 0
390; FIXEDABI-NEXT:    v_mov_b32_e32 v1, 0
391; FIXEDABI-NEXT:    flat_load_ubyte v0, v[0:1] glc
392; FIXEDABI-NEXT:    s_endpgm
393  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
394  %implicitarg.load = load volatile i8, i8 addrspace(4)* %implicitarg.ptr
395  ret void
396}
397
398; On gfx8, the queue ptr is required for this addrspacecast.
399define void @addrspacecast_requires_queue_ptr(i32 addrspace(5)* %ptr.private, i32 addrspace(3)* %ptr.local) #0 {
400; VARABI-LABEL: addrspacecast_requires_queue_ptr:
401; VARABI:       ; %bb.0:
402; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
403; VARABI-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v0
404; VARABI-NEXT:    v_mov_b32_e32 v3, 0
405; VARABI-NEXT:    v_cndmask_b32_e32 v2, 0, v0, vcc
406; VARABI-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v1
407; VARABI-NEXT:    v_mov_b32_e32 v4, 1
408; VARABI-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc
409; VARABI-NEXT:    v_mov_b32_e32 v1, v3
410; VARABI-NEXT:    flat_store_dword v[2:3], v4
411; VARABI-NEXT:    s_waitcnt vmcnt(0)
412; VARABI-NEXT:    v_mov_b32_e32 v2, 2
413; VARABI-NEXT:    flat_store_dword v[0:1], v2
414; VARABI-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
415; VARABI-NEXT:    s_setpc_b64 s[30:31]
416;
417; FIXEDABI-SDAG-LABEL: addrspacecast_requires_queue_ptr:
418; FIXEDABI-SDAG:       ; %bb.0:
419; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
420; FIXEDABI-SDAG-NEXT:    s_load_dword s4, s[6:7], 0x40
421; FIXEDABI-SDAG-NEXT:    s_load_dword s5, s[6:7], 0x44
422; FIXEDABI-SDAG-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v0
423; FIXEDABI-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
424; FIXEDABI-SDAG-NEXT:    v_mov_b32_e32 v2, s5
425; FIXEDABI-SDAG-NEXT:    v_cndmask_b32_e32 v3, 0, v2, vcc
426; FIXEDABI-SDAG-NEXT:    v_cndmask_b32_e32 v2, 0, v0, vcc
427; FIXEDABI-SDAG-NEXT:    v_mov_b32_e32 v0, s4
428; FIXEDABI-SDAG-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v1
429; FIXEDABI-SDAG-NEXT:    v_cndmask_b32_e32 v5, 0, v0, vcc
430; FIXEDABI-SDAG-NEXT:    v_mov_b32_e32 v0, 1
431; FIXEDABI-SDAG-NEXT:    v_cndmask_b32_e32 v4, 0, v1, vcc
432; FIXEDABI-SDAG-NEXT:    flat_store_dword v[2:3], v0
433; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0)
434; FIXEDABI-SDAG-NEXT:    v_mov_b32_e32 v0, 2
435; FIXEDABI-SDAG-NEXT:    flat_store_dword v[4:5], v0
436; FIXEDABI-SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
437; FIXEDABI-SDAG-NEXT:    s_setpc_b64 s[30:31]
438;
439; FIXEDABI-GISEL-LABEL: addrspacecast_requires_queue_ptr:
440; FIXEDABI-GISEL:       ; %bb.0:
441; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
442; FIXEDABI-GISEL-NEXT:    s_load_dword s4, s[6:7], 0x44
443; FIXEDABI-GISEL-NEXT:    s_load_dword s5, s[6:7], 0x40
444; FIXEDABI-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v0
445; FIXEDABI-GISEL-NEXT:    v_cndmask_b32_e32 v2, 0, v0, vcc
446; FIXEDABI-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
447; FIXEDABI-GISEL-NEXT:    v_mov_b32_e32 v3, s4
448; FIXEDABI-GISEL-NEXT:    v_cndmask_b32_e32 v3, 0, v3, vcc
449; FIXEDABI-GISEL-NEXT:    v_mov_b32_e32 v4, s5
450; FIXEDABI-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v1
451; FIXEDABI-GISEL-NEXT:    v_cndmask_b32_e32 v0, 0, v1, vcc
452; FIXEDABI-GISEL-NEXT:    v_cndmask_b32_e32 v1, 0, v4, vcc
453; FIXEDABI-GISEL-NEXT:    v_mov_b32_e32 v4, 1
454; FIXEDABI-GISEL-NEXT:    flat_store_dword v[2:3], v4
455; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0)
456; FIXEDABI-GISEL-NEXT:    v_mov_b32_e32 v2, 2
457; FIXEDABI-GISEL-NEXT:    flat_store_dword v[0:1], v2
458; FIXEDABI-GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
459; FIXEDABI-GISEL-NEXT:    s_setpc_b64 s[30:31]
460  %flat.private = addrspacecast i32 addrspace(5)* %ptr.private to i32*
461  %flat.local = addrspacecast i32 addrspace(3)* %ptr.local to i32*
462  store volatile i32 1, i32* %flat.private
463  store volatile i32 2, i32* %flat.local
464  ret void
465}
466
467define void @is_shared_requires_queue_ptr(i8* %ptr) #0 {
468; VARABI-LABEL: is_shared_requires_queue_ptr:
469; VARABI:       ; %bb.0:
470; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
471; VARABI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
472; VARABI-NEXT:    flat_store_dword v[0:1], v0
473; VARABI-NEXT:    s_waitcnt vmcnt(0)
474; VARABI-NEXT:    s_setpc_b64 s[30:31]
475;
476; FIXEDABI-LABEL: is_shared_requires_queue_ptr:
477; FIXEDABI:       ; %bb.0:
478; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
479; FIXEDABI-NEXT:    s_load_dword s4, s[6:7], 0x40
480; FIXEDABI-NEXT:    s_waitcnt lgkmcnt(0)
481; FIXEDABI-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v1
482; FIXEDABI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
483; FIXEDABI-NEXT:    flat_store_dword v[0:1], v0
484; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
485; FIXEDABI-NEXT:    s_setpc_b64 s[30:31]
486  %is.shared = call i1 @llvm.amdgcn.is.shared(i8* %ptr)
487  %zext = zext i1 %is.shared to i32
488  store volatile i32 %zext, i32 addrspace(1)* undef
489  ret void
490}
491
492define void @is_private_requires_queue_ptr(i8* %ptr) #0 {
493; VARABI-LABEL: is_private_requires_queue_ptr:
494; VARABI:       ; %bb.0:
495; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
496; VARABI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s[4:5]
497; VARABI-NEXT:    flat_store_dword v[0:1], v0
498; VARABI-NEXT:    s_waitcnt vmcnt(0)
499; VARABI-NEXT:    s_setpc_b64 s[30:31]
500;
501; FIXEDABI-LABEL: is_private_requires_queue_ptr:
502; FIXEDABI:       ; %bb.0:
503; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
504; FIXEDABI-NEXT:    s_load_dword s4, s[6:7], 0x44
505; FIXEDABI-NEXT:    s_waitcnt lgkmcnt(0)
506; FIXEDABI-NEXT:    v_cmp_eq_u32_e32 vcc, s4, v1
507; FIXEDABI-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
508; FIXEDABI-NEXT:    flat_store_dword v[0:1], v0
509; FIXEDABI-NEXT:    s_waitcnt vmcnt(0)
510; FIXEDABI-NEXT:    s_setpc_b64 s[30:31]
511  %is.private = call i1 @llvm.amdgcn.is.private(i8* %ptr)
512  %zext = zext i1 %is.private to i32
513  store volatile i32 %zext, i32 addrspace(1)* undef
514  ret void
515}
516
517define void @trap_requires_queue() #0 {
518; VARABI-LABEL: trap_requires_queue:
519; VARABI:       ; %bb.0:
520; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
521; VARABI-NEXT:    s_mov_b64 s[0:1], 0
522; VARABI-NEXT:    s_trap 2
523;
524; FIXEDABI-LABEL: trap_requires_queue:
525; FIXEDABI:       ; %bb.0:
526; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
527; FIXEDABI-NEXT:    s_mov_b64 s[0:1], s[6:7]
528; FIXEDABI-NEXT:    s_trap 2
529  call void @llvm.trap()
530  unreachable
531}
532
533define void @debugtrap_requires_queue() #0 {
534; VARABI-LABEL: debugtrap_requires_queue:
535; VARABI:       ; %bb.0:
536; VARABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
537; VARABI-NEXT:    s_trap 3
538;
539; FIXEDABI-LABEL: debugtrap_requires_queue:
540; FIXEDABI:       ; %bb.0:
541; FIXEDABI-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
542; FIXEDABI-NEXT:    s_trap 3
543  call void @llvm.debugtrap()
544  unreachable
545}
546
547declare i32 @llvm.amdgcn.workitem.id.x()
548declare i32 @llvm.amdgcn.workitem.id.y()
549declare i32 @llvm.amdgcn.workitem.id.z()
550declare i32 @llvm.amdgcn.workgroup.id.x()
551declare i32 @llvm.amdgcn.workgroup.id.y()
552declare i32 @llvm.amdgcn.workgroup.id.z()
553declare noalias i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
554declare noalias i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
555declare i64 @llvm.amdgcn.dispatch.id()
556declare noalias i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
557declare i1 @llvm.amdgcn.is.shared(i8*)
558declare i1 @llvm.amdgcn.is.private(i8*)
559declare void @llvm.trap()
560declare void @llvm.debugtrap()
561
562attributes #0 = { "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-queue-ptr" "amdgpu-no-work-group-id-x" "amdgpu-no-work-group-id-y" "amdgpu-no-work-group-id-z" "amdgpu-no-work-item-id-x" "amdgpu-no-work-item-id-y" "amdgpu-no-work-item-id-z" }
563