1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=-architected-sgprs -global-isel=0 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s
3 ; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=-architected-sgprs -global-isel=1 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s
4 ; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=+architected-sgprs -global-isel=0 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9ARCH,GFX9ARCH-SDAG %s
5 ; RUN: llc -mtriple=amdgcn-amd-hsa -mcpu=gfx900 -mattr=+architected-sgprs -global-isel=1 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX9ARCH,GFX9ARCH-GISEL %s
6 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 -global-isel=0 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s
7 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx1200 -global-isel=1 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s
9 define amdgpu_kernel void @workgroup_ids_kernel() {
10 ; GFX9-LABEL: workgroup_ids_kernel:
11 ; GFX9: ; %bb.0: ; %.entry
12 ; GFX9-NEXT: v_mov_b32_e32 v0, s8
13 ; GFX9-NEXT: v_mov_b32_e32 v1, s9
14 ; GFX9-NEXT: v_mov_b32_e32 v2, s10
15 ; GFX9-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 0
18 ; GFX9ARCH-SDAG-LABEL: workgroup_ids_kernel:
19 ; GFX9ARCH-SDAG: ; %bb.0: ; %.entry
20 ; GFX9ARCH-SDAG-NEXT: s_lshr_b32 s0, ttmp7, 16
21 ; GFX9ARCH-SDAG-NEXT: s_and_b32 s1, ttmp7, 0xffff
22 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, ttmp9
23 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v1, s1
24 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v2, s0
25 ; GFX9ARCH-SDAG-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 0
26 ; GFX9ARCH-SDAG-NEXT: s_endpgm
28 ; GFX9ARCH-GISEL-LABEL: workgroup_ids_kernel:
29 ; GFX9ARCH-GISEL: ; %bb.0: ; %.entry
30 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s0, ttmp9
31 ; GFX9ARCH-GISEL-NEXT: s_and_b32 s1, ttmp7, 0xffff
32 ; GFX9ARCH-GISEL-NEXT: s_lshr_b32 s2, ttmp7, 16
33 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s0
34 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v1, s1
35 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v2, s2
36 ; GFX9ARCH-GISEL-NEXT: buffer_store_dwordx3 v[0:2], off, s[0:3], 0
37 ; GFX9ARCH-GISEL-NEXT: s_endpgm
39 ; GFX12-SDAG-LABEL: workgroup_ids_kernel:
40 ; GFX12-SDAG: ; %bb.0: ; %.entry
41 ; GFX12-SDAG-NEXT: s_and_b32 s0, ttmp7, 0xffff
42 ; GFX12-SDAG-NEXT: s_lshr_b32 s1, ttmp7, 16
43 ; GFX12-SDAG-NEXT: v_dual_mov_b32 v0, ttmp9 :: v_dual_mov_b32 v1, s0
44 ; GFX12-SDAG-NEXT: v_mov_b32_e32 v2, s1
45 ; GFX12-SDAG-NEXT: buffer_store_b96 v[0:2], off, s[0:3], null
46 ; GFX12-SDAG-NEXT: s_endpgm
48 ; GFX12-GISEL-LABEL: workgroup_ids_kernel:
49 ; GFX12-GISEL: ; %bb.0: ; %.entry
50 ; GFX12-GISEL-NEXT: s_mov_b32 s0, ttmp9
51 ; GFX12-GISEL-NEXT: s_and_b32 s1, ttmp7, 0xffff
52 ; GFX12-GISEL-NEXT: s_lshr_b32 s2, ttmp7, 16
53 ; GFX12-GISEL-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
54 ; GFX12-GISEL-NEXT: v_mov_b32_e32 v2, s2
55 ; GFX12-GISEL-NEXT: buffer_store_b96 v[0:2], off, s[0:3], null
56 ; GFX12-GISEL-NEXT: s_endpgm
58 %idx = call i32 @llvm.amdgcn.workgroup.id.x()
59 %idy = call i32 @llvm.amdgcn.workgroup.id.y()
60 %idz = call i32 @llvm.amdgcn.workgroup.id.z()
61 %ielemx = insertelement <3 x i32> undef, i32 %idx, i64 0
62 %ielemy = insertelement <3 x i32> %ielemx, i32 %idy, i64 1
63 %ielemz = insertelement <3 x i32> %ielemy, i32 %idz, i64 2
64 call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> %ielemz, ptr addrspace(8) undef, i32 0, i32 0, i32 0)
68 define amdgpu_kernel void @caller() {
69 ; GFX9-SDAG-LABEL: caller:
71 ; GFX9-SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
72 ; GFX9-SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
73 ; GFX9-SDAG-NEXT: s_mov_b32 s38, -1
74 ; GFX9-SDAG-NEXT: s_mov_b32 s39, 0xe00000
75 ; GFX9-SDAG-NEXT: s_add_u32 s36, s36, s11
76 ; GFX9-SDAG-NEXT: s_addc_u32 s37, s37, 0
77 ; GFX9-SDAG-NEXT: s_mov_b32 s12, s8
78 ; GFX9-SDAG-NEXT: s_add_u32 s8, s4, 36
79 ; GFX9-SDAG-NEXT: s_addc_u32 s9, s5, 0
80 ; GFX9-SDAG-NEXT: s_getpc_b64 s[4:5]
81 ; GFX9-SDAG-NEXT: s_add_u32 s4, s4, callee@gotpcrel32@lo+4
82 ; GFX9-SDAG-NEXT: s_addc_u32 s5, s5, callee@gotpcrel32@hi+12
83 ; GFX9-SDAG-NEXT: s_load_dwordx2 s[14:15], s[4:5], 0x0
84 ; GFX9-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]
85 ; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2
86 ; GFX9-SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1
87 ; GFX9-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]
88 ; GFX9-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]
89 ; GFX9-SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
90 ; GFX9-SDAG-NEXT: v_or3_b32 v31, v0, v1, v2
91 ; GFX9-SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
92 ; GFX9-SDAG-NEXT: v_mov_b32_e32 v0, s12
93 ; GFX9-SDAG-NEXT: s_mov_b32 s32, 0
94 ; GFX9-SDAG-NEXT: s_waitcnt lgkmcnt(0)
95 ; GFX9-SDAG-NEXT: s_swappc_b64 s[30:31], s[14:15]
96 ; GFX9-SDAG-NEXT: s_endpgm
98 ; GFX9-GISEL-LABEL: caller:
99 ; GFX9-GISEL: ; %bb.0:
100 ; GFX9-GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
101 ; GFX9-GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
102 ; GFX9-GISEL-NEXT: s_mov_b32 s38, -1
103 ; GFX9-GISEL-NEXT: s_mov_b32 s39, 0xe00000
104 ; GFX9-GISEL-NEXT: s_add_u32 s36, s36, s11
105 ; GFX9-GISEL-NEXT: s_addc_u32 s37, s37, 0
106 ; GFX9-GISEL-NEXT: s_mov_b32 s14, s8
107 ; GFX9-GISEL-NEXT: s_add_u32 s8, s4, 36
108 ; GFX9-GISEL-NEXT: s_addc_u32 s9, s5, 0
109 ; GFX9-GISEL-NEXT: s_mov_b64 s[12:13], s[0:1]
110 ; GFX9-GISEL-NEXT: s_getpc_b64 s[0:1]
111 ; GFX9-GISEL-NEXT: s_add_u32 s0, s0, callee@gotpcrel32@lo+4
112 ; GFX9-GISEL-NEXT: s_addc_u32 s1, s1, callee@gotpcrel32@hi+12
113 ; GFX9-GISEL-NEXT: s_load_dwordx2 s[16:17], s[0:1], 0x0
114 ; GFX9-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]
115 ; GFX9-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]
116 ; GFX9-GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1
117 ; GFX9-GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2
118 ; GFX9-GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
119 ; GFX9-GISEL-NEXT: v_or3_b32 v31, v0, v1, v2
120 ; GFX9-GISEL-NEXT: v_mov_b32_e32 v0, s14
121 ; GFX9-GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
122 ; GFX9-GISEL-NEXT: s_mov_b64 s[4:5], s[12:13]
123 ; GFX9-GISEL-NEXT: s_mov_b32 s12, s14
124 ; GFX9-GISEL-NEXT: s_mov_b32 s32, 0
125 ; GFX9-GISEL-NEXT: s_waitcnt lgkmcnt(0)
126 ; GFX9-GISEL-NEXT: s_swappc_b64 s[30:31], s[16:17]
127 ; GFX9-GISEL-NEXT: s_endpgm
129 ; GFX9ARCH-SDAG-LABEL: caller:
130 ; GFX9ARCH-SDAG: ; %bb.0:
131 ; GFX9ARCH-SDAG-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
132 ; GFX9ARCH-SDAG-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
133 ; GFX9ARCH-SDAG-NEXT: s_mov_b32 s38, -1
134 ; GFX9ARCH-SDAG-NEXT: s_mov_b32 s39, 0xe00000
135 ; GFX9ARCH-SDAG-NEXT: s_add_u32 s36, s36, s8
136 ; GFX9ARCH-SDAG-NEXT: s_addc_u32 s37, s37, 0
137 ; GFX9ARCH-SDAG-NEXT: s_add_u32 s8, s4, 36
138 ; GFX9ARCH-SDAG-NEXT: s_addc_u32 s9, s5, 0
139 ; GFX9ARCH-SDAG-NEXT: s_getpc_b64 s[4:5]
140 ; GFX9ARCH-SDAG-NEXT: s_add_u32 s4, s4, callee@gotpcrel32@lo+4
141 ; GFX9ARCH-SDAG-NEXT: s_addc_u32 s5, s5, callee@gotpcrel32@hi+12
142 ; GFX9ARCH-SDAG-NEXT: s_load_dwordx2 s[12:13], s[4:5], 0x0
143 ; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]
144 ; GFX9ARCH-SDAG-NEXT: v_lshlrev_b32_e32 v2, 20, v2
145 ; GFX9ARCH-SDAG-NEXT: v_lshlrev_b32_e32 v1, 10, v1
146 ; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]
147 ; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]
148 ; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[0:1], s[36:37]
149 ; GFX9ARCH-SDAG-NEXT: v_or3_b32 v31, v0, v1, v2
150 ; GFX9ARCH-SDAG-NEXT: s_mov_b64 s[2:3], s[38:39]
151 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, ttmp9
152 ; GFX9ARCH-SDAG-NEXT: s_mov_b32 s32, 0
153 ; GFX9ARCH-SDAG-NEXT: s_waitcnt lgkmcnt(0)
154 ; GFX9ARCH-SDAG-NEXT: s_swappc_b64 s[30:31], s[12:13]
155 ; GFX9ARCH-SDAG-NEXT: s_endpgm
157 ; GFX9ARCH-GISEL-LABEL: caller:
158 ; GFX9ARCH-GISEL: ; %bb.0:
159 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s36, SCRATCH_RSRC_DWORD0
160 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s37, SCRATCH_RSRC_DWORD1
161 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s38, -1
162 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s39, 0xe00000
163 ; GFX9ARCH-GISEL-NEXT: s_add_u32 s36, s36, s8
164 ; GFX9ARCH-GISEL-NEXT: s_addc_u32 s37, s37, 0
165 ; GFX9ARCH-GISEL-NEXT: s_add_u32 s8, s4, 36
166 ; GFX9ARCH-GISEL-NEXT: s_addc_u32 s9, s5, 0
167 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[12:13], s[0:1]
168 ; GFX9ARCH-GISEL-NEXT: s_getpc_b64 s[0:1]
169 ; GFX9ARCH-GISEL-NEXT: s_add_u32 s0, s0, callee@gotpcrel32@lo+4
170 ; GFX9ARCH-GISEL-NEXT: s_addc_u32 s1, s1, callee@gotpcrel32@hi+12
171 ; GFX9ARCH-GISEL-NEXT: s_load_dwordx2 s[14:15], s[0:1], 0x0
172 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]
173 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]
174 ; GFX9ARCH-GISEL-NEXT: v_lshlrev_b32_e32 v1, 10, v1
175 ; GFX9ARCH-GISEL-NEXT: v_lshlrev_b32_e32 v2, 20, v2
176 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[0:1], s[36:37]
177 ; GFX9ARCH-GISEL-NEXT: v_or3_b32 v31, v0, v1, v2
178 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, ttmp9
179 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[2:3], s[38:39]
180 ; GFX9ARCH-GISEL-NEXT: s_mov_b64 s[4:5], s[12:13]
181 ; GFX9ARCH-GISEL-NEXT: s_mov_b32 s32, 0
182 ; GFX9ARCH-GISEL-NEXT: s_waitcnt lgkmcnt(0)
183 ; GFX9ARCH-GISEL-NEXT: s_swappc_b64 s[30:31], s[14:15]
184 ; GFX9ARCH-GISEL-NEXT: s_endpgm
186 ; GFX12-SDAG-LABEL: caller:
187 ; GFX12-SDAG: ; %bb.0:
188 ; GFX12-SDAG-NEXT: v_dual_mov_b32 v31, v0 :: v_dual_mov_b32 v0, ttmp9
189 ; GFX12-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]
190 ; GFX12-SDAG-NEXT: s_mov_b64 s[8:9], s[4:5]
191 ; GFX12-SDAG-NEXT: s_mov_b32 s13, callee@abs32@hi
192 ; GFX12-SDAG-NEXT: s_mov_b32 s12, callee@abs32@lo
193 ; GFX12-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]
194 ; GFX12-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]
195 ; GFX12-SDAG-NEXT: s_mov_b32 s32, 0
196 ; GFX12-SDAG-NEXT: s_swappc_b64 s[30:31], s[12:13]
197 ; GFX12-SDAG-NEXT: s_endpgm
199 ; GFX12-GISEL-LABEL: caller:
200 ; GFX12-GISEL: ; %bb.0:
201 ; GFX12-GISEL-NEXT: v_dual_mov_b32 v31, v0 :: v_dual_mov_b32 v0, ttmp9
202 ; GFX12-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]
203 ; GFX12-GISEL-NEXT: s_mov_b64 s[8:9], s[4:5]
204 ; GFX12-GISEL-NEXT: s_mov_b32 s12, callee@abs32@lo
205 ; GFX12-GISEL-NEXT: s_mov_b32 s13, callee@abs32@hi
206 ; GFX12-GISEL-NEXT: s_mov_b64 s[4:5], s[0:1]
207 ; GFX12-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]
208 ; GFX12-GISEL-NEXT: s_mov_b32 s32, 0
209 ; GFX12-GISEL-NEXT: s_swappc_b64 s[30:31], s[12:13]
210 ; GFX12-GISEL-NEXT: s_endpgm
211 %idx = call i32 @llvm.amdgcn.workgroup.id.x()
212 call void @callee(i32 %idx) #0
216 declare void @callee(i32) #0
218 define void @workgroup_ids_device_func(ptr addrspace(1) %outx, ptr addrspace(1) %outy, ptr addrspace(1) %outz) {
219 ; GFX9-LABEL: workgroup_ids_device_func:
221 ; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
222 ; GFX9-NEXT: v_mov_b32_e32 v6, s12
223 ; GFX9-NEXT: global_store_dword v[0:1], v6, off
224 ; GFX9-NEXT: s_waitcnt vmcnt(0)
225 ; GFX9-NEXT: v_mov_b32_e32 v0, s13
226 ; GFX9-NEXT: global_store_dword v[2:3], v0, off
227 ; GFX9-NEXT: s_waitcnt vmcnt(0)
228 ; GFX9-NEXT: v_mov_b32_e32 v0, s14
229 ; GFX9-NEXT: global_store_dword v[4:5], v0, off
230 ; GFX9-NEXT: s_waitcnt vmcnt(0)
231 ; GFX9-NEXT: s_setpc_b64 s[30:31]
233 ; GFX9ARCH-SDAG-LABEL: workgroup_ids_device_func:
234 ; GFX9ARCH-SDAG: ; %bb.0:
235 ; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
236 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v6, ttmp9
237 ; GFX9ARCH-SDAG-NEXT: s_and_b32 s4, ttmp7, 0xffff
238 ; GFX9ARCH-SDAG-NEXT: global_store_dword v[0:1], v6, off
239 ; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)
240 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, s4
241 ; GFX9ARCH-SDAG-NEXT: s_lshr_b32 s4, ttmp7, 16
242 ; GFX9ARCH-SDAG-NEXT: global_store_dword v[2:3], v0, off
243 ; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)
244 ; GFX9ARCH-SDAG-NEXT: v_mov_b32_e32 v0, s4
245 ; GFX9ARCH-SDAG-NEXT: global_store_dword v[4:5], v0, off
246 ; GFX9ARCH-SDAG-NEXT: s_waitcnt vmcnt(0)
247 ; GFX9ARCH-SDAG-NEXT: s_setpc_b64 s[30:31]
249 ; GFX9ARCH-GISEL-LABEL: workgroup_ids_device_func:
250 ; GFX9ARCH-GISEL: ; %bb.0:
251 ; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
252 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v6, ttmp9
253 ; GFX9ARCH-GISEL-NEXT: s_and_b32 s4, ttmp7, 0xffff
254 ; GFX9ARCH-GISEL-NEXT: s_lshr_b32 s5, ttmp7, 16
255 ; GFX9ARCH-GISEL-NEXT: global_store_dword v[0:1], v6, off
256 ; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)
257 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s4
258 ; GFX9ARCH-GISEL-NEXT: global_store_dword v[2:3], v0, off
259 ; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)
260 ; GFX9ARCH-GISEL-NEXT: v_mov_b32_e32 v0, s5
261 ; GFX9ARCH-GISEL-NEXT: global_store_dword v[4:5], v0, off
262 ; GFX9ARCH-GISEL-NEXT: s_waitcnt vmcnt(0)
263 ; GFX9ARCH-GISEL-NEXT: s_setpc_b64 s[30:31]
265 ; GFX12-LABEL: workgroup_ids_device_func:
267 ; GFX12-NEXT: s_wait_loadcnt_dscnt 0x0
268 ; GFX12-NEXT: s_wait_expcnt 0x0
269 ; GFX12-NEXT: s_wait_samplecnt 0x0
270 ; GFX12-NEXT: s_wait_bvhcnt 0x0
271 ; GFX12-NEXT: s_wait_kmcnt 0x0
272 ; GFX12-NEXT: s_and_b32 s0, ttmp7, 0xffff
273 ; GFX12-NEXT: s_wait_alu 0xfffe
274 ; GFX12-NEXT: v_dual_mov_b32 v6, ttmp9 :: v_dual_mov_b32 v7, s0
275 ; GFX12-NEXT: s_lshr_b32 s1, ttmp7, 16
276 ; GFX12-NEXT: s_wait_alu 0xfffe
277 ; GFX12-NEXT: v_mov_b32_e32 v8, s1
278 ; GFX12-NEXT: s_wait_storecnt 0x0
279 ; GFX12-NEXT: global_store_b32 v[0:1], v6, off scope:SCOPE_SYS
280 ; GFX12-NEXT: s_wait_storecnt 0x0
281 ; GFX12-NEXT: global_store_b32 v[2:3], v7, off scope:SCOPE_SYS
282 ; GFX12-NEXT: s_wait_storecnt 0x0
283 ; GFX12-NEXT: global_store_b32 v[4:5], v8, off scope:SCOPE_SYS
284 ; GFX12-NEXT: s_wait_storecnt 0x0
285 ; GFX12-NEXT: s_setpc_b64 s[30:31]
286 %id.x = call i32 @llvm.amdgcn.workgroup.id.x()
287 %id.y = call i32 @llvm.amdgcn.workgroup.id.y()
288 %id.z = call i32 @llvm.amdgcn.workgroup.id.z()
289 store volatile i32 %id.x, ptr addrspace(1) %outx
290 store volatile i32 %id.y, ptr addrspace(1) %outy
291 store volatile i32 %id.z, ptr addrspace(1) %outz
295 declare i32 @llvm.amdgcn.workgroup.id.x()
296 declare i32 @llvm.amdgcn.workgroup.id.y()
297 declare i32 @llvm.amdgcn.workgroup.id.z()
298 declare void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32>, ptr addrspace(8), i32, i32, i32 immarg)
300 attributes #0 = { nounwind "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" }
301 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: