[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / mubuf-global.ll
blob31526bcfead4e76623c2d420088c2e0955fe8cc3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -amdgpu-atomic-optimizer-strategy=None < %s | FileCheck -check-prefix=GFX6 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii -amdgpu-atomic-optimizer-strategy=None < %s | FileCheck -check-prefix=GFX7 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1200 -amdgpu-atomic-optimizer-strategy=None < %s | FileCheck -check-prefix=GFX12 %s
6 ; Test end to end matching of addressing modes when MUBUF is used for
7 ; global memory.
9 define amdgpu_ps void @mubuf_store_sgpr_ptr(ptr addrspace(1) inreg %ptr) {
10 ; GFX6-LABEL: mubuf_store_sgpr_ptr:
11 ; GFX6:       ; %bb.0:
12 ; GFX6-NEXT:    s_mov_b32 s0, s2
13 ; GFX6-NEXT:    s_mov_b32 s1, s3
14 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
15 ; GFX6-NEXT:    s_mov_b32 s2, -1
16 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
17 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
18 ; GFX6-NEXT:    s_endpgm
20 ; GFX7-LABEL: mubuf_store_sgpr_ptr:
21 ; GFX7:       ; %bb.0:
22 ; GFX7-NEXT:    s_mov_b32 s0, s2
23 ; GFX7-NEXT:    s_mov_b32 s1, s3
24 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
25 ; GFX7-NEXT:    s_mov_b32 s2, -1
26 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
27 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
28 ; GFX7-NEXT:    s_endpgm
30 ; GFX12-LABEL: mubuf_store_sgpr_ptr:
31 ; GFX12:       ; %bb.0:
32 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
33 ; GFX12-NEXT:    global_store_b32 v0, v0, s[2:3]
34 ; GFX12-NEXT:    s_endpgm
35   store i32 0, ptr addrspace(1) %ptr
36   ret void
39 define amdgpu_ps void @mubuf_store_sgpr_ptr_offset4095(ptr addrspace(1) inreg %ptr) {
40 ; GFX6-LABEL: mubuf_store_sgpr_ptr_offset4095:
41 ; GFX6:       ; %bb.0:
42 ; GFX6-NEXT:    s_mov_b32 s0, s2
43 ; GFX6-NEXT:    s_mov_b32 s1, s3
44 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
45 ; GFX6-NEXT:    s_mov_b32 s2, -1
46 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
47 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
48 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], s4
49 ; GFX6-NEXT:    s_endpgm
51 ; GFX7-LABEL: mubuf_store_sgpr_ptr_offset4095:
52 ; GFX7:       ; %bb.0:
53 ; GFX7-NEXT:    s_mov_b32 s0, s2
54 ; GFX7-NEXT:    s_mov_b32 s1, s3
55 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
56 ; GFX7-NEXT:    s_mov_b32 s2, -1
57 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
58 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
59 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], s4
60 ; GFX7-NEXT:    s_endpgm
62 ; GFX12-LABEL: mubuf_store_sgpr_ptr_offset4095:
63 ; GFX12:       ; %bb.0:
64 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
65 ; GFX12-NEXT:    global_store_b32 v0, v0, s[2:3] offset:16380
66 ; GFX12-NEXT:    s_endpgm
67   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
68   store i32 0, ptr addrspace(1) %gep
69   ret void
72 define amdgpu_ps void @mubuf_store_sgpr_ptr_offset4294967296(ptr addrspace(1) inreg %ptr) {
73 ; GFX6-LABEL: mubuf_store_sgpr_ptr_offset4294967296:
74 ; GFX6:       ; %bb.0:
75 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
76 ; GFX6-NEXT:    s_mov_b32 s0, s2
77 ; GFX6-NEXT:    s_mov_b32 s1, s3
78 ; GFX6-NEXT:    s_mov_b32 s2, 0
79 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
80 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4
81 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
82 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
83 ; GFX6-NEXT:    s_endpgm
85 ; GFX7-LABEL: mubuf_store_sgpr_ptr_offset4294967296:
86 ; GFX7:       ; %bb.0:
87 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
88 ; GFX7-NEXT:    s_mov_b32 s0, s2
89 ; GFX7-NEXT:    s_mov_b32 s1, s3
90 ; GFX7-NEXT:    s_mov_b32 s2, 0
91 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
92 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4
93 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
94 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
95 ; GFX7-NEXT:    s_endpgm
97 ; GFX12-LABEL: mubuf_store_sgpr_ptr_offset4294967296:
98 ; GFX12:       ; %bb.0:
99 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 0
100 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
101 ; GFX12-NEXT:    v_mov_b32_e32 v0, s0
102 ; GFX12-NEXT:    v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, s1
103 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
104 ; GFX12-NEXT:    s_endpgm
105   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
106   store i32 0, ptr addrspace(1) %gep
107   ret void
110 define amdgpu_ps void @mubuf_store_sgpr_ptr_offset4294967297(ptr addrspace(1) inreg %ptr) {
111 ; GFX6-LABEL: mubuf_store_sgpr_ptr_offset4294967297:
112 ; GFX6:       ; %bb.0:
113 ; GFX6-NEXT:    v_mov_b32_e32 v0, 4
114 ; GFX6-NEXT:    s_mov_b32 s0, s2
115 ; GFX6-NEXT:    s_mov_b32 s1, s3
116 ; GFX6-NEXT:    s_mov_b32 s2, 0
117 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
118 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4
119 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
120 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
121 ; GFX6-NEXT:    s_endpgm
123 ; GFX7-LABEL: mubuf_store_sgpr_ptr_offset4294967297:
124 ; GFX7:       ; %bb.0:
125 ; GFX7-NEXT:    v_mov_b32_e32 v0, 4
126 ; GFX7-NEXT:    s_mov_b32 s0, s2
127 ; GFX7-NEXT:    s_mov_b32 s1, s3
128 ; GFX7-NEXT:    s_mov_b32 s2, 0
129 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
130 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4
131 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
132 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
133 ; GFX7-NEXT:    s_endpgm
135 ; GFX12-LABEL: mubuf_store_sgpr_ptr_offset4294967297:
136 ; GFX12:       ; %bb.0:
137 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 4
138 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
139 ; GFX12-NEXT:    v_mov_b32_e32 v0, s0
140 ; GFX12-NEXT:    v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v1, s1
141 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
142 ; GFX12-NEXT:    s_endpgm
143   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967297
144   store i32 0, ptr addrspace(1) %gep
145   ret void
148 define amdgpu_ps void @mubuf_store_sgpr_ptr_offset4096(ptr addrspace(1) inreg %ptr) {
149 ; GFX6-LABEL: mubuf_store_sgpr_ptr_offset4096:
150 ; GFX6:       ; %bb.0:
151 ; GFX6-NEXT:    s_mov_b32 s0, s2
152 ; GFX6-NEXT:    s_mov_b32 s1, s3
153 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
154 ; GFX6-NEXT:    s_mov_b32 s2, -1
155 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
156 ; GFX6-NEXT:    s_movk_i32 s4, 0x4000
157 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], s4
158 ; GFX6-NEXT:    s_endpgm
160 ; GFX7-LABEL: mubuf_store_sgpr_ptr_offset4096:
161 ; GFX7:       ; %bb.0:
162 ; GFX7-NEXT:    s_mov_b32 s0, s2
163 ; GFX7-NEXT:    s_mov_b32 s1, s3
164 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
165 ; GFX7-NEXT:    s_mov_b32 s2, -1
166 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
167 ; GFX7-NEXT:    s_movk_i32 s4, 0x4000
168 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], s4
169 ; GFX7-NEXT:    s_endpgm
171 ; GFX12-LABEL: mubuf_store_sgpr_ptr_offset4096:
172 ; GFX12:       ; %bb.0:
173 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
174 ; GFX12-NEXT:    global_store_b32 v0, v0, s[2:3] offset:16384
175 ; GFX12-NEXT:    s_endpgm
176   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4096
177   store i32 0, ptr addrspace(1) %gep
178   ret void
181 define amdgpu_ps void @mubuf_store_vgpr_ptr_offset4095(ptr addrspace(1) %ptr) {
182 ; GFX6-LABEL: mubuf_store_vgpr_ptr_offset4095:
183 ; GFX6:       ; %bb.0:
184 ; GFX6-NEXT:    s_mov_b32 s2, 0
185 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
186 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
187 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
188 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
189 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
190 ; GFX6-NEXT:    s_endpgm
192 ; GFX7-LABEL: mubuf_store_vgpr_ptr_offset4095:
193 ; GFX7:       ; %bb.0:
194 ; GFX7-NEXT:    s_mov_b32 s2, 0
195 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
196 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
197 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
198 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
199 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
200 ; GFX7-NEXT:    s_endpgm
202 ; GFX12-LABEL: mubuf_store_vgpr_ptr_offset4095:
203 ; GFX12:       ; %bb.0:
204 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
205 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:16380
206 ; GFX12-NEXT:    s_endpgm
207   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
208   store i32 0, ptr addrspace(1) %gep
209   ret void
212 define amdgpu_ps void @mubuf_store_vgpr_ptr_offset4294967296(ptr addrspace(1) %ptr) {
213 ; GFX6-LABEL: mubuf_store_vgpr_ptr_offset4294967296:
214 ; GFX6:       ; %bb.0:
215 ; GFX6-NEXT:    s_mov_b32 s0, 0
216 ; GFX6-NEXT:    s_mov_b32 s1, 4
217 ; GFX6-NEXT:    s_mov_b32 s2, 0
218 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
219 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
220 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
221 ; GFX6-NEXT:    s_endpgm
223 ; GFX7-LABEL: mubuf_store_vgpr_ptr_offset4294967296:
224 ; GFX7:       ; %bb.0:
225 ; GFX7-NEXT:    s_mov_b32 s0, 0
226 ; GFX7-NEXT:    s_mov_b32 s1, 4
227 ; GFX7-NEXT:    s_mov_b32 s2, 0
228 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
229 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
230 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
231 ; GFX7-NEXT:    s_endpgm
233 ; GFX12-LABEL: mubuf_store_vgpr_ptr_offset4294967296:
234 ; GFX12:       ; %bb.0:
235 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 0
236 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
237 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
238 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
239 ; GFX12-NEXT:    s_endpgm
240   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
241   store i32 0, ptr addrspace(1) %gep
242   ret void
245 define amdgpu_ps void @mubuf_store_vgpr_ptr_offset4294967297(ptr addrspace(1) %ptr) {
246 ; GFX6-LABEL: mubuf_store_vgpr_ptr_offset4294967297:
247 ; GFX6:       ; %bb.0:
248 ; GFX6-NEXT:    s_mov_b32 s0, 4
249 ; GFX6-NEXT:    s_mov_b32 s1, 4
250 ; GFX6-NEXT:    s_mov_b32 s2, 0
251 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
252 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
253 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
254 ; GFX6-NEXT:    s_endpgm
256 ; GFX7-LABEL: mubuf_store_vgpr_ptr_offset4294967297:
257 ; GFX7:       ; %bb.0:
258 ; GFX7-NEXT:    s_mov_b32 s0, 4
259 ; GFX7-NEXT:    s_mov_b32 s1, 4
260 ; GFX7-NEXT:    s_mov_b32 s2, 0
261 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
262 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
263 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
264 ; GFX7-NEXT:    s_endpgm
266 ; GFX12-LABEL: mubuf_store_vgpr_ptr_offset4294967297:
267 ; GFX12:       ; %bb.0:
268 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 4
269 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
270 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
271 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
272 ; GFX12-NEXT:    s_endpgm
273   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967297
274   store i32 0, ptr addrspace(1) %gep
275   ret void
278 define amdgpu_ps void @mubuf_store_vgpr_ptr_offset4096(ptr addrspace(1) %ptr) {
279 ; GFX6-LABEL: mubuf_store_vgpr_ptr_offset4096:
280 ; GFX6:       ; %bb.0:
281 ; GFX6-NEXT:    s_mov_b32 s2, 0
282 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
283 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
284 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
285 ; GFX6-NEXT:    s_movk_i32 s4, 0x4000
286 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
287 ; GFX6-NEXT:    s_endpgm
289 ; GFX7-LABEL: mubuf_store_vgpr_ptr_offset4096:
290 ; GFX7:       ; %bb.0:
291 ; GFX7-NEXT:    s_mov_b32 s2, 0
292 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
293 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
294 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
295 ; GFX7-NEXT:    s_movk_i32 s4, 0x4000
296 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
297 ; GFX7-NEXT:    s_endpgm
299 ; GFX12-LABEL: mubuf_store_vgpr_ptr_offset4096:
300 ; GFX12:       ; %bb.0:
301 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
302 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:16384
303 ; GFX12-NEXT:    s_endpgm
304   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4096
305   store i32 0, ptr addrspace(1) %gep
306   ret void
309 define amdgpu_ps void @mubuf_store_sgpr_ptr_sgpr_offset(ptr addrspace(1) inreg %ptr, i32 inreg %soffset) {
310 ; GFX6-LABEL: mubuf_store_sgpr_ptr_sgpr_offset:
311 ; GFX6:       ; %bb.0:
312 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 31
313 ; GFX6-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
314 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
315 ; GFX6-NEXT:    s_mov_b32 s0, s2
316 ; GFX6-NEXT:    s_mov_b32 s1, s3
317 ; GFX6-NEXT:    s_mov_b32 s2, 0
318 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
319 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
320 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
321 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
322 ; GFX6-NEXT:    s_endpgm
324 ; GFX7-LABEL: mubuf_store_sgpr_ptr_sgpr_offset:
325 ; GFX7:       ; %bb.0:
326 ; GFX7-NEXT:    s_ashr_i32 s5, s4, 31
327 ; GFX7-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
328 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
329 ; GFX7-NEXT:    s_mov_b32 s0, s2
330 ; GFX7-NEXT:    s_mov_b32 s1, s3
331 ; GFX7-NEXT:    s_mov_b32 s2, 0
332 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
333 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
334 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
335 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
336 ; GFX7-NEXT:    s_endpgm
338 ; GFX12-LABEL: mubuf_store_sgpr_ptr_sgpr_offset:
339 ; GFX12:       ; %bb.0:
340 ; GFX12-NEXT:    s_ashr_i32 s5, s4, 31
341 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
342 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[4:5], 2
343 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
344 ; GFX12-NEXT:    s_add_co_u32 s0, s2, s0
345 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, s1
346 ; GFX12-NEXT:    global_store_b32 v0, v0, s[0:1]
347 ; GFX12-NEXT:    s_endpgm
348   %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %soffset
349   store i32 0, ptr addrspace(1) %gep
350   ret void
353 define amdgpu_ps void @mubuf_store_vgpr_ptr_sgpr_offset(ptr addrspace(1) %ptr, i32 inreg %soffset) {
354 ; GFX6-LABEL: mubuf_store_vgpr_ptr_sgpr_offset:
355 ; GFX6:       ; %bb.0:
356 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
357 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
358 ; GFX6-NEXT:    s_mov_b32 s2, 0
359 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
360 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
361 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
362 ; GFX6-NEXT:    s_endpgm
364 ; GFX7-LABEL: mubuf_store_vgpr_ptr_sgpr_offset:
365 ; GFX7:       ; %bb.0:
366 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
367 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
368 ; GFX7-NEXT:    s_mov_b32 s2, 0
369 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
370 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
371 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
372 ; GFX7-NEXT:    s_endpgm
374 ; GFX12-LABEL: mubuf_store_vgpr_ptr_sgpr_offset:
375 ; GFX12:       ; %bb.0:
376 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
377 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
378 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
379 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
380 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
381 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
382 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
383 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
384 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
385 ; GFX12-NEXT:    s_endpgm
386   %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %soffset
387   store i32 0, ptr addrspace(1) %gep
388   ret void
391 define amdgpu_ps void @mubuf_store_vgpr_ptr_sgpr_offset_offset256(ptr addrspace(1) %ptr, i32 inreg %soffset) {
392 ; GFX6-LABEL: mubuf_store_vgpr_ptr_sgpr_offset_offset256:
393 ; GFX6:       ; %bb.0:
394 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
395 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
396 ; GFX6-NEXT:    s_mov_b32 s2, 0
397 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
398 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
399 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 offset:1024
400 ; GFX6-NEXT:    s_endpgm
402 ; GFX7-LABEL: mubuf_store_vgpr_ptr_sgpr_offset_offset256:
403 ; GFX7:       ; %bb.0:
404 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
405 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
406 ; GFX7-NEXT:    s_mov_b32 s2, 0
407 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
408 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
409 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 offset:1024
410 ; GFX7-NEXT:    s_endpgm
412 ; GFX12-LABEL: mubuf_store_vgpr_ptr_sgpr_offset_offset256:
413 ; GFX12:       ; %bb.0:
414 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
415 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
416 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
417 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
418 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
419 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
420 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
421 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
422 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:1024
423 ; GFX12-NEXT:    s_endpgm
424   %gep0 = getelementptr i32, ptr addrspace(1) %ptr, i32 %soffset
425   %gep1 = getelementptr i32, ptr addrspace(1) %gep0, i32 256
426   store i32 0, ptr addrspace(1) %gep1
427   ret void
430 define amdgpu_ps void @mubuf_store_vgpr_ptr_sgpr_offset256_offset(ptr addrspace(1) %ptr, i32 inreg %soffset) {
431 ; GFX6-LABEL: mubuf_store_vgpr_ptr_sgpr_offset256_offset:
432 ; GFX6:       ; %bb.0:
433 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
434 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
435 ; GFX6-NEXT:    s_mov_b32 s2, 0
436 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
437 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
438 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 offset:1024
439 ; GFX6-NEXT:    s_endpgm
441 ; GFX7-LABEL: mubuf_store_vgpr_ptr_sgpr_offset256_offset:
442 ; GFX7:       ; %bb.0:
443 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
444 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
445 ; GFX7-NEXT:    s_mov_b32 s2, 0
446 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
447 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
448 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 offset:1024
449 ; GFX7-NEXT:    s_endpgm
451 ; GFX12-LABEL: mubuf_store_vgpr_ptr_sgpr_offset256_offset:
452 ; GFX12:       ; %bb.0:
453 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
454 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
455 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
456 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
457 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
458 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
459 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
460 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
461 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:1024
462 ; GFX12-NEXT:    s_endpgm
463   %gep0 = getelementptr i32, ptr addrspace(1) %ptr, i32 256
464   %gep1 = getelementptr i32, ptr addrspace(1) %gep0, i32 %soffset
465   store i32 0, ptr addrspace(1) %gep1
466   ret void
469 define amdgpu_ps void @mubuf_store_sgpr_ptr_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) {
470 ; GFX6-LABEL: mubuf_store_sgpr_ptr_vgpr_offset:
471 ; GFX6:       ; %bb.0:
472 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
473 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
474 ; GFX6-NEXT:    s_mov_b32 s0, s2
475 ; GFX6-NEXT:    s_mov_b32 s1, s3
476 ; GFX6-NEXT:    s_mov_b32 s2, 0
477 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
478 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
479 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
480 ; GFX6-NEXT:    s_endpgm
482 ; GFX7-LABEL: mubuf_store_sgpr_ptr_vgpr_offset:
483 ; GFX7:       ; %bb.0:
484 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
485 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
486 ; GFX7-NEXT:    s_mov_b32 s0, s2
487 ; GFX7-NEXT:    s_mov_b32 s1, s3
488 ; GFX7-NEXT:    s_mov_b32 s2, 0
489 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
490 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
491 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64
492 ; GFX7-NEXT:    s_endpgm
494 ; GFX12-LABEL: mubuf_store_sgpr_ptr_vgpr_offset:
495 ; GFX12:       ; %bb.0:
496 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
497 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
498 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
499 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
500 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
501 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
502 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
503 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
504 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off
505 ; GFX12-NEXT:    s_endpgm
506   %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %voffset
507   store i32 0, ptr addrspace(1) %gep
508   ret void
511 define amdgpu_ps void @mubuf_store_sgpr_ptr_vgpr_offset_offset4095(ptr addrspace(1) inreg %ptr, i32 %voffset) {
512 ; GFX6-LABEL: mubuf_store_sgpr_ptr_vgpr_offset_offset4095:
513 ; GFX6:       ; %bb.0:
514 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
515 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
516 ; GFX6-NEXT:    s_mov_b32 s0, s2
517 ; GFX6-NEXT:    s_mov_b32 s1, s3
518 ; GFX6-NEXT:    s_mov_b32 s2, 0
519 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
520 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
521 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
522 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
523 ; GFX6-NEXT:    s_endpgm
525 ; GFX7-LABEL: mubuf_store_sgpr_ptr_vgpr_offset_offset4095:
526 ; GFX7:       ; %bb.0:
527 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
528 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
529 ; GFX7-NEXT:    s_mov_b32 s0, s2
530 ; GFX7-NEXT:    s_mov_b32 s1, s3
531 ; GFX7-NEXT:    s_mov_b32 s2, 0
532 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
533 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
534 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
535 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
536 ; GFX7-NEXT:    s_endpgm
538 ; GFX12-LABEL: mubuf_store_sgpr_ptr_vgpr_offset_offset4095:
539 ; GFX12:       ; %bb.0:
540 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
541 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
542 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
543 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
544 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
545 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
546 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
547 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
548 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:16380
549 ; GFX12-NEXT:    s_endpgm
550   %gep0 = getelementptr i32, ptr addrspace(1) %ptr, i32 %voffset
551   %gep1 = getelementptr i32, ptr addrspace(1) %gep0, i32 4095
552   store i32 0, ptr addrspace(1) %gep1
553   ret void
555 define amdgpu_ps void @mubuf_store_sgpr_ptr_offset4095_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) {
556 ; GFX6-LABEL: mubuf_store_sgpr_ptr_offset4095_vgpr_offset:
557 ; GFX6:       ; %bb.0:
558 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
559 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
560 ; GFX6-NEXT:    s_mov_b32 s0, s2
561 ; GFX6-NEXT:    s_mov_b32 s1, s3
562 ; GFX6-NEXT:    s_mov_b32 s2, 0
563 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
564 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
565 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
566 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
567 ; GFX6-NEXT:    s_endpgm
569 ; GFX7-LABEL: mubuf_store_sgpr_ptr_offset4095_vgpr_offset:
570 ; GFX7:       ; %bb.0:
571 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
572 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
573 ; GFX7-NEXT:    s_mov_b32 s0, s2
574 ; GFX7-NEXT:    s_mov_b32 s1, s3
575 ; GFX7-NEXT:    s_mov_b32 s2, 0
576 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0
577 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
578 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
579 ; GFX7-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], s4 addr64
580 ; GFX7-NEXT:    s_endpgm
582 ; GFX12-LABEL: mubuf_store_sgpr_ptr_offset4095_vgpr_offset:
583 ; GFX12:       ; %bb.0:
584 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
585 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
586 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
587 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
588 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
589 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
590 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
591 ; GFX12-NEXT:    v_mov_b32_e32 v2, 0
592 ; GFX12-NEXT:    global_store_b32 v[0:1], v2, off offset:16380
593 ; GFX12-NEXT:    s_endpgm
594   %gep0 = getelementptr i32, ptr addrspace(1) %ptr, i32 4095
595   %gep1 = getelementptr i32, ptr addrspace(1) %gep0, i32 %voffset
596   store i32 0, ptr addrspace(1) %gep1
597   ret void
600 define amdgpu_ps float @mubuf_load_sgpr_ptr(ptr addrspace(1) inreg %ptr) {
601 ; GFX6-LABEL: mubuf_load_sgpr_ptr:
602 ; GFX6:       ; %bb.0:
603 ; GFX6-NEXT:    s_mov_b32 s0, s2
604 ; GFX6-NEXT:    s_mov_b32 s1, s3
605 ; GFX6-NEXT:    s_mov_b32 s2, -1
606 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
607 ; GFX6-NEXT:    buffer_load_dword v0, off, s[0:3], 0 glc
608 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
609 ; GFX6-NEXT:    ; return to shader part epilog
611 ; GFX7-LABEL: mubuf_load_sgpr_ptr:
612 ; GFX7:       ; %bb.0:
613 ; GFX7-NEXT:    s_mov_b32 s0, s2
614 ; GFX7-NEXT:    s_mov_b32 s1, s3
615 ; GFX7-NEXT:    s_mov_b32 s2, -1
616 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
617 ; GFX7-NEXT:    buffer_load_dword v0, off, s[0:3], 0 glc
618 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
619 ; GFX7-NEXT:    ; return to shader part epilog
621 ; GFX12-LABEL: mubuf_load_sgpr_ptr:
622 ; GFX12:       ; %bb.0:
623 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
624 ; GFX12-NEXT:    global_load_b32 v0, v0, s[2:3] scope:SCOPE_SYS
625 ; GFX12-NEXT:    s_wait_loadcnt 0x0
626 ; GFX12-NEXT:    ; return to shader part epilog
627   %val = load volatile float, ptr addrspace(1) %ptr
628   ret float %val
631 define amdgpu_ps float @mubuf_load_sgpr_ptr_offset4095(ptr addrspace(1) inreg %ptr) {
632 ; GFX6-LABEL: mubuf_load_sgpr_ptr_offset4095:
633 ; GFX6:       ; %bb.0:
634 ; GFX6-NEXT:    s_mov_b32 s0, s2
635 ; GFX6-NEXT:    s_mov_b32 s1, s3
636 ; GFX6-NEXT:    s_mov_b32 s2, -1
637 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
638 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
639 ; GFX6-NEXT:    buffer_load_dword v0, off, s[0:3], s4 glc
640 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
641 ; GFX6-NEXT:    ; return to shader part epilog
643 ; GFX7-LABEL: mubuf_load_sgpr_ptr_offset4095:
644 ; GFX7:       ; %bb.0:
645 ; GFX7-NEXT:    s_mov_b32 s0, s2
646 ; GFX7-NEXT:    s_mov_b32 s1, s3
647 ; GFX7-NEXT:    s_mov_b32 s2, -1
648 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
649 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
650 ; GFX7-NEXT:    buffer_load_dword v0, off, s[0:3], s4 glc
651 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
652 ; GFX7-NEXT:    ; return to shader part epilog
654 ; GFX12-LABEL: mubuf_load_sgpr_ptr_offset4095:
655 ; GFX12:       ; %bb.0:
656 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
657 ; GFX12-NEXT:    global_load_b32 v0, v0, s[2:3] offset:16380 scope:SCOPE_SYS
658 ; GFX12-NEXT:    s_wait_loadcnt 0x0
659 ; GFX12-NEXT:    ; return to shader part epilog
660   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4095
661   %val = load volatile float, ptr addrspace(1) %gep
662   ret float %val
665 define amdgpu_ps float @mubuf_load_sgpr_ptr_offset4294967296(ptr addrspace(1) inreg %ptr) {
666 ; GFX6-LABEL: mubuf_load_sgpr_ptr_offset4294967296:
667 ; GFX6:       ; %bb.0:
668 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
669 ; GFX6-NEXT:    s_mov_b32 s0, s2
670 ; GFX6-NEXT:    s_mov_b32 s1, s3
671 ; GFX6-NEXT:    s_mov_b32 s2, 0
672 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4
673 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
674 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
675 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
676 ; GFX6-NEXT:    ; return to shader part epilog
678 ; GFX7-LABEL: mubuf_load_sgpr_ptr_offset4294967296:
679 ; GFX7:       ; %bb.0:
680 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
681 ; GFX7-NEXT:    s_mov_b32 s0, s2
682 ; GFX7-NEXT:    s_mov_b32 s1, s3
683 ; GFX7-NEXT:    s_mov_b32 s2, 0
684 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4
685 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
686 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
687 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
688 ; GFX7-NEXT:    ; return to shader part epilog
690 ; GFX12-LABEL: mubuf_load_sgpr_ptr_offset4294967296:
691 ; GFX12:       ; %bb.0:
692 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 0
693 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
694 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
695 ; GFX12-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
696 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
697 ; GFX12-NEXT:    s_wait_loadcnt 0x0
698 ; GFX12-NEXT:    ; return to shader part epilog
699   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4294967296
700   %val = load volatile float, ptr addrspace(1) %gep
701   ret float %val
704 define amdgpu_ps float @mubuf_load_sgpr_ptr_offset4294967297(ptr addrspace(1) inreg %ptr) {
705 ; GFX6-LABEL: mubuf_load_sgpr_ptr_offset4294967297:
706 ; GFX6:       ; %bb.0:
707 ; GFX6-NEXT:    v_mov_b32_e32 v0, 4
708 ; GFX6-NEXT:    s_mov_b32 s0, s2
709 ; GFX6-NEXT:    s_mov_b32 s1, s3
710 ; GFX6-NEXT:    s_mov_b32 s2, 0
711 ; GFX6-NEXT:    v_mov_b32_e32 v1, 4
712 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
713 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
714 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
715 ; GFX6-NEXT:    ; return to shader part epilog
717 ; GFX7-LABEL: mubuf_load_sgpr_ptr_offset4294967297:
718 ; GFX7:       ; %bb.0:
719 ; GFX7-NEXT:    v_mov_b32_e32 v0, 4
720 ; GFX7-NEXT:    s_mov_b32 s0, s2
721 ; GFX7-NEXT:    s_mov_b32 s1, s3
722 ; GFX7-NEXT:    s_mov_b32 s2, 0
723 ; GFX7-NEXT:    v_mov_b32_e32 v1, 4
724 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
725 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
726 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
727 ; GFX7-NEXT:    ; return to shader part epilog
729 ; GFX12-LABEL: mubuf_load_sgpr_ptr_offset4294967297:
730 ; GFX12:       ; %bb.0:
731 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 4
732 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
733 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
734 ; GFX12-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
735 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
736 ; GFX12-NEXT:    s_wait_loadcnt 0x0
737 ; GFX12-NEXT:    ; return to shader part epilog
738   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4294967297
739   %val = load volatile float, ptr addrspace(1) %gep
740   ret float %val
743 define amdgpu_ps float @mubuf_load_sgpr_ptr_offset4096(ptr addrspace(1) inreg %ptr) {
744 ; GFX6-LABEL: mubuf_load_sgpr_ptr_offset4096:
745 ; GFX6:       ; %bb.0:
746 ; GFX6-NEXT:    s_mov_b32 s0, s2
747 ; GFX6-NEXT:    s_mov_b32 s1, s3
748 ; GFX6-NEXT:    s_mov_b32 s2, -1
749 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
750 ; GFX6-NEXT:    s_movk_i32 s4, 0x4000
751 ; GFX6-NEXT:    buffer_load_dword v0, off, s[0:3], s4 glc
752 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
753 ; GFX6-NEXT:    ; return to shader part epilog
755 ; GFX7-LABEL: mubuf_load_sgpr_ptr_offset4096:
756 ; GFX7:       ; %bb.0:
757 ; GFX7-NEXT:    s_mov_b32 s0, s2
758 ; GFX7-NEXT:    s_mov_b32 s1, s3
759 ; GFX7-NEXT:    s_mov_b32 s2, -1
760 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
761 ; GFX7-NEXT:    s_movk_i32 s4, 0x4000
762 ; GFX7-NEXT:    buffer_load_dword v0, off, s[0:3], s4 glc
763 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
764 ; GFX7-NEXT:    ; return to shader part epilog
766 ; GFX12-LABEL: mubuf_load_sgpr_ptr_offset4096:
767 ; GFX12:       ; %bb.0:
768 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
769 ; GFX12-NEXT:    global_load_b32 v0, v0, s[2:3] offset:16384 scope:SCOPE_SYS
770 ; GFX12-NEXT:    s_wait_loadcnt 0x0
771 ; GFX12-NEXT:    ; return to shader part epilog
772   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4096
773   %val = load volatile float, ptr addrspace(1) %gep
774   ret float %val
777 define amdgpu_ps float @mubuf_load_vgpr_ptr_offset4095(ptr addrspace(1) %ptr) {
778 ; GFX6-LABEL: mubuf_load_vgpr_ptr_offset4095:
779 ; GFX6:       ; %bb.0:
780 ; GFX6-NEXT:    s_mov_b32 s2, 0
781 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
782 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
783 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
784 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
785 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
786 ; GFX6-NEXT:    ; return to shader part epilog
788 ; GFX7-LABEL: mubuf_load_vgpr_ptr_offset4095:
789 ; GFX7:       ; %bb.0:
790 ; GFX7-NEXT:    s_mov_b32 s2, 0
791 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
792 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
793 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
794 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
795 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
796 ; GFX7-NEXT:    ; return to shader part epilog
798 ; GFX12-LABEL: mubuf_load_vgpr_ptr_offset4095:
799 ; GFX12:       ; %bb.0:
800 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:16380 scope:SCOPE_SYS
801 ; GFX12-NEXT:    s_wait_loadcnt 0x0
802 ; GFX12-NEXT:    ; return to shader part epilog
803   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4095
804   %val = load volatile float, ptr addrspace(1) %gep
805   ret float %val
808 define amdgpu_ps float @mubuf_load_vgpr_ptr_offset4294967296(ptr addrspace(1) %ptr) {
809 ; GFX6-LABEL: mubuf_load_vgpr_ptr_offset4294967296:
810 ; GFX6:       ; %bb.0:
811 ; GFX6-NEXT:    s_mov_b32 s0, 0
812 ; GFX6-NEXT:    s_mov_b32 s1, 4
813 ; GFX6-NEXT:    s_mov_b32 s2, 0
814 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
815 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
816 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
817 ; GFX6-NEXT:    ; return to shader part epilog
819 ; GFX7-LABEL: mubuf_load_vgpr_ptr_offset4294967296:
820 ; GFX7:       ; %bb.0:
821 ; GFX7-NEXT:    s_mov_b32 s0, 0
822 ; GFX7-NEXT:    s_mov_b32 s1, 4
823 ; GFX7-NEXT:    s_mov_b32 s2, 0
824 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
825 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
826 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
827 ; GFX7-NEXT:    ; return to shader part epilog
829 ; GFX12-LABEL: mubuf_load_vgpr_ptr_offset4294967296:
830 ; GFX12:       ; %bb.0:
831 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 0
832 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
833 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
834 ; GFX12-NEXT:    s_wait_loadcnt 0x0
835 ; GFX12-NEXT:    s_wait_alu 0xfffd
836 ; GFX12-NEXT:    ; return to shader part epilog
837   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4294967296
838   %val = load volatile float, ptr addrspace(1) %gep
839   ret float %val
842 define amdgpu_ps float @mubuf_load_vgpr_ptr_offset4294967297(ptr addrspace(1) %ptr) {
843 ; GFX6-LABEL: mubuf_load_vgpr_ptr_offset4294967297:
844 ; GFX6:       ; %bb.0:
845 ; GFX6-NEXT:    s_mov_b32 s0, 4
846 ; GFX6-NEXT:    s_mov_b32 s1, 4
847 ; GFX6-NEXT:    s_mov_b32 s2, 0
848 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
849 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
850 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
851 ; GFX6-NEXT:    ; return to shader part epilog
853 ; GFX7-LABEL: mubuf_load_vgpr_ptr_offset4294967297:
854 ; GFX7:       ; %bb.0:
855 ; GFX7-NEXT:    s_mov_b32 s0, 4
856 ; GFX7-NEXT:    s_mov_b32 s1, 4
857 ; GFX7-NEXT:    s_mov_b32 s2, 0
858 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
859 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
860 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
861 ; GFX7-NEXT:    ; return to shader part epilog
863 ; GFX12-LABEL: mubuf_load_vgpr_ptr_offset4294967297:
864 ; GFX12:       ; %bb.0:
865 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 4
866 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
867 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
868 ; GFX12-NEXT:    s_wait_loadcnt 0x0
869 ; GFX12-NEXT:    s_wait_alu 0xfffd
870 ; GFX12-NEXT:    ; return to shader part epilog
871   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4294967297
872   %val = load volatile float, ptr addrspace(1) %gep
873   ret float %val
876 define amdgpu_ps float @mubuf_load_vgpr_ptr_offset4096(ptr addrspace(1) %ptr) {
877 ; GFX6-LABEL: mubuf_load_vgpr_ptr_offset4096:
878 ; GFX6:       ; %bb.0:
879 ; GFX6-NEXT:    s_mov_b32 s2, 0
880 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
881 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
882 ; GFX6-NEXT:    s_movk_i32 s4, 0x4000
883 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
884 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
885 ; GFX6-NEXT:    ; return to shader part epilog
887 ; GFX7-LABEL: mubuf_load_vgpr_ptr_offset4096:
888 ; GFX7:       ; %bb.0:
889 ; GFX7-NEXT:    s_mov_b32 s2, 0
890 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
891 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
892 ; GFX7-NEXT:    s_movk_i32 s4, 0x4000
893 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
894 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
895 ; GFX7-NEXT:    ; return to shader part epilog
897 ; GFX12-LABEL: mubuf_load_vgpr_ptr_offset4096:
898 ; GFX12:       ; %bb.0:
899 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:16384 scope:SCOPE_SYS
900 ; GFX12-NEXT:    s_wait_loadcnt 0x0
901 ; GFX12-NEXT:    ; return to shader part epilog
902   %gep = getelementptr float, ptr addrspace(1) %ptr, i64 4096
903   %val = load volatile float, ptr addrspace(1) %gep
904   ret float %val
907 define amdgpu_ps float @mubuf_load_sgpr_ptr_sgpr_offset(ptr addrspace(1) inreg %ptr, i32 inreg %soffset) {
908 ; GFX6-LABEL: mubuf_load_sgpr_ptr_sgpr_offset:
909 ; GFX6:       ; %bb.0:
910 ; GFX6-NEXT:    s_ashr_i32 s5, s4, 31
911 ; GFX6-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
912 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
913 ; GFX6-NEXT:    s_mov_b32 s0, s2
914 ; GFX6-NEXT:    s_mov_b32 s1, s3
915 ; GFX6-NEXT:    s_mov_b32 s2, 0
916 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
917 ; GFX6-NEXT:    v_mov_b32_e32 v1, s5
918 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
919 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
920 ; GFX6-NEXT:    ; return to shader part epilog
922 ; GFX7-LABEL: mubuf_load_sgpr_ptr_sgpr_offset:
923 ; GFX7:       ; %bb.0:
924 ; GFX7-NEXT:    s_ashr_i32 s5, s4, 31
925 ; GFX7-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
926 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
927 ; GFX7-NEXT:    s_mov_b32 s0, s2
928 ; GFX7-NEXT:    s_mov_b32 s1, s3
929 ; GFX7-NEXT:    s_mov_b32 s2, 0
930 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
931 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
932 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
933 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
934 ; GFX7-NEXT:    ; return to shader part epilog
936 ; GFX12-LABEL: mubuf_load_sgpr_ptr_sgpr_offset:
937 ; GFX12:       ; %bb.0:
938 ; GFX12-NEXT:    s_ashr_i32 s5, s4, 31
939 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
940 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[4:5], 2
941 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
942 ; GFX12-NEXT:    s_add_co_u32 s0, s2, s0
943 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, s1
944 ; GFX12-NEXT:    global_load_b32 v0, v0, s[0:1] scope:SCOPE_SYS
945 ; GFX12-NEXT:    s_wait_loadcnt 0x0
946 ; GFX12-NEXT:    ; return to shader part epilog
947   %gep = getelementptr float, ptr addrspace(1) %ptr, i32 %soffset
948   %val = load volatile float, ptr addrspace(1) %gep
949   ret float %val
952 define amdgpu_ps float @mubuf_load_vgpr_ptr_sgpr_offset(ptr addrspace(1) %ptr, i32 inreg %soffset) {
953 ; GFX6-LABEL: mubuf_load_vgpr_ptr_sgpr_offset:
954 ; GFX6:       ; %bb.0:
955 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
956 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
957 ; GFX6-NEXT:    s_mov_b32 s2, 0
958 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
959 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
960 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
961 ; GFX6-NEXT:    ; return to shader part epilog
963 ; GFX7-LABEL: mubuf_load_vgpr_ptr_sgpr_offset:
964 ; GFX7:       ; %bb.0:
965 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
966 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
967 ; GFX7-NEXT:    s_mov_b32 s2, 0
968 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
969 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
970 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
971 ; GFX7-NEXT:    ; return to shader part epilog
973 ; GFX12-LABEL: mubuf_load_vgpr_ptr_sgpr_offset:
974 ; GFX12:       ; %bb.0:
975 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
976 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
977 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
978 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
979 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
980 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
981 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
982 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
983 ; GFX12-NEXT:    s_wait_loadcnt 0x0
984 ; GFX12-NEXT:    s_wait_alu 0xfffd
985 ; GFX12-NEXT:    ; return to shader part epilog
986   %gep = getelementptr float, ptr addrspace(1) %ptr, i32 %soffset
987   %val = load volatile float, ptr addrspace(1) %gep
988   ret float %val
991 define amdgpu_ps float @mubuf_load_vgpr_ptr_sgpr_offset_offset256(ptr addrspace(1) %ptr, i32 inreg %soffset) {
992 ; GFX6-LABEL: mubuf_load_vgpr_ptr_sgpr_offset_offset256:
993 ; GFX6:       ; %bb.0:
994 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
995 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
996 ; GFX6-NEXT:    s_mov_b32 s2, 0
997 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
998 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 offset:1024 glc
999 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1000 ; GFX6-NEXT:    ; return to shader part epilog
1002 ; GFX7-LABEL: mubuf_load_vgpr_ptr_sgpr_offset_offset256:
1003 ; GFX7:       ; %bb.0:
1004 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
1005 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1006 ; GFX7-NEXT:    s_mov_b32 s2, 0
1007 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1008 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 offset:1024 glc
1009 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1010 ; GFX7-NEXT:    ; return to shader part epilog
1012 ; GFX12-LABEL: mubuf_load_vgpr_ptr_sgpr_offset_offset256:
1013 ; GFX12:       ; %bb.0:
1014 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
1015 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
1016 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1017 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
1018 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
1019 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
1020 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
1021 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:1024 scope:SCOPE_SYS
1022 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1023 ; GFX12-NEXT:    s_wait_alu 0xfffd
1024 ; GFX12-NEXT:    ; return to shader part epilog
1025   %gep0 = getelementptr float, ptr addrspace(1) %ptr, i32 %soffset
1026   %gep1 = getelementptr float, ptr addrspace(1) %gep0, i32 256
1027   %val = load volatile float, ptr addrspace(1) %gep1
1028   ret float %val
1031 define amdgpu_ps float @mubuf_load_vgpr_ptr_sgpr_offset256_offset(ptr addrspace(1) %ptr, i32 inreg %soffset) {
1032 ; GFX6-LABEL: mubuf_load_vgpr_ptr_sgpr_offset256_offset:
1033 ; GFX6:       ; %bb.0:
1034 ; GFX6-NEXT:    s_ashr_i32 s3, s2, 31
1035 ; GFX6-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1036 ; GFX6-NEXT:    s_mov_b32 s2, 0
1037 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1038 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 offset:1024 glc
1039 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1040 ; GFX6-NEXT:    ; return to shader part epilog
1042 ; GFX7-LABEL: mubuf_load_vgpr_ptr_sgpr_offset256_offset:
1043 ; GFX7:       ; %bb.0:
1044 ; GFX7-NEXT:    s_ashr_i32 s3, s2, 31
1045 ; GFX7-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1046 ; GFX7-NEXT:    s_mov_b32 s2, 0
1047 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1048 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 offset:1024 glc
1049 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1050 ; GFX7-NEXT:    ; return to shader part epilog
1052 ; GFX12-LABEL: mubuf_load_vgpr_ptr_sgpr_offset256_offset:
1053 ; GFX12:       ; %bb.0:
1054 ; GFX12-NEXT:    s_ashr_i32 s3, s2, 31
1055 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
1056 ; GFX12-NEXT:    s_lshl_b64 s[0:1], s[2:3], 2
1057 ; GFX12-NEXT:    v_dual_mov_b32 v3, s1 :: v_dual_mov_b32 v2, s0
1058 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
1059 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
1060 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v1, v3, vcc_lo
1061 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:1024 scope:SCOPE_SYS
1062 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1063 ; GFX12-NEXT:    s_wait_alu 0xfffd
1064 ; GFX12-NEXT:    ; return to shader part epilog
1065   %gep0 = getelementptr float, ptr addrspace(1) %ptr, i64 256
1066   %gep1 = getelementptr float, ptr addrspace(1) %gep0, i32 %soffset
1067   %val = load volatile float, ptr addrspace(1) %gep1
1068   ret float %val
1071 define amdgpu_ps float @mubuf_load_sgpr_ptr_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) {
1072 ; GFX6-LABEL: mubuf_load_sgpr_ptr_vgpr_offset:
1073 ; GFX6:       ; %bb.0:
1074 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1075 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1076 ; GFX6-NEXT:    s_mov_b32 s0, s2
1077 ; GFX6-NEXT:    s_mov_b32 s1, s3
1078 ; GFX6-NEXT:    s_mov_b32 s2, 0
1079 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1080 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
1081 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1082 ; GFX6-NEXT:    ; return to shader part epilog
1084 ; GFX7-LABEL: mubuf_load_sgpr_ptr_vgpr_offset:
1085 ; GFX7:       ; %bb.0:
1086 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1087 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1088 ; GFX7-NEXT:    s_mov_b32 s0, s2
1089 ; GFX7-NEXT:    s_mov_b32 s1, s3
1090 ; GFX7-NEXT:    s_mov_b32 s2, 0
1091 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1092 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
1093 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1094 ; GFX7-NEXT:    ; return to shader part epilog
1096 ; GFX12-LABEL: mubuf_load_sgpr_ptr_vgpr_offset:
1097 ; GFX12:       ; %bb.0:
1098 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1099 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
1100 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1101 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
1102 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
1103 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1104 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
1105 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off scope:SCOPE_SYS
1106 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1107 ; GFX12-NEXT:    s_wait_alu 0xfffd
1108 ; GFX12-NEXT:    ; return to shader part epilog
1109   %gep = getelementptr float, ptr addrspace(1) %ptr, i32 %voffset
1110   %val = load volatile float, ptr addrspace(1) %gep
1111   ret float %val
1114 define amdgpu_ps float @mubuf_load_sgpr_ptr_vgpr_offset_offset4095(ptr addrspace(1) inreg %ptr, i32 %voffset) {
1115 ; GFX6-LABEL: mubuf_load_sgpr_ptr_vgpr_offset_offset4095:
1116 ; GFX6:       ; %bb.0:
1117 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1118 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1119 ; GFX6-NEXT:    s_mov_b32 s0, s2
1120 ; GFX6-NEXT:    s_mov_b32 s1, s3
1121 ; GFX6-NEXT:    s_mov_b32 s2, 0
1122 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1123 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1124 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
1125 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1126 ; GFX6-NEXT:    ; return to shader part epilog
1128 ; GFX7-LABEL: mubuf_load_sgpr_ptr_vgpr_offset_offset4095:
1129 ; GFX7:       ; %bb.0:
1130 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1131 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1132 ; GFX7-NEXT:    s_mov_b32 s0, s2
1133 ; GFX7-NEXT:    s_mov_b32 s1, s3
1134 ; GFX7-NEXT:    s_mov_b32 s2, 0
1135 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1136 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1137 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
1138 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1139 ; GFX7-NEXT:    ; return to shader part epilog
1141 ; GFX12-LABEL: mubuf_load_sgpr_ptr_vgpr_offset_offset4095:
1142 ; GFX12:       ; %bb.0:
1143 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1144 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
1145 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1146 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
1147 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
1148 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1149 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
1150 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:16380 scope:SCOPE_SYS
1151 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1152 ; GFX12-NEXT:    s_wait_alu 0xfffd
1153 ; GFX12-NEXT:    ; return to shader part epilog
1154   %gep0 = getelementptr float, ptr addrspace(1) %ptr, i32 %voffset
1155   %gep1 = getelementptr float, ptr addrspace(1) %gep0, i64 4095
1156   %val = load volatile float, ptr addrspace(1) %gep1
1157   ret float %val
1159 define amdgpu_ps float @mubuf_load_sgpr_ptr_offset4095_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) {
1160 ; GFX6-LABEL: mubuf_load_sgpr_ptr_offset4095_vgpr_offset:
1161 ; GFX6:       ; %bb.0:
1162 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1163 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1164 ; GFX6-NEXT:    s_mov_b32 s0, s2
1165 ; GFX6-NEXT:    s_mov_b32 s1, s3
1166 ; GFX6-NEXT:    s_mov_b32 s2, 0
1167 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1168 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1169 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
1170 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1171 ; GFX6-NEXT:    ; return to shader part epilog
1173 ; GFX7-LABEL: mubuf_load_sgpr_ptr_offset4095_vgpr_offset:
1174 ; GFX7:       ; %bb.0:
1175 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1176 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1177 ; GFX7-NEXT:    s_mov_b32 s0, s2
1178 ; GFX7-NEXT:    s_mov_b32 s1, s3
1179 ; GFX7-NEXT:    s_mov_b32 s2, 0
1180 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1181 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1182 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], s4 addr64 glc
1183 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1184 ; GFX7-NEXT:    ; return to shader part epilog
1186 ; GFX12-LABEL: mubuf_load_sgpr_ptr_offset4095_vgpr_offset:
1187 ; GFX12:       ; %bb.0:
1188 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1189 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
1190 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1191 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
1192 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
1193 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1194 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
1195 ; GFX12-NEXT:    global_load_b32 v0, v[0:1], off offset:16380 scope:SCOPE_SYS
1196 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1197 ; GFX12-NEXT:    s_wait_alu 0xfffd
1198 ; GFX12-NEXT:    ; return to shader part epilog
1199   %gep0 = getelementptr float, ptr addrspace(1) %ptr, i64 4095
1200   %gep1 = getelementptr float, ptr addrspace(1) %gep0, i32 %voffset
1201   %val = load volatile float, ptr addrspace(1) %gep1
1202   ret float %val
1205 define amdgpu_ps float @mubuf_atomicrmw_sgpr_ptr_offset4095(ptr addrspace(1) inreg %ptr) {
1206 ; GFX6-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4095:
1207 ; GFX6:       ; %bb.0:
1208 ; GFX6-NEXT:    s_mov_b32 s0, s2
1209 ; GFX6-NEXT:    s_mov_b32 s1, s3
1210 ; GFX6-NEXT:    v_mov_b32_e32 v0, 2
1211 ; GFX6-NEXT:    s_mov_b32 s2, -1
1212 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1213 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1214 ; GFX6-NEXT:    buffer_atomic_add v0, off, s[0:3], s4 glc
1215 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1216 ; GFX6-NEXT:    buffer_wbinvl1
1217 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1218 ; GFX6-NEXT:    ; return to shader part epilog
1220 ; GFX7-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4095:
1221 ; GFX7:       ; %bb.0:
1222 ; GFX7-NEXT:    s_mov_b32 s0, s2
1223 ; GFX7-NEXT:    s_mov_b32 s1, s3
1224 ; GFX7-NEXT:    v_mov_b32_e32 v0, 2
1225 ; GFX7-NEXT:    s_mov_b32 s2, -1
1226 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1227 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1228 ; GFX7-NEXT:    buffer_atomic_add v0, off, s[0:3], s4 glc
1229 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1230 ; GFX7-NEXT:    buffer_wbinvl1
1231 ; GFX7-NEXT:    ; return to shader part epilog
1233 ; GFX12-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4095:
1234 ; GFX12:       ; %bb.0:
1235 ; GFX12-NEXT:    v_dual_mov_b32 v0, 2 :: v_dual_mov_b32 v1, 0
1236 ; GFX12-NEXT:    global_atomic_add_u32 v0, v1, v0, s[2:3] offset:16380 th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1237 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1238 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1239 ; GFX12-NEXT:    ; return to shader part epilog
1240   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
1241   %result = atomicrmw add ptr addrspace(1) %gep, i32 2 syncscope("agent") seq_cst
1242   %cast = bitcast i32 %result to float
1243   ret float %cast
1246 define amdgpu_ps float @mubuf_atomicrmw_sgpr_ptr_offset4294967296(ptr addrspace(1) inreg %ptr) {
1247 ; GFX6-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4294967296:
1248 ; GFX6:       ; %bb.0:
1249 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
1250 ; GFX6-NEXT:    s_mov_b32 s0, s2
1251 ; GFX6-NEXT:    s_mov_b32 s1, s3
1252 ; GFX6-NEXT:    v_mov_b32_e32 v0, 2
1253 ; GFX6-NEXT:    s_mov_b32 s2, 0
1254 ; GFX6-NEXT:    v_mov_b32_e32 v2, 4
1255 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1256 ; GFX6-NEXT:    buffer_atomic_add v0, v[1:2], s[0:3], 0 addr64 glc
1257 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1258 ; GFX6-NEXT:    buffer_wbinvl1
1259 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1260 ; GFX6-NEXT:    ; return to shader part epilog
1262 ; GFX7-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4294967296:
1263 ; GFX7:       ; %bb.0:
1264 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1265 ; GFX7-NEXT:    s_mov_b32 s0, s2
1266 ; GFX7-NEXT:    s_mov_b32 s1, s3
1267 ; GFX7-NEXT:    v_mov_b32_e32 v0, 2
1268 ; GFX7-NEXT:    s_mov_b32 s2, 0
1269 ; GFX7-NEXT:    v_mov_b32_e32 v2, 4
1270 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1271 ; GFX7-NEXT:    buffer_atomic_add v0, v[1:2], s[0:3], 0 addr64 glc
1272 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1273 ; GFX7-NEXT:    buffer_wbinvl1
1274 ; GFX7-NEXT:    ; return to shader part epilog
1276 ; GFX12-LABEL: mubuf_atomicrmw_sgpr_ptr_offset4294967296:
1277 ; GFX12:       ; %bb.0:
1278 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 0
1279 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
1280 ; GFX12-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
1281 ; GFX12-NEXT:    v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1
1282 ; GFX12-NEXT:    v_mov_b32_e32 v2, 2
1283 ; GFX12-NEXT:    global_atomic_add_u32 v0, v[0:1], v2, off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1284 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1285 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1286 ; GFX12-NEXT:    ; return to shader part epilog
1287   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
1288   %result = atomicrmw add ptr addrspace(1) %gep, i32 2 syncscope("agent") seq_cst
1289   %cast = bitcast i32 %result to float
1290   ret float %cast
1293 define amdgpu_ps float @mubuf_atomicrmw_vgpr_ptr_offset4095(ptr addrspace(1) %ptr) {
1294 ; GFX6-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4095:
1295 ; GFX6:       ; %bb.0:
1296 ; GFX6-NEXT:    v_mov_b32_e32 v2, 2
1297 ; GFX6-NEXT:    s_mov_b32 s2, 0
1298 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1299 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
1300 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1301 ; GFX6-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], s4 addr64 glc
1302 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1303 ; GFX6-NEXT:    buffer_wbinvl1
1304 ; GFX6-NEXT:    v_mov_b32_e32 v0, v2
1305 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1306 ; GFX6-NEXT:    ; return to shader part epilog
1308 ; GFX7-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4095:
1309 ; GFX7:       ; %bb.0:
1310 ; GFX7-NEXT:    v_mov_b32_e32 v2, 2
1311 ; GFX7-NEXT:    s_mov_b32 s2, 0
1312 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1313 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
1314 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1315 ; GFX7-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], s4 addr64 glc
1316 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1317 ; GFX7-NEXT:    buffer_wbinvl1
1318 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1319 ; GFX7-NEXT:    ; return to shader part epilog
1321 ; GFX12-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4095:
1322 ; GFX12:       ; %bb.0:
1323 ; GFX12-NEXT:    v_mov_b32_e32 v2, 2
1324 ; GFX12-NEXT:    global_atomic_add_u32 v0, v[0:1], v2, off offset:16380 th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1325 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1326 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1327 ; GFX12-NEXT:    ; return to shader part epilog
1328   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
1329   %result = atomicrmw add ptr addrspace(1) %gep, i32 2 syncscope("agent") seq_cst
1330   %cast = bitcast i32 %result to float
1331   ret float %cast
1334 define amdgpu_ps float @mubuf_atomicrmw_vgpr_ptr_offset4294967296(ptr addrspace(1) %ptr) {
1335 ; GFX6-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4294967296:
1336 ; GFX6:       ; %bb.0:
1337 ; GFX6-NEXT:    s_mov_b32 s0, 0
1338 ; GFX6-NEXT:    s_mov_b32 s1, 4
1339 ; GFX6-NEXT:    v_mov_b32_e32 v2, 2
1340 ; GFX6-NEXT:    s_mov_b32 s2, 0
1341 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1342 ; GFX6-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64 glc
1343 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1344 ; GFX6-NEXT:    buffer_wbinvl1
1345 ; GFX6-NEXT:    v_mov_b32_e32 v0, v2
1346 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1347 ; GFX6-NEXT:    ; return to shader part epilog
1349 ; GFX7-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4294967296:
1350 ; GFX7:       ; %bb.0:
1351 ; GFX7-NEXT:    s_mov_b32 s0, 0
1352 ; GFX7-NEXT:    s_mov_b32 s1, 4
1353 ; GFX7-NEXT:    v_mov_b32_e32 v2, 2
1354 ; GFX7-NEXT:    s_mov_b32 s2, 0
1355 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1356 ; GFX7-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64 glc
1357 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1358 ; GFX7-NEXT:    buffer_wbinvl1
1359 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1360 ; GFX7-NEXT:    ; return to shader part epilog
1362 ; GFX12-LABEL: mubuf_atomicrmw_vgpr_ptr_offset4294967296:
1363 ; GFX12:       ; %bb.0:
1364 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 0
1365 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
1366 ; GFX12-NEXT:    v_mov_b32_e32 v2, 2
1367 ; GFX12-NEXT:    global_atomic_add_u32 v0, v[0:1], v2, off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1368 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1369 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1370 ; GFX12-NEXT:    s_wait_alu 0xfffd
1371 ; GFX12-NEXT:    ; return to shader part epilog
1372   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
1373   %result = atomicrmw add ptr addrspace(1) %gep, i32 2 syncscope("agent") seq_cst
1374   %cast = bitcast i32 %result to float
1375   ret float %cast
1378 define amdgpu_ps float @mubuf_atomicrmw_sgpr_ptr_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset) {
1379 ; GFX6-LABEL: mubuf_atomicrmw_sgpr_ptr_vgpr_offset:
1380 ; GFX6:       ; %bb.0:
1381 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1382 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1383 ; GFX6-NEXT:    s_mov_b32 s0, s2
1384 ; GFX6-NEXT:    s_mov_b32 s1, s3
1385 ; GFX6-NEXT:    v_mov_b32_e32 v2, 2
1386 ; GFX6-NEXT:    s_mov_b32 s2, 0
1387 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1388 ; GFX6-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64 glc
1389 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1390 ; GFX6-NEXT:    buffer_wbinvl1
1391 ; GFX6-NEXT:    v_mov_b32_e32 v0, v2
1392 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1393 ; GFX6-NEXT:    ; return to shader part epilog
1395 ; GFX7-LABEL: mubuf_atomicrmw_sgpr_ptr_vgpr_offset:
1396 ; GFX7:       ; %bb.0:
1397 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1398 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1399 ; GFX7-NEXT:    s_mov_b32 s0, s2
1400 ; GFX7-NEXT:    s_mov_b32 s1, s3
1401 ; GFX7-NEXT:    v_mov_b32_e32 v2, 2
1402 ; GFX7-NEXT:    s_mov_b32 s2, 0
1403 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1404 ; GFX7-NEXT:    buffer_atomic_add v2, v[0:1], s[0:3], 0 addr64 glc
1405 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1406 ; GFX7-NEXT:    buffer_wbinvl1
1407 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1408 ; GFX7-NEXT:    ; return to shader part epilog
1410 ; GFX12-LABEL: mubuf_atomicrmw_sgpr_ptr_vgpr_offset:
1411 ; GFX12:       ; %bb.0:
1412 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1413 ; GFX12-NEXT:    v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3
1414 ; GFX12-NEXT:    v_mov_b32_e32 v4, 2
1415 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
1416 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
1417 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v2, v0
1418 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1419 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v3, v1, vcc_lo
1420 ; GFX12-NEXT:    global_atomic_add_u32 v0, v[0:1], v4, off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1421 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1422 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1423 ; GFX12-NEXT:    s_wait_alu 0xfffd
1424 ; GFX12-NEXT:    ; return to shader part epilog
1425   %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %voffset
1426   %result = atomicrmw add ptr addrspace(1) %gep, i32 2 syncscope("agent") seq_cst
1427   %cast = bitcast i32 %result to float
1428   ret float %cast
1431 define amdgpu_ps float @mubuf_cmpxchg_sgpr_ptr_offset4095(ptr addrspace(1) inreg %ptr, i32 %old, i32 %in) {
1432 ; GFX6-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4095:
1433 ; GFX6:       ; %bb.0:
1434 ; GFX6-NEXT:    s_mov_b32 s0, s2
1435 ; GFX6-NEXT:    s_mov_b32 s1, s3
1436 ; GFX6-NEXT:    v_mov_b32_e32 v2, v0
1437 ; GFX6-NEXT:    s_mov_b32 s2, -1
1438 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1439 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1440 ; GFX6-NEXT:    buffer_atomic_cmpswap v[1:2], off, s[0:3], s4 glc
1441 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1442 ; GFX6-NEXT:    buffer_wbinvl1
1443 ; GFX6-NEXT:    v_mov_b32_e32 v0, v1
1444 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1445 ; GFX6-NEXT:    ; return to shader part epilog
1447 ; GFX7-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4095:
1448 ; GFX7:       ; %bb.0:
1449 ; GFX7-NEXT:    s_mov_b32 s0, s2
1450 ; GFX7-NEXT:    s_mov_b32 s1, s3
1451 ; GFX7-NEXT:    v_mov_b32_e32 v2, v0
1452 ; GFX7-NEXT:    s_mov_b32 s2, -1
1453 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1454 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1455 ; GFX7-NEXT:    buffer_atomic_cmpswap v[1:2], off, s[0:3], s4 glc
1456 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1457 ; GFX7-NEXT:    buffer_wbinvl1
1458 ; GFX7-NEXT:    v_mov_b32_e32 v0, v1
1459 ; GFX7-NEXT:    ; return to shader part epilog
1461 ; GFX12-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4095:
1462 ; GFX12:       ; %bb.0:
1463 ; GFX12-NEXT:    v_mov_b32_e32 v2, v0
1464 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0
1465 ; GFX12-NEXT:    global_atomic_cmpswap_b32 v0, v0, v[1:2], s[2:3] offset:16380 th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1466 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1467 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1468 ; GFX12-NEXT:    ; return to shader part epilog
1469   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
1470   %result.struct = cmpxchg ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
1471   %result = extractvalue { i32, i1 } %result.struct, 0
1472   %cast = bitcast i32 %result to float
1473   ret float %cast
1476 define amdgpu_ps float @mubuf_cmpxchg_sgpr_ptr_offset4294967296(ptr addrspace(1) inreg %ptr, i32 %old, i32 %in) {
1477 ; GFX6-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4294967296:
1478 ; GFX6:       ; %bb.0:
1479 ; GFX6-NEXT:    v_mov_b32_e32 v3, 0
1480 ; GFX6-NEXT:    s_mov_b32 s0, s2
1481 ; GFX6-NEXT:    s_mov_b32 s1, s3
1482 ; GFX6-NEXT:    v_mov_b32_e32 v2, v0
1483 ; GFX6-NEXT:    s_mov_b32 s2, 0
1484 ; GFX6-NEXT:    v_mov_b32_e32 v4, 4
1485 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1486 ; GFX6-NEXT:    buffer_atomic_cmpswap v[1:2], v[3:4], s[0:3], 0 addr64 glc
1487 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1488 ; GFX6-NEXT:    buffer_wbinvl1
1489 ; GFX6-NEXT:    v_mov_b32_e32 v0, v1
1490 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1491 ; GFX6-NEXT:    ; return to shader part epilog
1493 ; GFX7-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4294967296:
1494 ; GFX7:       ; %bb.0:
1495 ; GFX7-NEXT:    v_mov_b32_e32 v3, 0
1496 ; GFX7-NEXT:    s_mov_b32 s0, s2
1497 ; GFX7-NEXT:    s_mov_b32 s1, s3
1498 ; GFX7-NEXT:    v_mov_b32_e32 v2, v0
1499 ; GFX7-NEXT:    s_mov_b32 s2, 0
1500 ; GFX7-NEXT:    v_mov_b32_e32 v4, 4
1501 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1502 ; GFX7-NEXT:    buffer_atomic_cmpswap v[1:2], v[3:4], s[0:3], 0 addr64 glc
1503 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1504 ; GFX7-NEXT:    buffer_wbinvl1
1505 ; GFX7-NEXT:    v_mov_b32_e32 v0, v1
1506 ; GFX7-NEXT:    ; return to shader part epilog
1508 ; GFX12-LABEL: mubuf_cmpxchg_sgpr_ptr_offset4294967296:
1509 ; GFX12:       ; %bb.0:
1510 ; GFX12-NEXT:    s_add_co_u32 s0, s2, 0
1511 ; GFX12-NEXT:    s_add_co_ci_u32 s1, s3, 4
1512 ; GFX12-NEXT:    v_mov_b32_e32 v2, v0
1513 ; GFX12-NEXT:    v_dual_mov_b32 v4, s1 :: v_dual_mov_b32 v3, s0
1514 ; GFX12-NEXT:    global_atomic_cmpswap_b32 v0, v[3:4], v[1:2], off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1515 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1516 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1517 ; GFX12-NEXT:    ; return to shader part epilog
1518   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
1519   %result.struct = cmpxchg ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
1520   %result = extractvalue { i32, i1 } %result.struct, 0
1521   %cast = bitcast i32 %result to float
1522   ret float %cast
1525 define amdgpu_ps float @mubuf_cmpxchg_vgpr_ptr_offset4095(ptr addrspace(1) %ptr, i32 %old, i32 %in) {
1526 ; GFX6-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4095:
1527 ; GFX6:       ; %bb.0:
1528 ; GFX6-NEXT:    v_mov_b32_e32 v4, v2
1529 ; GFX6-NEXT:    s_mov_b32 s2, 0
1530 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1531 ; GFX6-NEXT:    s_mov_b64 s[0:1], 0
1532 ; GFX6-NEXT:    s_movk_i32 s4, 0x3ffc
1533 ; GFX6-NEXT:    buffer_atomic_cmpswap v[3:4], v[0:1], s[0:3], s4 addr64 glc
1534 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1535 ; GFX6-NEXT:    buffer_wbinvl1
1536 ; GFX6-NEXT:    v_mov_b32_e32 v0, v3
1537 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1538 ; GFX6-NEXT:    ; return to shader part epilog
1540 ; GFX7-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4095:
1541 ; GFX7:       ; %bb.0:
1542 ; GFX7-NEXT:    v_mov_b32_e32 v4, v2
1543 ; GFX7-NEXT:    s_mov_b32 s2, 0
1544 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1545 ; GFX7-NEXT:    s_mov_b64 s[0:1], 0
1546 ; GFX7-NEXT:    s_movk_i32 s4, 0x3ffc
1547 ; GFX7-NEXT:    buffer_atomic_cmpswap v[3:4], v[0:1], s[0:3], s4 addr64 glc
1548 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1549 ; GFX7-NEXT:    buffer_wbinvl1
1550 ; GFX7-NEXT:    v_mov_b32_e32 v0, v3
1551 ; GFX7-NEXT:    ; return to shader part epilog
1553 ; GFX12-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4095:
1554 ; GFX12:       ; %bb.0:
1555 ; GFX12-NEXT:    v_mov_b32_e32 v4, v2
1556 ; GFX12-NEXT:    global_atomic_cmpswap_b32 v0, v[0:1], v[3:4], off offset:16380 th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1557 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1558 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1559 ; GFX12-NEXT:    ; return to shader part epilog
1560   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4095
1561   %result.struct = cmpxchg ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
1562   %result = extractvalue { i32, i1 } %result.struct, 0
1563   %cast = bitcast i32 %result to float
1564   ret float %cast
1567 define amdgpu_ps float @mubuf_cmpxchg_vgpr_ptr_offset4294967296(ptr addrspace(1) %ptr, i32 %old, i32 %in) {
1568 ; GFX6-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4294967296:
1569 ; GFX6:       ; %bb.0:
1570 ; GFX6-NEXT:    s_mov_b32 s0, 0
1571 ; GFX6-NEXT:    v_mov_b32_e32 v4, v2
1572 ; GFX6-NEXT:    s_mov_b32 s1, 4
1573 ; GFX6-NEXT:    s_mov_b32 s2, 0
1574 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1575 ; GFX6-NEXT:    buffer_atomic_cmpswap v[3:4], v[0:1], s[0:3], 0 addr64 glc
1576 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1577 ; GFX6-NEXT:    buffer_wbinvl1
1578 ; GFX6-NEXT:    v_mov_b32_e32 v0, v3
1579 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1580 ; GFX6-NEXT:    ; return to shader part epilog
1582 ; GFX7-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4294967296:
1583 ; GFX7:       ; %bb.0:
1584 ; GFX7-NEXT:    s_mov_b32 s0, 0
1585 ; GFX7-NEXT:    v_mov_b32_e32 v4, v2
1586 ; GFX7-NEXT:    s_mov_b32 s1, 4
1587 ; GFX7-NEXT:    s_mov_b32 s2, 0
1588 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1589 ; GFX7-NEXT:    buffer_atomic_cmpswap v[3:4], v[0:1], s[0:3], 0 addr64 glc
1590 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1591 ; GFX7-NEXT:    buffer_wbinvl1
1592 ; GFX7-NEXT:    v_mov_b32_e32 v0, v3
1593 ; GFX7-NEXT:    ; return to shader part epilog
1595 ; GFX12-LABEL: mubuf_cmpxchg_vgpr_ptr_offset4294967296:
1596 ; GFX12:       ; %bb.0:
1597 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v0, 0
1598 ; GFX12-NEXT:    v_mov_b32_e32 v4, v2
1599 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 4, v1, vcc_lo
1600 ; GFX12-NEXT:    global_atomic_cmpswap_b32 v0, v[0:1], v[3:4], off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1601 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1602 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1603 ; GFX12-NEXT:    s_wait_alu 0xfffd
1604 ; GFX12-NEXT:    ; return to shader part epilog
1605   %gep = getelementptr i32, ptr addrspace(1) %ptr, i64 4294967296
1606   %result.struct = cmpxchg ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
1607   %result = extractvalue { i32, i1 } %result.struct, 0
1608   %cast = bitcast i32 %result to float
1609   ret float %cast
1612 define amdgpu_ps float @mubuf_cmpxchg_sgpr_ptr_vgpr_offset(ptr addrspace(1) inreg %ptr, i32 %voffset, i32 %old, i32 %in) {
1613 ; GFX6-LABEL: mubuf_cmpxchg_sgpr_ptr_vgpr_offset:
1614 ; GFX6:       ; %bb.0:
1615 ; GFX6-NEXT:    v_mov_b32_e32 v3, v1
1616 ; GFX6-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1617 ; GFX6-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1618 ; GFX6-NEXT:    s_mov_b32 s0, s2
1619 ; GFX6-NEXT:    s_mov_b32 s1, s3
1620 ; GFX6-NEXT:    s_mov_b32 s2, 0
1621 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
1622 ; GFX6-NEXT:    buffer_atomic_cmpswap v[2:3], v[0:1], s[0:3], 0 addr64 glc
1623 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1624 ; GFX6-NEXT:    buffer_wbinvl1
1625 ; GFX6-NEXT:    v_mov_b32_e32 v0, v2
1626 ; GFX6-NEXT:    s_waitcnt expcnt(0)
1627 ; GFX6-NEXT:    ; return to shader part epilog
1629 ; GFX7-LABEL: mubuf_cmpxchg_sgpr_ptr_vgpr_offset:
1630 ; GFX7:       ; %bb.0:
1631 ; GFX7-NEXT:    v_mov_b32_e32 v3, v1
1632 ; GFX7-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1633 ; GFX7-NEXT:    v_lshl_b64 v[0:1], v[0:1], 2
1634 ; GFX7-NEXT:    s_mov_b32 s0, s2
1635 ; GFX7-NEXT:    s_mov_b32 s1, s3
1636 ; GFX7-NEXT:    s_mov_b32 s2, 0
1637 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1638 ; GFX7-NEXT:    buffer_atomic_cmpswap v[2:3], v[0:1], s[0:3], 0 addr64 glc
1639 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1640 ; GFX7-NEXT:    buffer_wbinvl1
1641 ; GFX7-NEXT:    v_mov_b32_e32 v0, v2
1642 ; GFX7-NEXT:    ; return to shader part epilog
1644 ; GFX12-LABEL: mubuf_cmpxchg_sgpr_ptr_vgpr_offset:
1645 ; GFX12:       ; %bb.0:
1646 ; GFX12-NEXT:    v_mov_b32_e32 v3, v1
1647 ; GFX12-NEXT:    v_ashrrev_i32_e32 v1, 31, v0
1648 ; GFX12-NEXT:    v_dual_mov_b32 v5, s3 :: v_dual_mov_b32 v4, s2
1649 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
1650 ; GFX12-NEXT:    v_lshlrev_b64_e32 v[0:1], 2, v[0:1]
1651 ; GFX12-NEXT:    v_add_co_u32 v0, vcc_lo, v4, v0
1652 ; GFX12-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1653 ; GFX12-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, v5, v1, vcc_lo
1654 ; GFX12-NEXT:    global_atomic_cmpswap_b32 v0, v[0:1], v[2:3], off th:TH_ATOMIC_RETURN scope:SCOPE_DEV
1655 ; GFX12-NEXT:    s_wait_loadcnt 0x0
1656 ; GFX12-NEXT:    global_inv scope:SCOPE_DEV
1657 ; GFX12-NEXT:    s_wait_alu 0xfffd
1658 ; GFX12-NEXT:    ; return to shader part epilog
1659   %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 %voffset
1660   %result.struct = cmpxchg ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
1661   %result = extractvalue { i32, i1 } %result.struct, 0
1662   %cast = bitcast i32 %result to float
1663   ret float %cast