[ARM] Fixup the creation of VPT blocks
[llvm-core.git] / test / CodeGen / AMDGPU / global_atomics.ll
blob72f748578b34271a46232b4aaf023867549e0508
1 ; RUN: llc -march=amdgcn -amdgpu-atomic-optimizations=false -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SI,SIVI %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -amdgpu-atomic-optimizations=false -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI,SIVI %s
3 ; RUN: llc -march=amdgcn -mcpu=gfx900 -amdgpu-atomic-optimizations=false -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s
5 ; GCN-LABEL: {{^}}atomic_add_i32_offset:
6 ; SIVI: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
7 ; GFX9: global_atomic_add v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
8 define amdgpu_kernel void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
9 entry:
10   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
11   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
12   ret void
15 ; GCN-LABEL: {{^}}atomic_add_i32_max_neg_offset:
16 ; GFX9: global_atomic_add v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off offset:-4096{{$}}
17 define amdgpu_kernel void @atomic_add_i32_max_neg_offset(i32 addrspace(1)* %out, i32 %in) {
18 entry:
19   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 -1024
20   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
21   ret void
24 ; GCN-LABEL: {{^}}atomic_add_i32_soffset:
25 ; SIVI: s_mov_b32 [[SREG:s[0-9]+]], 0x8ca0
26 ; SIVI: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], [[SREG]]{{$}}
28 ; GFX9: global_atomic_add v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
29 define amdgpu_kernel void @atomic_add_i32_soffset(i32 addrspace(1)* %out, i32 %in) {
30 entry:
31   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 9000
32   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
33   ret void
36 ; GCN-LABEL: {{^}}atomic_add_i32_huge_offset:
37 ; SI-DAG: v_mov_b32_e32 v[[PTRLO:[0-9]+]], 0xdeac
38 ; SI-DAG: v_mov_b32_e32 v[[PTRHI:[0-9]+]], 0xabcd
39 ; SI: buffer_atomic_add v{{[0-9]+}}, v{{\[}}[[PTRLO]]:[[PTRHI]]{{\]}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
41 ; VI: flat_atomic_add
43 ; GFX9: global_atomic_add v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
44 define amdgpu_kernel void @atomic_add_i32_huge_offset(i32 addrspace(1)* %out, i32 %in) {
45 entry:
46   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 47224239175595
48   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
49   ret void
52 ; GCN-LABEL: {{^}}atomic_add_i32_ret_offset:
53 ; SIVI: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
54 ; SIVI: buffer_store_dword [[RET]]
56 ; GFX9: global_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
57 define amdgpu_kernel void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
58 entry:
59   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
60   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
61   store i32 %val, i32 addrspace(1)* %out2
62   ret void
65 ; GCN-LABEL: {{^}}atomic_add_i32_addr64_offset:
66 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
67 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
68 ; GFX9: global_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
69 define amdgpu_kernel void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
70 entry:
71   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
72   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
73   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
74   ret void
77 ; GCN-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
78 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
79 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
80 ; SIVI: buffer_store_dword [[RET]]
82 ; GFX9: global_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
83 ; GFX9: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RET]]
84 define amdgpu_kernel void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
85 entry:
86   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
87   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
88   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
89   store i32 %val, i32 addrspace(1)* %out2
90   ret void
93 ; GCN-LABEL: {{^}}atomic_add_i32:
94 ; SIVI: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
95 ; GFX9: global_atomic_add v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
96 define amdgpu_kernel void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
97 entry:
98   %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
99   ret void
102 ; GCN-LABEL: {{^}}atomic_add_i32_ret:
103 ; SIVI: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
104 ; SIVI: buffer_store_dword [[RET]]
106 ; GFX9: global_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
107 ; GFX9: global_store_dword v{{\[[0-9]+:[0-9]+\]}}, [[RET]]
108 define amdgpu_kernel void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
109 entry:
110   %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
111   store i32 %val, i32 addrspace(1)* %out2
112   ret void
115 ; GCN-LABEL: {{^}}atomic_add_i32_addr64:
116 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
117 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
118 ; GFX9: global_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
119 define amdgpu_kernel void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
120 entry:
121   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
122   %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
123   ret void
126 ; GCN-LABEL: {{^}}atomic_add_i32_ret_addr64:
127 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
128 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
129 ; SIVI: buffer_store_dword [[RET]]
131 ; GFX9: global_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
132 define amdgpu_kernel void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
133 entry:
134   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
135   %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
136   store i32 %val, i32 addrspace(1)* %out2
137   ret void
140 ; GCN-LABEL: {{^}}atomic_and_i32_offset:
141 ; SIVI: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
143 ; GFX9: global_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
144 define amdgpu_kernel void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
145 entry:
146   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
147   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
148   ret void
151 ; GCN-LABEL: {{^}}atomic_and_i32_ret_offset:
152 ; SIVI: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
153 ; SIVI: buffer_store_dword [[RET]]
155 ; GFX9: global_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
156 define amdgpu_kernel void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
157 entry:
158   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
159   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
160   store i32 %val, i32 addrspace(1)* %out2
161   ret void
164 ; GCN-LABEL: {{^}}atomic_and_i32_addr64_offset:
165 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
166 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
168 ; GFX9: global_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
169 define amdgpu_kernel void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
170 entry:
171   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
172   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
173   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
174   ret void
177 ; GCN-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
178 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
179 ; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
180 ; SIVI: buffer_store_dword [[RET]]
182 ; GFX9: global_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
183 define amdgpu_kernel void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
184 entry:
185   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
186   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
187   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
188   store i32 %val, i32 addrspace(1)* %out2
189   ret void
192 ; GCN-LABEL: {{^}}atomic_and_i32:
193 ; SIVI: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
195 ; GFX9: global_atomic_and v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
196 define amdgpu_kernel void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
197 entry:
198   %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
199   ret void
202 ; GCN-LABEL: {{^}}atomic_and_i32_ret:
203 ; SIVI: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
204 ; SIVI: buffer_store_dword [[RET]]
206 ; GFX9: global_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
207 define amdgpu_kernel void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
208 entry:
209   %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
210   store i32 %val, i32 addrspace(1)* %out2
211   ret void
214 ; GCN-LABEL: {{^}}atomic_and_i32_addr64:
215 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
216 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
218 ; GFX9: global_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
219 define amdgpu_kernel void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
220 entry:
221   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
222   %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
223   ret void
226 ; GCN-LABEL: {{^}}atomic_and_i32_ret_addr64:
227 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
228 ; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
229 ; SIVI: buffer_store_dword [[RET]]
231 ; GFX9: global_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
232 define amdgpu_kernel void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
233 entry:
234   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
235   %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
236   store i32 %val, i32 addrspace(1)* %out2
237   ret void
240 ; GCN-LABEL: {{^}}atomic_sub_i32_offset:
241 ; SIVI: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
243 ; GFX9: global_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
244 define amdgpu_kernel void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
245 entry:
246   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
247   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
248   ret void
251 ; GCN-LABEL: {{^}}atomic_sub_i32_ret_offset:
252 ; SIVI: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
253 ; SIVI: buffer_store_dword [[RET]]
255 ; GFX9: global_atomic_sub v{{[0-9]+}}, v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
256 define amdgpu_kernel void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
257 entry:
258   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
259   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
260   store i32 %val, i32 addrspace(1)* %out2
261   ret void
264 ; GCN-LABEL: {{^}}atomic_sub_i32_addr64_offset:
265 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
266 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
268 ; GFX9: global_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
269 define amdgpu_kernel void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
270 entry:
271   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
272   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
273   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
274   ret void
277 ; GCN-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
278 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
279 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
280 ; SIVI: buffer_store_dword [[RET]]
282 ; GFX9: global_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
283 define amdgpu_kernel void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
284 entry:
285   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
286   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
287   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
288   store i32 %val, i32 addrspace(1)* %out2
289   ret void
292 ; GCN-LABEL: {{^}}atomic_sub_i32:
293 ; SIVI: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
295 ; GFX9: global_atomic_sub v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
296 define amdgpu_kernel void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
297 entry:
298   %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
299   ret void
302 ; GCN-LABEL: {{^}}atomic_sub_i32_ret:
303 ; SIVI: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
304 ; SIVI: buffer_store_dword [[RET]]
306 ; GFX9: global_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
307 define amdgpu_kernel void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
308 entry:
309   %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
310   store i32 %val, i32 addrspace(1)* %out2
311   ret void
314 ; GCN-LABEL: {{^}}atomic_sub_i32_addr64:
315 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
316 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
318 ; GFX9: global_atomic_sub v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off{{$}}
319 define amdgpu_kernel void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
320 entry:
321   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
322   %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
323   ret void
326 ; GCN-LABEL: {{^}}atomic_sub_i32_ret_addr64:
327 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
328 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
329 ; SIVI: buffer_store_dword [[RET]]
331 ; GFX9: global_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
332 define amdgpu_kernel void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
333 entry:
334   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
335   %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
336   store i32 %val, i32 addrspace(1)* %out2
337   ret void
340 ; GCN-LABEL: {{^}}atomic_max_i32_offset:
341 ; SIVI: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
343 ; GFX9: global_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
344 define amdgpu_kernel void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
345 entry:
346   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
347   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
348   ret void
351 ; GCN-LABEL: {{^}}atomic_max_i32_ret_offset:
352 ; SIVI: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
353 ; SIVI: buffer_store_dword [[RET]]
355 ; GFX9: global_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
356 define amdgpu_kernel void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
357 entry:
358   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
359   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
360   store i32 %val, i32 addrspace(1)* %out2
361   ret void
364 ; GCN-LABEL: {{^}}atomic_max_i32_addr64_offset:
365 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
366 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
368 ; GFX9: global_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
369 define amdgpu_kernel void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
370 entry:
371   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
372   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
373   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
374   ret void
377 ; GCN-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
378 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
379 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
380 ; SIVI: buffer_store_dword [[RET]]
382 ; GFX9: global_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
383 define amdgpu_kernel void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
384 entry:
385   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
386   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
387   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
388   store i32 %val, i32 addrspace(1)* %out2
389   ret void
392 ; GCN-LABEL: {{^}}atomic_max_i32:
393 ; SIVI: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
395 ; GFX9: global_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
396 define amdgpu_kernel void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
397 entry:
398   %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
399   ret void
402 ; GCN-LABEL: {{^}}atomic_max_i32_ret:
403 ; SIVI: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
404 ; SIVI: buffer_store_dword [[RET]]
406 ; GFX9: global_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
407 define amdgpu_kernel void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
408 entry:
409   %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
410   store i32 %val, i32 addrspace(1)* %out2
411   ret void
414 ; GCN-LABEL: {{^}}atomic_max_i32_addr64:
415 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
416 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
418 ; GFX9: global_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
419 define amdgpu_kernel void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
420 entry:
421   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
422   %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
423   ret void
426 ; GCN-LABEL: {{^}}atomic_max_i32_ret_addr64:
427 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
428 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
429 ; SIVI: buffer_store_dword [[RET]]
431 ; GFX9: global_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
432 define amdgpu_kernel void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
433 entry:
434   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
435   %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
436   store i32 %val, i32 addrspace(1)* %out2
437   ret void
440 ; GCN-LABEL: {{^}}atomic_umax_i32_offset:
441 ; SIVI: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
443 ; GFX9: global_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
444 define amdgpu_kernel void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
445 entry:
446   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
447   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
448   ret void
451 ; GCN-LABEL: {{^}}atomic_umax_i32_ret_offset:
452 ; SIVI: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
453 ; SIVI: buffer_store_dword [[RET]]
455 ; GFX9: global_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
456 define amdgpu_kernel void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
457 entry:
458   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
459   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
460   store i32 %val, i32 addrspace(1)* %out2
461   ret void
464 ; GCN-LABEL: {{^}}atomic_umax_i32_addr64_offset:
465 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
466 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
467 ; GFX9: global_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
468 define amdgpu_kernel void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
469 entry:
470   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
471   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
472   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
473   ret void
476 ; GCN-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
477 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
478 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
479 ; SIVI: buffer_store_dword [[RET]]
481 ; GFX9: global_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
482 define amdgpu_kernel void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
483 entry:
484   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
485   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
486   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
487   store i32 %val, i32 addrspace(1)* %out2
488   ret void
491 ; GCN-LABEL: {{^}}atomic_umax_i32:
492 ; SIVI: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
494 ; GFX9: global_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
495 define amdgpu_kernel void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
496 entry:
497   %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
498   ret void
501 ; GCN-LABEL: {{^}}atomic_umax_i32_ret:
502 ; SIVI: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
503 ; SIVI: buffer_store_dword [[RET]]
505 ; GFX9: global_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
506 define amdgpu_kernel void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
507 entry:
508   %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
509   store i32 %val, i32 addrspace(1)* %out2
510   ret void
513 ; GCN-LABEL: {{^}}atomic_umax_i32_addr64:
514 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
515 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
516 ; GFX9: global_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
517 define amdgpu_kernel void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
518 entry:
519   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
520   %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
521   ret void
524 ; GCN-LABEL: {{^}}atomic_umax_i32_ret_addr64:
525 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
526 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
527 ; SIVI: buffer_store_dword [[RET]]
529 ; GFX9: global_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
530 define amdgpu_kernel void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
531 entry:
532   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
533   %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
534   store i32 %val, i32 addrspace(1)* %out2
535   ret void
538 ; GCN-LABEL: {{^}}atomic_min_i32_offset:
539 ; SIVI: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
541 ; GFX9: global_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
542 define amdgpu_kernel void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
543 entry:
544   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
545   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
546   ret void
549 ; GCN-LABEL: {{^}}atomic_min_i32_ret_offset:
550 ; SIVI: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
551 ; SIVI: buffer_store_dword [[RET]]
553 ; GFX9: global_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
554 define amdgpu_kernel void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
555 entry:
556   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
557   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
558   store i32 %val, i32 addrspace(1)* %out2
559   ret void
562 ; GCN-LABEL: {{^}}atomic_min_i32_addr64_offset:
563 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
564 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
565 ; GFX9: global_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16
566 define amdgpu_kernel void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
567 entry:
568   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
569   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
570   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
571   ret void
574 ; GCN-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
575 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
576 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
577 ; SIVI: buffer_store_dword [[RET]]
579 ; GFX9: global_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
580 define amdgpu_kernel void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
581 entry:
582   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
583   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
584   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
585   store i32 %val, i32 addrspace(1)* %out2
586   ret void
589 ; GCN-LABEL: {{^}}atomic_min_i32:
590 ; SIVI: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
592 ; GFX9: global_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
593 define amdgpu_kernel void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
594 entry:
595   %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
596   ret void
599 ; GCN-LABEL: {{^}}atomic_min_i32_ret:
600 ; SIVI: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
601 ; SIVI: buffer_store_dword [[RET]]
603 ; GFX9: global_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
604 define amdgpu_kernel void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
605 entry:
606   %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
607   store i32 %val, i32 addrspace(1)* %out2
608   ret void
611 ; GCN-LABEL: {{^}}atomic_min_i32_addr64:
612 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
613 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
614 ; GFX9: global_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
615 define amdgpu_kernel void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
616 entry:
617   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
618   %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
619   ret void
622 ; GCN-LABEL: {{^}}atomic_min_i32_ret_addr64:
623 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
624 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
625 ; SIVI: buffer_store_dword [[RET]]
627 ; GFX9: global_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
628 define amdgpu_kernel void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
629 entry:
630   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
631   %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
632   store i32 %val, i32 addrspace(1)* %out2
633   ret void
636 ; GCN-LABEL: {{^}}atomic_umin_i32_offset:
637 ; SIVI: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
639 ; GFX9: global_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
640 define amdgpu_kernel void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
641 entry:
642   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
643   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
644   ret void
647 ; GCN-LABEL: {{^}}atomic_umin_i32_ret_offset:
648 ; SIVI: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
649 ; SIVI: buffer_store_dword [[RET]]
651 ; GFX9: global_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
652 define amdgpu_kernel void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
653 entry:
654   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
655   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
656   store i32 %val, i32 addrspace(1)* %out2
657   ret void
660 ; GCN-LABEL: {{^}}atomic_umin_i32_addr64_offset:
661 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
662 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
663 ; GFX9: global_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
664 define amdgpu_kernel void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
665 entry:
666   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
667   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
668   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
669   ret void
672 ; GCN-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
673 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
674 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
675 ; SIVI: buffer_store_dword [[RET]]
677 ; GFX9: global_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
678 define amdgpu_kernel void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
679 entry:
680   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
681   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
682   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
683   store i32 %val, i32 addrspace(1)* %out2
684   ret void
687 ; GCN-LABEL: {{^}}atomic_umin_i32:
688 ; SIVI: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
689 ; GFX9: global_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
690 define amdgpu_kernel void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
691 entry:
692   %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
693   ret void
696 ; GCN-LABEL: {{^}}atomic_umin_i32_ret:
697 ; SIVI: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
698 ; SIVI: buffer_store_dword [[RET]]
700 ; GFX9: global_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
701 define amdgpu_kernel void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
702 entry:
703   %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
704   store i32 %val, i32 addrspace(1)* %out2
705   ret void
708 ; GCN-LABEL: {{^}}atomic_umin_i32_addr64:
709 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
710 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
711 ; GFX9: global_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
712 define amdgpu_kernel void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
713 entry:
714   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
715   %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
716   ret void
719 ; GCN-LABEL: {{^}}atomic_umin_i32_ret_addr64:
720 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
721 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
722 ; SIVI: buffer_store_dword [[RET]]
724 ; GFX9: global_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
725 define amdgpu_kernel void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
726 entry:
727   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
728   %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
729   store i32 %val, i32 addrspace(1)* %out2
730   ret void
733 ; GCN-LABEL: {{^}}atomic_or_i32_offset:
734 ; SIVI: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
736 ; GFX9: global_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
737 define amdgpu_kernel void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
738 entry:
739   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
740   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
741   ret void
744 ; GCN-LABEL: {{^}}atomic_or_i32_ret_offset:
745 ; SIVI: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
746 ; SIVI: buffer_store_dword [[RET]]
748 ; GFX9: global_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
749 define amdgpu_kernel void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
750 entry:
751   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
752   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
753   store i32 %val, i32 addrspace(1)* %out2
754   ret void
757 ; GCN-LABEL: {{^}}atomic_or_i32_addr64_offset:
758 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
759 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
760 ; GFX9: global_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16
761 define amdgpu_kernel void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
762 entry:
763   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
764   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
765   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
766   ret void
769 ; GCN-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
770 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
771 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
772 ; SIVI: buffer_store_dword [[RET]]
774 ; GFX9: global_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
775 define amdgpu_kernel void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
776 entry:
777   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
778   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
779   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
780   store i32 %val, i32 addrspace(1)* %out2
781   ret void
784 ; GCN-LABEL: {{^}}atomic_or_i32:
785 ; SIVI: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
787 ; GFX9: global_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
788 define amdgpu_kernel void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
789 entry:
790   %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
791   ret void
794 ; GCN-LABEL: {{^}}atomic_or_i32_ret:
795 ; SIVI: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
796 ; SIVI: buffer_store_dword [[RET]]
798 ; GFX9: global_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
799 define amdgpu_kernel void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
800 entry:
801   %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
802   store i32 %val, i32 addrspace(1)* %out2
803   ret void
806 ; GCN-LABEL: {{^}}atomic_or_i32_addr64:
807 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
808 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
809 ; GFX9: global_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
810 define amdgpu_kernel void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
811 entry:
812   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
813   %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
814   ret void
817 ; GCN-LABEL: {{^}}atomic_or_i32_ret_addr64:
818 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
819 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
820 ; SIVI: buffer_store_dword [[RET]]
822 ; GFX9: global_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
823 define amdgpu_kernel void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
824 entry:
825   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
826   %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
827   store i32 %val, i32 addrspace(1)* %out2
828   ret void
831 ; GCN-LABEL: {{^}}atomic_xchg_i32_offset:
832 ; SIVI: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
834 ; GFX9: global_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
835 define amdgpu_kernel void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
836 entry:
837   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
838   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
839   ret void
842 ; GCN-LABEL: {{^}}atomic_xchg_f32_offset:
843 ; SIVI: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
845 ; GFX9: global_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
846 define amdgpu_kernel void @atomic_xchg_f32_offset(float addrspace(1)* %out, float %in) {
847 entry:
848   %gep = getelementptr float, float addrspace(1)* %out, i64 4
849   %val = atomicrmw volatile xchg float addrspace(1)* %gep, float %in seq_cst
850   ret void
853 ; GCN-LABEL: {{^}}atomic_xchg_i32_ret_offset:
854 ; SIVI: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
855 ; SIVI: buffer_store_dword [[RET]]
857 ; GFX9: global_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
858 define amdgpu_kernel void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
859 entry:
860   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
861   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
862   store i32 %val, i32 addrspace(1)* %out2
863   ret void
866 ; GCN-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
867 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
868 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
869 ; GFX9: global_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
870 define amdgpu_kernel void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
871 entry:
872   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
873   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
874   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
875   ret void
878 ; GCN-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
879 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
880 ; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
881 ; SIVI: buffer_store_dword [[RET]]
883 ; GFX9: global_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
884 define amdgpu_kernel void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
885 entry:
886   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
887   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
888   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
889   store i32 %val, i32 addrspace(1)* %out2
890   ret void
893 ; GCN-LABEL: {{^}}atomic_xchg_i32:
894 ; SIVI: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
895 ; GFX9: global_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
896 define amdgpu_kernel void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
897 entry:
898   %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
899   ret void
902 ; GCN-LABEL: {{^}}atomic_xchg_i32_ret:
903 ; SIVI: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
904 ; SIVI: buffer_store_dword [[RET]]
906 ; GFX9: global_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
907 define amdgpu_kernel void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
908 entry:
909   %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
910   store i32 %val, i32 addrspace(1)* %out2
911   ret void
914 ; GCN-LABEL: {{^}}atomic_xchg_i32_addr64:
915 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
916 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
917 ; GFX9: global_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
918 define amdgpu_kernel void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
919 entry:
920   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
921   %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
922   ret void
925 ; GCN-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
926 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
927 ; VI: flat_atomic_swap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
928 ; SIVI: buffer_store_dword [[RET]]
930 ; GFX9: global_atomic_swap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
931 define amdgpu_kernel void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
932 entry:
933   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
934   %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
935   store i32 %val, i32 addrspace(1)* %out2
936   ret void
939 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_offset:
940 ; SIVI: buffer_atomic_cmpswap v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
942 ; GFX9: global_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}], off offset:16{{$}}
943 define amdgpu_kernel void @atomic_cmpxchg_i32_offset(i32 addrspace(1)* %out, i32 %in, i32 %old) {
944 entry:
945   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
946   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
947   ret void
950 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_ret_offset:
951 ; SIVI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
952 ; SIVI: buffer_store_dword v[[RET]]
954 ; GFX9: global_atomic_cmpswap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{\[[0-9]+:[0-9]+\]}}, off offset:16 glc{{$}}
955 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
956 entry:
957   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
958   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
959   %extract0 = extractvalue { i32, i1 } %val, 0
960   store i32 %extract0, i32 addrspace(1)* %out2
961   ret void
964 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset:
965 ; SI: buffer_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
967 ; VI: flat_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}]{{$}}
968 ; GFX9: global_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], off offset:16{{$}}
969 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
970 entry:
971   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
972   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
973   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
974   ret void
977 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64_offset:
978 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
979 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
980 ; SIVI: buffer_store_dword v[[RET]]
982 ; GFX9: global_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}], off offset:16 glc{{$}}
983 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
984 entry:
985   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
986   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
987   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
988   %extract0 = extractvalue { i32, i1 } %val, 0
989   store i32 %extract0, i32 addrspace(1)* %out2
990   ret void
993 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32:
994 ; SIVI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
996 ; GFX9: global_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}], off{{$}}
997 define amdgpu_kernel void @atomic_cmpxchg_i32(i32 addrspace(1)* %out, i32 %in, i32 %old) {
998 entry:
999   %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
1000   ret void
1003 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_ret:
1004 ; SIVI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
1005 ; SIVI: buffer_store_dword v[[RET]]
1007 ; GFX9: global_atomic_cmpswap [[RET:v[0-9]+]], v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], off glc{{$}}
1008 define amdgpu_kernel void @atomic_cmpxchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
1009 entry:
1010   %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
1011   %extract0 = extractvalue { i32, i1 } %val, 0
1012   store i32 %extract0, i32 addrspace(1)* %out2
1013   ret void
1016 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_addr64:
1017 ; SI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
1018 ; VI: flat_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}}
1019 ; GFX9: global_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}], off{{$}}
1020 define amdgpu_kernel void @atomic_cmpxchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
1021 entry:
1022   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1023   %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
1024   ret void
1027 ; GCN-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64:
1028 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
1029 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
1030 ; SIVI: buffer_store_dword v[[RET]]
1032 ; GFX9: global_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}], off glc{{$}}
1033 define amdgpu_kernel void @atomic_cmpxchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
1034 entry:
1035   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1036   %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
1037   %extract0 = extractvalue { i32, i1 } %val, 0
1038   store i32 %extract0, i32 addrspace(1)* %out2
1039   ret void
1042 ; GCN-LABEL: {{^}}atomic_xor_i32_offset:
1043 ; SIVI: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
1045 ; GFX9: global_atomic_xor v[{{[0-9]+}}:{{[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
1046 define amdgpu_kernel void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
1047 entry:
1048   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
1049   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
1050   ret void
1053 ; GCN-LABEL: {{^}}atomic_xor_i32_ret_offset:
1054 ; SIVI: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
1055 ; SIVI: buffer_store_dword [[RET]]
1057 ; GFX9: global_atomic_xor v{{[0-9]+}}, v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
1058 define amdgpu_kernel void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
1059 entry:
1060   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
1061   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
1062   store i32 %val, i32 addrspace(1)* %out2
1063   ret void
1066 ; GCN-LABEL: {{^}}atomic_xor_i32_addr64_offset:
1067 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
1068 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
1069 ; GFX9: global_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16{{$}}
1070 define amdgpu_kernel void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
1071 entry:
1072   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1073   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
1074   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
1075   ret void
1078 ; GCN-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
1079 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
1080 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
1081 ; SIVI: buffer_store_dword [[RET]]
1083 ; GFX9: global_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off offset:16 glc{{$}}
1084 define amdgpu_kernel void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
1085 entry:
1086   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1087   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
1088   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
1089   store i32 %val, i32 addrspace(1)* %out2
1090   ret void
1093 ; GCN-LABEL: {{^}}atomic_xor_i32:
1094 ; SIVI: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
1095 ; GFX9: global_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
1096 define amdgpu_kernel void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
1097 entry:
1098   %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
1099   ret void
1102 ; GCN-LABEL: {{^}}atomic_xor_i32_ret:
1103 ; SIVI: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
1104 ; SIVI: buffer_store_dword [[RET]]
1106 ; GFX9: global_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
1107 define amdgpu_kernel void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
1108 entry:
1109   %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
1110   store i32 %val, i32 addrspace(1)* %out2
1111   ret void
1114 ; GCN-LABEL: {{^}}atomic_xor_i32_addr64:
1115 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
1116 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
1117 ; GFX9: global_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off{{$}}
1118 define amdgpu_kernel void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
1119 entry:
1120   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1121   %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
1122   ret void
1125 ; GCN-LABEL: {{^}}atomic_xor_i32_ret_addr64:
1126 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
1127 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
1128 ; SIVI: buffer_store_dword [[RET]]
1130 ; GFX9: global_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}, off glc{{$}}
1131 define amdgpu_kernel void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
1132 entry:
1133   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1134   %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
1135   store i32 %val, i32 addrspace(1)* %out2
1136   ret void
1139 ; GCN-LABEL: {{^}}atomic_load_i32_offset:
1140 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
1141 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}}
1142 ; SIVI: buffer_store_dword [[RET]]
1144 ; GFX9: global_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], off offset:16 glc{{$}}
1145 define amdgpu_kernel void @atomic_load_i32_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
1146 entry:
1147   %gep = getelementptr i32, i32 addrspace(1)* %in, i64 4
1148   %val = load atomic i32, i32 addrspace(1)* %gep  seq_cst, align 4
1149   store i32 %val, i32 addrspace(1)* %out
1150   ret void
1153 ; GCN-LABEL: {{^}}atomic_load_i32:
1154 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
1155 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc
1156 ; SIVI: buffer_store_dword [[RET]]
1158 ; GFX9: global_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], off glc
1159 define amdgpu_kernel void @atomic_load_i32(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
1160 entry:
1161   %val = load atomic i32, i32 addrspace(1)* %in seq_cst, align 4
1162   store i32 %val, i32 addrspace(1)* %out
1163   ret void
1166 ; GCN-LABEL: {{^}}atomic_load_i32_addr64_offset:
1167 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
1168 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
1169 ; SIVI: buffer_store_dword [[RET]]
1171 ; GFX9: global_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], off offset:16 glc{{$}}
1172 define amdgpu_kernel void @atomic_load_i32_addr64_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
1173 entry:
1174   %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
1175   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
1176   %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4
1177   store i32 %val, i32 addrspace(1)* %out
1178   ret void
1181 ; GCN-LABEL: {{^}}atomic_load_i32_addr64:
1182 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
1183 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
1184 ; SIVI: buffer_store_dword [[RET]]
1186 ; GFX9: global_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], off glc{{$}}
1187 define amdgpu_kernel void @atomic_load_i32_addr64(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
1188 entry:
1189   %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
1190   %val = load atomic i32, i32 addrspace(1)* %ptr seq_cst, align 4
1191   store i32 %val, i32 addrspace(1)* %out
1192   ret void
1195 ; GCN-LABEL: {{^}}atomic_store_i32_offset:
1196 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
1197 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+$}}
1198 ; GFX9: global_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}}, off offset:16{{$}}
1199 define amdgpu_kernel void @atomic_store_i32_offset(i32 %in, i32 addrspace(1)* %out) {
1200 entry:
1201   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
1202   store atomic i32 %in, i32 addrspace(1)* %gep  seq_cst, align 4
1203   ret void
1206 ; GCN-LABEL: {{^}}atomic_store_i32:
1207 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
1208 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+$}}
1209 ; GFX9: global_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}}, off{{$}}
1210 define amdgpu_kernel void @atomic_store_i32(i32 %in, i32 addrspace(1)* %out) {
1211 entry:
1212   store atomic i32 %in, i32 addrspace(1)* %out seq_cst, align 4
1213   ret void
1216 ; GCN-LABEL: {{^}}atomic_store_i32_addr64_offset:
1217 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
1218 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+$}}
1219 ; GFX9: global_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}}, off offset:16{{$}}
1220 define amdgpu_kernel void @atomic_store_i32_addr64_offset(i32 %in, i32 addrspace(1)* %out, i64 %index) {
1221 entry:
1222   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1223   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
1224   store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4
1225   ret void
1228 ; GCN-LABEL: {{^}}atomic_store_i32_addr64:
1229 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
1230 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+$}}
1231 ; GFX9: global_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}}, off{{$}}
1232 define amdgpu_kernel void @atomic_store_i32_addr64(i32 %in, i32 addrspace(1)* %out, i64 %index) {
1233 entry:
1234   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
1235   store atomic i32 %in, i32 addrspace(1)* %ptr seq_cst, align 4
1236   ret void