R600/SI: Add global atomicrmw max/umax
[oota-llvm.git] / test / CodeGen / R600 / global_atomics.ll
1 ; RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=SI --check-prefix=FUNC %s
2
3 ; FUNC-LABEL: {{^}}atomic_add_i32_offset:
4 ; SI: BUFFER_ATOMIC_ADD v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10{{$}}
5 define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
6 entry:
7   %gep = getelementptr i32 addrspace(1)* %out, i32 4
8   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
9   ret void
10 }
11
12 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
13 ; SI: BUFFER_ATOMIC_ADD [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10 glc {{$}}
14 ; SI: BUFFER_STORE_DWORD [[RET]]
15 define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
16 entry:
17   %gep = getelementptr i32 addrspace(1)* %out, i32 4
18   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
19   store i32 %0, i32 addrspace(1)* %out2
20   ret void
21 }
22
23 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
24 ; SI: BUFFER_ATOMIC_ADD v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10{{$}}
25 define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
26 entry:
27   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
28   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
29   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
30   ret void
31 }
32
33 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
34 ; SI: BUFFER_ATOMIC_ADD [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10 glc{{$}}
35 ; SI: BUFFER_STORE_DWORD [[RET]]
36 define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
37 entry:
38   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
39   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
40   %0  = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
41   store i32 %0, i32 addrspace(1)* %out2
42   ret void
43 }
44
45 ; FUNC-LABEL: {{^}}atomic_add_i32:
46 ; SI: BUFFER_ATOMIC_ADD v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
47 define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
48 entry:
49   %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
50   ret void
51 }
52
53 ; FUNC-LABEL: {{^}}atomic_add_i32_ret:
54 ; SI: BUFFER_ATOMIC_ADD [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
55 ; SI: BUFFER_STORE_DWORD [[RET]]
56 define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
57 entry:
58   %0  = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
59   store i32 %0, i32 addrspace(1)* %out2
60   ret void
61 }
62
63 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
64 ; SI: BUFFER_ATOMIC_ADD v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
65 define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
66 entry:
67   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
68   %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
69   ret void
70 }
71
72 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
73 ; SI: BUFFER_ATOMIC_ADD [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
74 ; SI: BUFFER_STORE_DWORD [[RET]]
75 define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
76 entry:
77   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
78   %0  = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
79   store i32 %0, i32 addrspace(1)* %out2
80   ret void
81 }
82
83 ; FUNC-LABEL: {{^}}atomic_and_i32_offset:
84 ; SI: BUFFER_ATOMIC_AND v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10{{$}}
85 define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
86 entry:
87   %gep = getelementptr i32 addrspace(1)* %out, i32 4
88   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
89   ret void
90 }
91
92 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
93 ; SI: BUFFER_ATOMIC_AND [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10 glc {{$}}
94 ; SI: BUFFER_STORE_DWORD [[RET]]
95 define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
96 entry:
97   %gep = getelementptr i32 addrspace(1)* %out, i32 4
98   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
99   store i32 %0, i32 addrspace(1)* %out2
100   ret void
101 }
102
103 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
104 ; SI: BUFFER_ATOMIC_AND v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10{{$}}
105 define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
106 entry:
107   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
108   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
109   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
110   ret void
111 }
112
113 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
114 ; SI: BUFFER_ATOMIC_AND [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10 glc{{$}}
115 ; SI: BUFFER_STORE_DWORD [[RET]]
116 define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
117 entry:
118   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
119   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
120   %0  = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
121   store i32 %0, i32 addrspace(1)* %out2
122   ret void
123 }
124
125 ; FUNC-LABEL: {{^}}atomic_and_i32:
126 ; SI: BUFFER_ATOMIC_AND v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
127 define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
128 entry:
129   %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
130   ret void
131 }
132
133 ; FUNC-LABEL: {{^}}atomic_and_i32_ret:
134 ; SI: BUFFER_ATOMIC_AND [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
135 ; SI: BUFFER_STORE_DWORD [[RET]]
136 define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
137 entry:
138   %0  = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
139   store i32 %0, i32 addrspace(1)* %out2
140   ret void
141 }
142
143 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
144 ; SI: BUFFER_ATOMIC_AND v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
145 define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
146 entry:
147   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
148   %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
149   ret void
150 }
151
152 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
153 ; SI: BUFFER_ATOMIC_AND [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
154 ; SI: BUFFER_STORE_DWORD [[RET]]
155 define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
156 entry:
157   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
158   %0  = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
159   store i32 %0, i32 addrspace(1)* %out2
160   ret void
161 }
162
163 ; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
164 ; SI: BUFFER_ATOMIC_SUB v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10{{$}}
165 define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
166 entry:
167   %gep = getelementptr i32 addrspace(1)* %out, i32 4
168   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
169   ret void
170 }
171
172 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
173 ; SI: BUFFER_ATOMIC_SUB [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10 glc {{$}}
174 ; SI: BUFFER_STORE_DWORD [[RET]]
175 define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
176 entry:
177   %gep = getelementptr i32 addrspace(1)* %out, i32 4
178   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
179   store i32 %0, i32 addrspace(1)* %out2
180   ret void
181 }
182
183 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
184 ; SI: BUFFER_ATOMIC_SUB v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10{{$}}
185 define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
186 entry:
187   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
188   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
189   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
190   ret void
191 }
192
193 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
194 ; SI: BUFFER_ATOMIC_SUB [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10 glc{{$}}
195 ; SI: BUFFER_STORE_DWORD [[RET]]
196 define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
197 entry:
198   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
199   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
200   %0  = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
201   store i32 %0, i32 addrspace(1)* %out2
202   ret void
203 }
204
205 ; FUNC-LABEL: {{^}}atomic_sub_i32:
206 ; SI: BUFFER_ATOMIC_SUB v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
207 define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
208 entry:
209   %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
210   ret void
211 }
212
213 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
214 ; SI: BUFFER_ATOMIC_SUB [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
215 ; SI: BUFFER_STORE_DWORD [[RET]]
216 define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
217 entry:
218   %0  = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
219   store i32 %0, i32 addrspace(1)* %out2
220   ret void
221 }
222
223 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
224 ; SI: BUFFER_ATOMIC_SUB v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
225 define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
226 entry:
227   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
228   %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
229   ret void
230 }
231
232 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
233 ; SI: BUFFER_ATOMIC_SUB [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
234 ; SI: BUFFER_STORE_DWORD [[RET]]
235 define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
236 entry:
237   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
238   %0  = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
239   store i32 %0, i32 addrspace(1)* %out2
240   ret void
241 }
242
243 ; FUNC-LABEL: {{^}}atomic_max_i32_offset:
244 ; SI: BUFFER_ATOMIC_SMAX v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10{{$}}
245 define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
246 entry:
247   %gep = getelementptr i32 addrspace(1)* %out, i32 4
248   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
249   ret void
250 }
251
252 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
253 ; SI: BUFFER_ATOMIC_SMAX [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10 glc {{$}}
254 ; SI: BUFFER_STORE_DWORD [[RET]]
255 define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
256 entry:
257   %gep = getelementptr i32 addrspace(1)* %out, i32 4
258   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
259   store i32 %0, i32 addrspace(1)* %out2
260   ret void
261 }
262
263 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
264 ; SI: BUFFER_ATOMIC_SMAX v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10{{$}}
265 define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
266 entry:
267   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
268   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
269   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
270   ret void
271 }
272
273 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
274 ; SI: BUFFER_ATOMIC_SMAX [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10 glc{{$}}
275 ; SI: BUFFER_STORE_DWORD [[RET]]
276 define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
277 entry:
278   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
279   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
280   %0  = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
281   store i32 %0, i32 addrspace(1)* %out2
282   ret void
283 }
284
285 ; FUNC-LABEL: {{^}}atomic_max_i32:
286 ; SI: BUFFER_ATOMIC_SMAX v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
287 define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
288 entry:
289   %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
290   ret void
291 }
292
293 ; FUNC-LABEL: {{^}}atomic_max_i32_ret:
294 ; SI: BUFFER_ATOMIC_SMAX [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
295 ; SI: BUFFER_STORE_DWORD [[RET]]
296 define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
297 entry:
298   %0  = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
299   store i32 %0, i32 addrspace(1)* %out2
300   ret void
301 }
302
303 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
304 ; SI: BUFFER_ATOMIC_SMAX v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
305 define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
306 entry:
307   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
308   %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
309   ret void
310 }
311
312 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
313 ; SI: BUFFER_ATOMIC_SMAX [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
314 ; SI: BUFFER_STORE_DWORD [[RET]]
315 define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
316 entry:
317   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
318   %0  = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
319   store i32 %0, i32 addrspace(1)* %out2
320   ret void
321 }
322
323 ; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
324 ; SI: BUFFER_ATOMIC_UMAX v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10{{$}}
325 define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
326 entry:
327   %gep = getelementptr i32 addrspace(1)* %out, i32 4
328   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
329   ret void
330 }
331
332 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
333 ; SI: BUFFER_ATOMIC_UMAX [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:0x10 glc {{$}}
334 ; SI: BUFFER_STORE_DWORD [[RET]]
335 define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
336 entry:
337   %gep = getelementptr i32 addrspace(1)* %out, i32 4
338   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
339   store i32 %0, i32 addrspace(1)* %out2
340   ret void
341 }
342
343 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
344 ; SI: BUFFER_ATOMIC_UMAX v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10{{$}}
345 define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
346 entry:
347   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
348   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
349   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
350   ret void
351 }
352
353 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
354 ; SI: BUFFER_ATOMIC_UMAX [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:0x10 glc{{$}}
355 ; SI: BUFFER_STORE_DWORD [[RET]]
356 define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
357 entry:
358   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
359   %gep = getelementptr i32 addrspace(1)* %ptr, i32 4
360   %0  = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
361   store i32 %0, i32 addrspace(1)* %out2
362   ret void
363 }
364
365 ; FUNC-LABEL: {{^}}atomic_umax_i32:
366 ; SI: BUFFER_ATOMIC_UMAX v{{[0-9]+}}, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
367 define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
368 entry:
369   %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
370   ret void
371 }
372
373 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
374 ; SI: BUFFER_ATOMIC_UMAX [[RET:v[0-9]+]], s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
375 ; SI: BUFFER_STORE_DWORD [[RET]]
376 define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
377 entry:
378   %0  = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
379   store i32 %0, i32 addrspace(1)* %out2
380   ret void
381 }
382
383 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
384 ; SI: BUFFER_ATOMIC_UMAX v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
385 define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
386 entry:
387   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
388   %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
389   ret void
390 }
391
392 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
393 ; SI: BUFFER_ATOMIC_UMAX [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
394 ; SI: BUFFER_STORE_DWORD [[RET]]
395 define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
396 entry:
397   %ptr = getelementptr i32 addrspace(1)* %out, i64 %index
398   %0  = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
399   store i32 %0, i32 addrspace(1)* %out2
400   ret void
401 }