AMDGPU: Add pass to detect used kernel features
[oota-llvm.git] / test / CodeGen / AMDGPU / global_atomics.ll
1 ; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=SI --check-prefix=FUNC %s
2 ; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck --check-prefix=GCN --check-prefix=VI --check-prefix=FUNC %s
3
4
5 ; FUNC-LABEL: {{^}}atomic_add_i32_offset:
6 ; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
7 define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
8 entry:
9   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
10   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
11   ret void
12 }
13
14 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
15 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
16 ; GCN: buffer_store_dword [[RET]]
17 define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
18 entry:
19   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
20   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
21   store i32 %0, i32 addrspace(1)* %out2
22   ret void
23 }
24
25 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
26 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
27 ; VI: s_movk_i32 flat_scratch_lo, 0x0
28 ; VI: s_movk_i32 flat_scratch_hi, 0x0
29 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
30
31 define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
32 entry:
33   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
34   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
35   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
36   ret void
37 }
38
39 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
40 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
41 ; VI: s_movk_i32 flat_scratch_lo, 0x0
42 ; VI: s_movk_i32 flat_scratch_hi, 0x0
43 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
44 ; GCN: buffer_store_dword [[RET]]
45 define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
46 entry:
47   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
48   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
49   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
50   store i32 %0, i32 addrspace(1)* %out2
51   ret void
52 }
53
54 ; FUNC-LABEL: {{^}}atomic_add_i32:
55 ; GCN: buffer_atomic_add v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
56 define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
57 entry:
58   %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
59   ret void
60 }
61
62 ; FUNC-LABEL: {{^}}atomic_add_i32_ret:
63 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
64 ; GCN: buffer_store_dword [[RET]]
65 define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
66 entry:
67   %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
68   store i32 %0, i32 addrspace(1)* %out2
69   ret void
70 }
71
72 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
73 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
74 ; VI: s_movk_i32 flat_scratch_lo, 0x0
75 ; VI: s_movk_i32 flat_scratch_hi, 0x0
76 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
77 define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
78 entry:
79   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
80   %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
81   ret void
82 }
83
84 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
85 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
86 ; VI: s_movk_i32 flat_scratch_lo, 0x0
87 ; VI: s_movk_i32 flat_scratch_hi, 0x0
88 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
89 ; GCN: buffer_store_dword [[RET]]
90 define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
91 entry:
92   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
93   %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
94   store i32 %0, i32 addrspace(1)* %out2
95   ret void
96 }
97
98 ; FUNC-LABEL: {{^}}atomic_and_i32_offset:
99 ; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
100 define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
101 entry:
102   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
103   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
104   ret void
105 }
106
107 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
108 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
109 ; GCN: buffer_store_dword [[RET]]
110 define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
111 entry:
112   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
113   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
114   store i32 %0, i32 addrspace(1)* %out2
115   ret void
116 }
117
118 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
119 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
120 ; VI: s_movk_i32 flat_scratch_lo, 0x0
121 ; VI: s_movk_i32 flat_scratch_hi, 0x0
122 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
123 define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
124 entry:
125   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
126   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
127   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
128   ret void
129 }
130
131 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
132 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
133 ; VI: s_movk_i32 flat_scratch_lo, 0x0
134 ; VI: s_movk_i32 flat_scratch_hi, 0x0
135 ; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
136 ; GCN: buffer_store_dword [[RET]]
137 define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
138 entry:
139   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
140   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
141   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
142   store i32 %0, i32 addrspace(1)* %out2
143   ret void
144 }
145
146 ; FUNC-LABEL: {{^}}atomic_and_i32:
147 ; GCN: buffer_atomic_and v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
148 define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
149 entry:
150   %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
151   ret void
152 }
153
154 ; FUNC-LABEL: {{^}}atomic_and_i32_ret:
155 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
156 ; GCN: buffer_store_dword [[RET]]
157 define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
158 entry:
159   %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
160   store i32 %0, i32 addrspace(1)* %out2
161   ret void
162 }
163
164 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
165 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
166 ; VI: s_movk_i32 flat_scratch_lo, 0x0
167 ; VI: s_movk_i32 flat_scratch_hi, 0x0
168 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
169 define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
170 entry:
171   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
172   %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
173   ret void
174 }
175
176 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
177 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
178 ; VI: s_movk_i32 flat_scratch_lo, 0x0
179 ; VI: s_movk_i32 flat_scratch_hi, 0x0
180 ; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
181 ; GCN: buffer_store_dword [[RET]]
182 define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
183 entry:
184   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
185   %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
186   store i32 %0, i32 addrspace(1)* %out2
187   ret void
188 }
189
190 ; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
191 ; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
192 define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
193 entry:
194   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
195   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
196   ret void
197 }
198
199 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
200 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
201 ; GCN: buffer_store_dword [[RET]]
202 define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
203 entry:
204   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
205   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
206   store i32 %0, i32 addrspace(1)* %out2
207   ret void
208 }
209
210 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
211 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
212 ; VI: s_movk_i32 flat_scratch_lo, 0x0
213 ; VI: s_movk_i32 flat_scratch_hi, 0x0
214 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
215 define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
216 entry:
217   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
218   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
219   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
220   ret void
221 }
222
223 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
224 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
225 ; VI: s_movk_i32 flat_scratch_lo, 0x0
226 ; VI: s_movk_i32 flat_scratch_hi, 0x0
227 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
228 ; GCN: buffer_store_dword [[RET]]
229 define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
230 entry:
231   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
232   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
233   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
234   store i32 %0, i32 addrspace(1)* %out2
235   ret void
236 }
237
238 ; FUNC-LABEL: {{^}}atomic_sub_i32:
239 ; GCN: buffer_atomic_sub v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
240 define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
241 entry:
242   %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
243   ret void
244 }
245
246 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
247 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
248 ; GCN: buffer_store_dword [[RET]]
249 define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
250 entry:
251   %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
252   store i32 %0, i32 addrspace(1)* %out2
253   ret void
254 }
255
256 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
257 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
258 ; VI: s_movk_i32 flat_scratch_lo, 0x0
259 ; VI: s_movk_i32 flat_scratch_hi, 0x0
260 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
261 define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
262 entry:
263   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
264   %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
265   ret void
266 }
267
268 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
269 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
270 ; VI: s_movk_i32 flat_scratch_lo, 0x0
271 ; VI: s_movk_i32 flat_scratch_hi, 0x0
272 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
273 ; GCN: buffer_store_dword [[RET]]
274 define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
275 entry:
276   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
277   %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
278   store i32 %0, i32 addrspace(1)* %out2
279   ret void
280 }
281
282 ; FUNC-LABEL: {{^}}atomic_max_i32_offset:
283 ; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
284 define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
285 entry:
286   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
287   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
288   ret void
289 }
290
291 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
292 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
293 ; GCN: buffer_store_dword [[RET]]
294 define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
295 entry:
296   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
297   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
298   store i32 %0, i32 addrspace(1)* %out2
299   ret void
300 }
301
302 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
303 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
304 ; VI: s_movk_i32 flat_scratch_lo, 0x0
305 ; VI: s_movk_i32 flat_scratch_hi, 0x0
306 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
307 define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
308 entry:
309   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
310   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
311   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
312   ret void
313 }
314
315 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
316 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
317 ; VI: s_movk_i32 flat_scratch_lo, 0x0
318 ; VI: s_movk_i32 flat_scratch_hi, 0x0
319 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
320 ; GCN: buffer_store_dword [[RET]]
321 define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
322 entry:
323   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
324   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
325   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
326   store i32 %0, i32 addrspace(1)* %out2
327   ret void
328 }
329
330 ; FUNC-LABEL: {{^}}atomic_max_i32:
331 ; GCN: buffer_atomic_smax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
332 define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
333 entry:
334   %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
335   ret void
336 }
337
338 ; FUNC-LABEL: {{^}}atomic_max_i32_ret:
339 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
340 ; GCN: buffer_store_dword [[RET]]
341 define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
342 entry:
343   %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
344   store i32 %0, i32 addrspace(1)* %out2
345   ret void
346 }
347
348 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
349 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
350 ; VI: s_movk_i32 flat_scratch_lo, 0x0
351 ; VI: s_movk_i32 flat_scratch_hi, 0x0
352 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
353 define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
354 entry:
355   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
356   %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
357   ret void
358 }
359
360 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
361 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
362 ; VI: s_movk_i32 flat_scratch_lo, 0x0
363 ; VI: s_movk_i32 flat_scratch_hi, 0x0
364 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
365 ; GCN: buffer_store_dword [[RET]]
366 define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
367 entry:
368   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
369   %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
370   store i32 %0, i32 addrspace(1)* %out2
371   ret void
372 }
373
374 ; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
375 ; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
376 define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
377 entry:
378   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
379   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
380   ret void
381 }
382
383 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
384 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
385 ; GCN: buffer_store_dword [[RET]]
386 define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
387 entry:
388   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
389   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
390   store i32 %0, i32 addrspace(1)* %out2
391   ret void
392 }
393
394 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
395 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
396 ; VI: s_movk_i32 flat_scratch_lo, 0x0
397 ; VI: s_movk_i32 flat_scratch_hi, 0x0
398 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
399 define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
400 entry:
401   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
402   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
403   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
404   ret void
405 }
406
407 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
408 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
409 ; VI: s_movk_i32 flat_scratch_lo, 0x0
410 ; VI: s_movk_i32 flat_scratch_hi, 0x0
411 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
412 ; GCN: buffer_store_dword [[RET]]
413 define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
414 entry:
415   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
416   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
417   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
418   store i32 %0, i32 addrspace(1)* %out2
419   ret void
420 }
421
422 ; FUNC-LABEL: {{^}}atomic_umax_i32:
423 ; GCN: buffer_atomic_umax v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
424 define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
425 entry:
426   %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
427   ret void
428 }
429
430 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
431 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
432 ; GCN: buffer_store_dword [[RET]]
433 define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
434 entry:
435   %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
436   store i32 %0, i32 addrspace(1)* %out2
437   ret void
438 }
439
440 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
441 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
442 ; VI: s_movk_i32 flat_scratch_lo, 0x0
443 ; VI: s_movk_i32 flat_scratch_hi, 0x0
444 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
445 define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
446 entry:
447   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
448   %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
449   ret void
450 }
451
452 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
453 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
454 ; VI: s_movk_i32 flat_scratch_lo, 0x0
455 ; VI: s_movk_i32 flat_scratch_hi, 0x0
456 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
457 ; GCN: buffer_store_dword [[RET]]
458 define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
459 entry:
460   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
461   %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
462   store i32 %0, i32 addrspace(1)* %out2
463   ret void
464 }
465
466 ; FUNC-LABEL: {{^}}atomic_min_i32_offset:
467 ; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
468 define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
469 entry:
470   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
471   %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
472   ret void
473 }
474
475 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset:
476 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
477 ; GCN: buffer_store_dword [[RET]]
478 define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
479 entry:
480   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
481   %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
482   store i32 %0, i32 addrspace(1)* %out2
483   ret void
484 }
485
486 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
487 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
488 ; VI: s_movk_i32 flat_scratch_lo, 0x0
489 ; VI: s_movk_i32 flat_scratch_hi, 0x0
490 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
491 define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
492 entry:
493   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
494   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
495   %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
496   ret void
497 }
498
499 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
500 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
501 ; VI: s_movk_i32 flat_scratch_lo, 0x0
502 ; VI: s_movk_i32 flat_scratch_hi, 0x0
503 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
504 ; GCN: buffer_store_dword [[RET]]
505 define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
506 entry:
507   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
508   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
509   %0  = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
510   store i32 %0, i32 addrspace(1)* %out2
511   ret void
512 }
513
514 ; FUNC-LABEL: {{^}}atomic_min_i32:
515 ; GCN: buffer_atomic_smin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
516 define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
517 entry:
518   %0  = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
519   ret void
520 }
521
522 ; FUNC-LABEL: {{^}}atomic_min_i32_ret:
523 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
524 ; GCN: buffer_store_dword [[RET]]
525 define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
526 entry:
527   %0  = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
528   store i32 %0, i32 addrspace(1)* %out2
529   ret void
530 }
531
532 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
533 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
534 ; VI: s_movk_i32 flat_scratch_lo, 0x0
535 ; VI: s_movk_i32 flat_scratch_hi, 0x0
536 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
537 define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
538 entry:
539   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
540   %0  = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
541   ret void
542 }
543
544 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64:
545 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
546 ; VI: s_movk_i32 flat_scratch_lo, 0x0
547 ; VI: s_movk_i32 flat_scratch_hi, 0x0
548 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
549 ; GCN: buffer_store_dword [[RET]]
550 define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
551 entry:
552   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
553   %0  = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
554   store i32 %0, i32 addrspace(1)* %out2
555   ret void
556 }
557
558 ; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
559 ; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
560 define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
561 entry:
562   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
563   %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
564   ret void
565 }
566
567 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset:
568 ; GCN: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
569 ; GCN: buffer_store_dword [[RET]]
570 define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
571 entry:
572   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
573   %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
574   store i32 %0, i32 addrspace(1)* %out2
575   ret void
576 }
577
578 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
579 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
580 ; VI: s_movk_i32 flat_scratch_lo, 0x0
581 ; VI: s_movk_i32 flat_scratch_hi, 0x0
582 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
583 define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
584 entry:
585   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
586   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
587   %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
588   ret void
589 }
590
591 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
592 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
593 ; VI: s_movk_i32 flat_scratch_lo, 0x0
594 ; VI: s_movk_i32 flat_scratch_hi, 0x0
595 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
596 ; GCN: buffer_store_dword [[RET]]
597 define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
598 entry:
599   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
600   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
601   %0  = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
602   store i32 %0, i32 addrspace(1)* %out2
603   ret void
604 }
605
606 ; FUNC-LABEL: {{^}}atomic_umin_i32:
607 ; GCN: buffer_atomic_umin v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
608 define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
609 entry:
610   %0  = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
611   ret void
612 }
613
614 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret:
615 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
616 ; GCN: buffer_store_dword [[RET]]
617 define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
618 entry:
619   %0  = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
620   store i32 %0, i32 addrspace(1)* %out2
621   ret void
622 }
623
624 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
625 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
626 ; VI: s_movk_i32 flat_scratch_lo, 0x0
627 ; VI: s_movk_i32 flat_scratch_hi, 0x0
628 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
629 define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
630 entry:
631   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
632   %0  = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
633   ret void
634 }
635
636 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64:
637 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
638 ; VI: s_movk_i32 flat_scratch_lo, 0x0
639 ; VI: s_movk_i32 flat_scratch_hi, 0x0
640 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
641 ; GCN: buffer_store_dword [[RET]]
642 define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
643 entry:
644   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
645   %0  = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
646   store i32 %0, i32 addrspace(1)* %out2
647   ret void
648 }
649
650 ; FUNC-LABEL: {{^}}atomic_or_i32_offset:
651 ; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
652 define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
653 entry:
654   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
655   %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
656   ret void
657 }
658
659 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset:
660 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
661 ; GCN: buffer_store_dword [[RET]]
662 define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
663 entry:
664   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
665   %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
666   store i32 %0, i32 addrspace(1)* %out2
667   ret void
668 }
669
670 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
671 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
672 ; VI: s_movk_i32 flat_scratch_lo, 0x0
673 ; VI: s_movk_i32 flat_scratch_hi, 0x0
674 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
675 define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
676 entry:
677   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
678   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
679   %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
680   ret void
681 }
682
683 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
684 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
685 ; VI: s_movk_i32 flat_scratch_lo, 0x0
686 ; VI: s_movk_i32 flat_scratch_hi, 0x0
687 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
688 ; GCN: buffer_store_dword [[RET]]
689 define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
690 entry:
691   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
692   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
693   %0  = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
694   store i32 %0, i32 addrspace(1)* %out2
695   ret void
696 }
697
698 ; FUNC-LABEL: {{^}}atomic_or_i32:
699 ; GCN: buffer_atomic_or v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
700 define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
701 entry:
702   %0  = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
703   ret void
704 }
705
706 ; FUNC-LABEL: {{^}}atomic_or_i32_ret:
707 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
708 ; GCN: buffer_store_dword [[RET]]
709 define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
710 entry:
711   %0  = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
712   store i32 %0, i32 addrspace(1)* %out2
713   ret void
714 }
715
716 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
717 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
718 ; VI: s_movk_i32 flat_scratch_lo, 0x0
719 ; VI: s_movk_i32 flat_scratch_hi, 0x0
720 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
721 define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
722 entry:
723   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
724   %0  = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
725   ret void
726 }
727
728 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64:
729 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
730 ; VI: s_movk_i32 flat_scratch_lo, 0x0
731 ; VI: s_movk_i32 flat_scratch_hi, 0x0
732 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
733 ; GCN: buffer_store_dword [[RET]]
734 define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
735 entry:
736   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
737   %0  = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
738   store i32 %0, i32 addrspace(1)* %out2
739   ret void
740 }
741
742 ; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
743 ; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
744 define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
745 entry:
746   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
747   %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
748   ret void
749 }
750
751 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset:
752 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
753 ; GCN: buffer_store_dword [[RET]]
754 define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
755 entry:
756   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
757   %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
758   store i32 %0, i32 addrspace(1)* %out2
759   ret void
760 }
761
762 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
763 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
764 define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
765 entry:
766   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
767   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
768   %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
769   ret void
770 }
771
772 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
773 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
774 ; VI: s_movk_i32 flat_scratch_lo, 0x0
775 ; VI: s_movk_i32 flat_scratch_hi, 0x0
776 ; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
777 ; GCN: buffer_store_dword [[RET]]
778 define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
779 entry:
780   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
781   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
782   %0  = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
783   store i32 %0, i32 addrspace(1)* %out2
784   ret void
785 }
786
787 ; FUNC-LABEL: {{^}}atomic_xchg_i32:
788 ; GCN: buffer_atomic_swap v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
789 define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
790 entry:
791   %0  = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
792   ret void
793 }
794
795 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret:
796 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
797 ; GCN: buffer_store_dword [[RET]]
798 define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
799 entry:
800   %0  = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
801   store i32 %0, i32 addrspace(1)* %out2
802   ret void
803 }
804
805 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
806 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
807 ; VI: s_movk_i32 flat_scratch_lo, 0x0
808 ; VI: s_movk_i32 flat_scratch_hi, 0x0
809 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
810 define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
811 entry:
812   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
813   %0  = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
814   ret void
815 }
816
817 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
818 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
819 ; VI: s_movk_i32 flat_scratch_lo, 0x0
820 ; VI: s_movk_i32 flat_scratch_hi, 0x0
821 ; VI: flat_atomic_swap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
822 ; GCN: buffer_store_dword [[RET]]
823 define void @atomic_xchg_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   %0  = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
827   store i32 %0, i32 addrspace(1)* %out2
828   ret void
829 }
830
831 ; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
832 ; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
833 define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
834 entry:
835   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
836   %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
837   ret void
838 }
839
840 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset:
841 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
842 ; GCN: buffer_store_dword [[RET]]
843 define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
844 entry:
845   %gep = getelementptr i32, i32 addrspace(1)* %out, i32 4
846   %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
847   store i32 %0, i32 addrspace(1)* %out2
848   ret void
849 }
850
851 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
852 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
853 ; VI: s_movk_i32 flat_scratch_lo, 0x0
854 ; VI: s_movk_i32 flat_scratch_hi, 0x0
855 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
856 define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
857 entry:
858   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
859   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
860   %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
861   ret void
862 }
863
864 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
865 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
866 ; VI: s_movk_i32 flat_scratch_lo, 0x0
867 ; VI: s_movk_i32 flat_scratch_hi, 0x0
868 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
869 ; GCN: buffer_store_dword [[RET]]
870 define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
871 entry:
872   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
873   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
874   %0  = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
875   store i32 %0, i32 addrspace(1)* %out2
876   ret void
877 }
878
879 ; FUNC-LABEL: {{^}}atomic_xor_i32:
880 ; GCN: buffer_atomic_xor v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
881 define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
882 entry:
883   %0  = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
884   ret void
885 }
886
887 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret:
888 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
889 ; GCN: buffer_store_dword [[RET]]
890 define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
891 entry:
892   %0  = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
893   store i32 %0, i32 addrspace(1)* %out2
894   ret void
895 }
896
897 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
898 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
899 ; VI: s_movk_i32 flat_scratch_lo, 0x0
900 ; VI: s_movk_i32 flat_scratch_hi, 0x0
901 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
902 define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
903 entry:
904   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
905   %0  = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
906   ret void
907 }
908
909 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64:
910 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
911 ; VI: s_movk_i32 flat_scratch_lo, 0x0
912 ; VI: s_movk_i32 flat_scratch_hi, 0x0
913 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
914 ; GCN: buffer_store_dword [[RET]]
915 define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
916 entry:
917   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
918   %0  = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
919   store i32 %0, i32 addrspace(1)* %out2
920   ret void
921 }