Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / flat_atomics_i32_system.ll
blob6bdeeddc951ff18559dea89ba41feccb279f2035
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN1 %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN2 %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN3 %s
6 ; ---------------------------------------------------------------------
7 ; atomicrmw xchg
8 ; ---------------------------------------------------------------------
10 define void @flat_atomic_xchg_i32_noret(ptr %ptr, i32 %in) {
11 ; GCN1-LABEL: flat_atomic_xchg_i32_noret:
12 ; GCN1:       ; %bb.0:
13 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
14 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
15 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
16 ; GCN1-NEXT:    buffer_wbinvl1_vol
17 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
19 ; GCN2-LABEL: flat_atomic_xchg_i32_noret:
20 ; GCN2:       ; %bb.0:
21 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
22 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
23 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
24 ; GCN2-NEXT:    buffer_wbinvl1_vol
25 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
27 ; GCN3-LABEL: flat_atomic_xchg_i32_noret:
28 ; GCN3:       ; %bb.0:
29 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2
31 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
32 ; GCN3-NEXT:    buffer_wbinvl1_vol
33 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
34   %tmp0 = atomicrmw xchg ptr %ptr, i32 %in seq_cst
35   ret void
38 define void @flat_atomic_xchg_i32_noret_offset(ptr %out, i32 %in) {
39 ; GCN1-LABEL: flat_atomic_xchg_i32_noret_offset:
40 ; GCN1:       ; %bb.0:
41 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
42 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
43 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
44 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
45 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
46 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
47 ; GCN1-NEXT:    buffer_wbinvl1_vol
48 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
50 ; GCN2-LABEL: flat_atomic_xchg_i32_noret_offset:
51 ; GCN2:       ; %bb.0:
52 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
53 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
54 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
55 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
56 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
57 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
58 ; GCN2-NEXT:    buffer_wbinvl1_vol
59 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
61 ; GCN3-LABEL: flat_atomic_xchg_i32_noret_offset:
62 ; GCN3:       ; %bb.0:
63 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
64 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2 offset:16
65 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
66 ; GCN3-NEXT:    buffer_wbinvl1_vol
67 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
68   %gep = getelementptr i32, ptr %out, i32 4
69   %tmp0 = atomicrmw xchg ptr %gep, i32 %in seq_cst
70   ret void
73 define i32 @flat_atomic_xchg_i32_ret(ptr %ptr, i32 %in) {
74 ; GCN1-LABEL: flat_atomic_xchg_i32_ret:
75 ; GCN1:       ; %bb.0:
76 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
77 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
78 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
79 ; GCN1-NEXT:    buffer_wbinvl1_vol
80 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
82 ; GCN2-LABEL: flat_atomic_xchg_i32_ret:
83 ; GCN2:       ; %bb.0:
84 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
85 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
86 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
87 ; GCN2-NEXT:    buffer_wbinvl1_vol
88 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
90 ; GCN3-LABEL: flat_atomic_xchg_i32_ret:
91 ; GCN3:       ; %bb.0:
92 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
93 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
94 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
95 ; GCN3-NEXT:    buffer_wbinvl1_vol
96 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
97   %result = atomicrmw xchg ptr %ptr, i32 %in seq_cst
98   ret i32 %result
101 define i32 @flat_atomic_xchg_i32_ret_offset(ptr %out, i32 %in) {
102 ; GCN1-LABEL: flat_atomic_xchg_i32_ret_offset:
103 ; GCN1:       ; %bb.0:
104 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
105 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
106 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
107 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
108 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
109 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
110 ; GCN1-NEXT:    buffer_wbinvl1_vol
111 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
113 ; GCN2-LABEL: flat_atomic_xchg_i32_ret_offset:
114 ; GCN2:       ; %bb.0:
115 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
116 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
117 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
118 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
119 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
120 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
121 ; GCN2-NEXT:    buffer_wbinvl1_vol
122 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
124 ; GCN3-LABEL: flat_atomic_xchg_i32_ret_offset:
125 ; GCN3:       ; %bb.0:
126 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
127 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 offset:16 glc
128 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
129 ; GCN3-NEXT:    buffer_wbinvl1_vol
130 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
131   %gep = getelementptr i32, ptr %out, i32 4
132   %result = atomicrmw xchg ptr %gep, i32 %in seq_cst
133   ret i32 %result
136 define amdgpu_gfx void @flat_atomic_xchg_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
137 ; GCN1-LABEL: flat_atomic_xchg_i32_noret_scalar:
138 ; GCN1:       ; %bb.0:
139 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
140 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
141 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
142 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
143 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
144 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
145 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
146 ; GCN1-NEXT:    buffer_wbinvl1_vol
147 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
149 ; GCN2-LABEL: flat_atomic_xchg_i32_noret_scalar:
150 ; GCN2:       ; %bb.0:
151 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
152 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
153 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
154 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
155 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
156 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
157 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
158 ; GCN2-NEXT:    buffer_wbinvl1_vol
159 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
161 ; GCN3-LABEL: flat_atomic_xchg_i32_noret_scalar:
162 ; GCN3:       ; %bb.0:
163 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
165 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
166 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
167 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
168 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2
169 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
170 ; GCN3-NEXT:    buffer_wbinvl1_vol
171 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
172   %tmp0 = atomicrmw xchg ptr %ptr, i32 %in seq_cst
173   ret void
176 define amdgpu_gfx void @flat_atomic_xchg_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
177 ; GCN1-LABEL: flat_atomic_xchg_i32_noret_offset_scalar:
178 ; GCN1:       ; %bb.0:
179 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
180 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
181 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
182 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
183 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
184 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
185 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
186 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
187 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
188 ; GCN1-NEXT:    buffer_wbinvl1_vol
189 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
191 ; GCN2-LABEL: flat_atomic_xchg_i32_noret_offset_scalar:
192 ; GCN2:       ; %bb.0:
193 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
194 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
195 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
196 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
197 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
198 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
199 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
200 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
201 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
202 ; GCN2-NEXT:    buffer_wbinvl1_vol
203 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
205 ; GCN3-LABEL: flat_atomic_xchg_i32_noret_offset_scalar:
206 ; GCN3:       ; %bb.0:
207 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
208 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
209 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
210 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
211 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
212 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2 offset:16
213 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
214 ; GCN3-NEXT:    buffer_wbinvl1_vol
215 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
216   %gep = getelementptr i32, ptr %out, i32 4
217   %tmp0 = atomicrmw xchg ptr %gep, i32 %in seq_cst
218   ret void
221 define amdgpu_gfx i32 @flat_atomic_xchg_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
222 ; GCN1-LABEL: flat_atomic_xchg_i32_ret_scalar:
223 ; GCN1:       ; %bb.0:
224 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
225 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
226 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
227 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
228 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
229 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
230 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
231 ; GCN1-NEXT:    buffer_wbinvl1_vol
232 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
234 ; GCN2-LABEL: flat_atomic_xchg_i32_ret_scalar:
235 ; GCN2:       ; %bb.0:
236 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
238 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
239 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
240 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
241 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
242 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
243 ; GCN2-NEXT:    buffer_wbinvl1_vol
244 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
246 ; GCN3-LABEL: flat_atomic_xchg_i32_ret_scalar:
247 ; GCN3:       ; %bb.0:
248 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
249 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
250 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
251 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
252 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
253 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
254 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
255 ; GCN3-NEXT:    buffer_wbinvl1_vol
256 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
257   %result = atomicrmw xchg ptr %ptr, i32 %in seq_cst
258   ret i32 %result
261 define amdgpu_gfx i32 @flat_atomic_xchg_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
262 ; GCN1-LABEL: flat_atomic_xchg_i32_ret_offset_scalar:
263 ; GCN1:       ; %bb.0:
264 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
265 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
266 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
267 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
268 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
269 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
270 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
271 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
272 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
273 ; GCN1-NEXT:    buffer_wbinvl1_vol
274 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
276 ; GCN2-LABEL: flat_atomic_xchg_i32_ret_offset_scalar:
277 ; GCN2:       ; %bb.0:
278 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
279 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
280 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
281 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
282 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
283 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
284 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
285 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
286 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
287 ; GCN2-NEXT:    buffer_wbinvl1_vol
288 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
290 ; GCN3-LABEL: flat_atomic_xchg_i32_ret_offset_scalar:
291 ; GCN3:       ; %bb.0:
292 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
293 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
294 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
295 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
296 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
297 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 offset:16 glc
298 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
299 ; GCN3-NEXT:    buffer_wbinvl1_vol
300 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
301   %gep = getelementptr i32, ptr %out, i32 4
302   %result = atomicrmw xchg ptr %gep, i32 %in seq_cst
303   ret i32 %result
306 ; ---------------------------------------------------------------------
307 ; atomicrmw xchg f32
308 ; ---------------------------------------------------------------------
310 define void @flat_atomic_xchg_f32_noret(ptr %ptr, float %in) {
311 ; GCN1-LABEL: flat_atomic_xchg_f32_noret:
312 ; GCN1:       ; %bb.0:
313 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
314 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
315 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
316 ; GCN1-NEXT:    buffer_wbinvl1_vol
317 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
319 ; GCN2-LABEL: flat_atomic_xchg_f32_noret:
320 ; GCN2:       ; %bb.0:
321 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
322 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
323 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
324 ; GCN2-NEXT:    buffer_wbinvl1_vol
325 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
327 ; GCN3-LABEL: flat_atomic_xchg_f32_noret:
328 ; GCN3:       ; %bb.0:
329 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
330 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2
331 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
332 ; GCN3-NEXT:    buffer_wbinvl1_vol
333 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
334   %tmp0 = atomicrmw xchg ptr %ptr, float %in seq_cst
335   ret void
338 define void @flat_atomic_xchg_f32_noret_offset(ptr %out, float %in) {
339 ; GCN1-LABEL: flat_atomic_xchg_f32_noret_offset:
340 ; GCN1:       ; %bb.0:
341 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
342 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
343 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
344 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
345 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
346 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
347 ; GCN1-NEXT:    buffer_wbinvl1_vol
348 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
350 ; GCN2-LABEL: flat_atomic_xchg_f32_noret_offset:
351 ; GCN2:       ; %bb.0:
352 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
354 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
355 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
356 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
357 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
358 ; GCN2-NEXT:    buffer_wbinvl1_vol
359 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
361 ; GCN3-LABEL: flat_atomic_xchg_f32_noret_offset:
362 ; GCN3:       ; %bb.0:
363 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
364 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2 offset:16
365 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
366 ; GCN3-NEXT:    buffer_wbinvl1_vol
367 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
368   %gep = getelementptr float, ptr %out, i32 4
369   %tmp0 = atomicrmw xchg ptr %gep, float %in seq_cst
370   ret void
373 define float @flat_atomic_xchg_f32_ret(ptr %ptr, float %in) {
374 ; GCN1-LABEL: flat_atomic_xchg_f32_ret:
375 ; GCN1:       ; %bb.0:
376 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
377 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
378 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
379 ; GCN1-NEXT:    buffer_wbinvl1_vol
380 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
382 ; GCN2-LABEL: flat_atomic_xchg_f32_ret:
383 ; GCN2:       ; %bb.0:
384 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
385 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
386 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
387 ; GCN2-NEXT:    buffer_wbinvl1_vol
388 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
390 ; GCN3-LABEL: flat_atomic_xchg_f32_ret:
391 ; GCN3:       ; %bb.0:
392 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
393 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
394 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
395 ; GCN3-NEXT:    buffer_wbinvl1_vol
396 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
397   %result = atomicrmw xchg ptr %ptr, float %in seq_cst
398   ret float %result
401 define float @flat_atomic_xchg_f32_ret_offset(ptr %out, float %in) {
402 ; GCN1-LABEL: flat_atomic_xchg_f32_ret_offset:
403 ; GCN1:       ; %bb.0:
404 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
405 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
406 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
407 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
408 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
409 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
410 ; GCN1-NEXT:    buffer_wbinvl1_vol
411 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
413 ; GCN2-LABEL: flat_atomic_xchg_f32_ret_offset:
414 ; GCN2:       ; %bb.0:
415 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
416 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
417 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
418 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
419 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
420 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
421 ; GCN2-NEXT:    buffer_wbinvl1_vol
422 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
424 ; GCN3-LABEL: flat_atomic_xchg_f32_ret_offset:
425 ; GCN3:       ; %bb.0:
426 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
427 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 offset:16 glc
428 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
429 ; GCN3-NEXT:    buffer_wbinvl1_vol
430 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
431   %gep = getelementptr float, ptr %out, i32 4
432   %result = atomicrmw xchg ptr %gep, float %in seq_cst
433   ret float %result
436 define amdgpu_gfx void @flat_atomic_xchg_f32_noret_scalar(ptr inreg %ptr, float inreg %in) {
437 ; GCN1-LABEL: flat_atomic_xchg_f32_noret_scalar:
438 ; GCN1:       ; %bb.0:
439 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
440 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
441 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
442 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
443 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
444 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
445 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
446 ; GCN1-NEXT:    buffer_wbinvl1_vol
447 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
449 ; GCN2-LABEL: flat_atomic_xchg_f32_noret_scalar:
450 ; GCN2:       ; %bb.0:
451 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
452 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
453 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
454 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
455 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
456 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
457 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
458 ; GCN2-NEXT:    buffer_wbinvl1_vol
459 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
461 ; GCN3-LABEL: flat_atomic_xchg_f32_noret_scalar:
462 ; GCN3:       ; %bb.0:
463 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
464 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
465 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
466 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
467 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
468 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2
469 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
470 ; GCN3-NEXT:    buffer_wbinvl1_vol
471 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
472   %tmp0 = atomicrmw xchg ptr %ptr, float %in seq_cst
473   ret void
476 define amdgpu_gfx void @flat_atomic_xchg_f32_noret_offset_scalar(ptr inreg %out, float inreg %in) {
477 ; GCN1-LABEL: flat_atomic_xchg_f32_noret_offset_scalar:
478 ; GCN1:       ; %bb.0:
479 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
480 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
481 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
482 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
483 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
484 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
485 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
486 ; GCN1-NEXT:    flat_atomic_swap v[0:1], v2
487 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
488 ; GCN1-NEXT:    buffer_wbinvl1_vol
489 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
491 ; GCN2-LABEL: flat_atomic_xchg_f32_noret_offset_scalar:
492 ; GCN2:       ; %bb.0:
493 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
494 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
495 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
496 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
497 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
498 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
499 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
500 ; GCN2-NEXT:    flat_atomic_swap v[0:1], v2
501 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
502 ; GCN2-NEXT:    buffer_wbinvl1_vol
503 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
505 ; GCN3-LABEL: flat_atomic_xchg_f32_noret_offset_scalar:
506 ; GCN3:       ; %bb.0:
507 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
508 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
509 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
510 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
511 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
512 ; GCN3-NEXT:    flat_atomic_swap v[0:1], v2 offset:16
513 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
514 ; GCN3-NEXT:    buffer_wbinvl1_vol
515 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
516   %gep = getelementptr float, ptr %out, i32 4
517   %tmp0 = atomicrmw xchg ptr %gep, float %in seq_cst
518   ret void
521 define amdgpu_gfx float @flat_atomic_xchg_f32_ret_scalar(ptr inreg %ptr, float inreg %in) {
522 ; GCN1-LABEL: flat_atomic_xchg_f32_ret_scalar:
523 ; GCN1:       ; %bb.0:
524 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
525 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
526 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
527 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
528 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
529 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
530 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
531 ; GCN1-NEXT:    buffer_wbinvl1_vol
532 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
534 ; GCN2-LABEL: flat_atomic_xchg_f32_ret_scalar:
535 ; GCN2:       ; %bb.0:
536 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
537 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
538 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
539 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
540 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
541 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
542 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
543 ; GCN2-NEXT:    buffer_wbinvl1_vol
544 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
546 ; GCN3-LABEL: flat_atomic_xchg_f32_ret_scalar:
547 ; GCN3:       ; %bb.0:
548 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
549 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
550 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
551 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
552 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
553 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
554 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
555 ; GCN3-NEXT:    buffer_wbinvl1_vol
556 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
557   %result = atomicrmw xchg ptr %ptr, float %in seq_cst
558   ret float %result
561 define amdgpu_gfx float @flat_atomic_xchg_f32_ret_offset_scalar(ptr inreg %out, float inreg %in) {
562 ; GCN1-LABEL: flat_atomic_xchg_f32_ret_offset_scalar:
563 ; GCN1:       ; %bb.0:
564 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
565 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
566 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
567 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
568 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
569 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
570 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
571 ; GCN1-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
572 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
573 ; GCN1-NEXT:    buffer_wbinvl1_vol
574 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
576 ; GCN2-LABEL: flat_atomic_xchg_f32_ret_offset_scalar:
577 ; GCN2:       ; %bb.0:
578 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
579 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
580 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
581 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
582 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
583 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
584 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
585 ; GCN2-NEXT:    flat_atomic_swap v0, v[0:1], v2 glc
586 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
587 ; GCN2-NEXT:    buffer_wbinvl1_vol
588 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
590 ; GCN3-LABEL: flat_atomic_xchg_f32_ret_offset_scalar:
591 ; GCN3:       ; %bb.0:
592 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
593 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
594 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
595 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
596 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
597 ; GCN3-NEXT:    flat_atomic_swap v0, v[0:1], v2 offset:16 glc
598 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
599 ; GCN3-NEXT:    buffer_wbinvl1_vol
600 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
601   %gep = getelementptr float, ptr %out, i32 4
602   %result = atomicrmw xchg ptr %gep, float %in seq_cst
603   ret float %result
606 ; ---------------------------------------------------------------------
607 ; atomicrmw add
608 ; ---------------------------------------------------------------------
610 define void @flat_atomic_add_i32_noret(ptr %ptr, i32 %in) {
611 ; GCN1-LABEL: flat_atomic_add_i32_noret:
612 ; GCN1:       ; %bb.0:
613 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
614 ; GCN1-NEXT:    flat_atomic_add v[0:1], v2
615 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
616 ; GCN1-NEXT:    buffer_wbinvl1_vol
617 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
619 ; GCN2-LABEL: flat_atomic_add_i32_noret:
620 ; GCN2:       ; %bb.0:
621 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
622 ; GCN2-NEXT:    flat_atomic_add v[0:1], v2
623 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
624 ; GCN2-NEXT:    buffer_wbinvl1_vol
625 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
627 ; GCN3-LABEL: flat_atomic_add_i32_noret:
628 ; GCN3:       ; %bb.0:
629 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
630 ; GCN3-NEXT:    flat_atomic_add v[0:1], v2
631 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
632 ; GCN3-NEXT:    buffer_wbinvl1_vol
633 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
634   %tmp0 = atomicrmw add ptr %ptr, i32 %in seq_cst
635   ret void
638 define void @flat_atomic_add_i32_noret_offset(ptr %out, i32 %in) {
639 ; GCN1-LABEL: flat_atomic_add_i32_noret_offset:
640 ; GCN1:       ; %bb.0:
641 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
642 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
643 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
644 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
645 ; GCN1-NEXT:    flat_atomic_add v[0:1], v2
646 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
647 ; GCN1-NEXT:    buffer_wbinvl1_vol
648 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
650 ; GCN2-LABEL: flat_atomic_add_i32_noret_offset:
651 ; GCN2:       ; %bb.0:
652 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
653 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
654 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
655 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
656 ; GCN2-NEXT:    flat_atomic_add v[0:1], v2
657 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
658 ; GCN2-NEXT:    buffer_wbinvl1_vol
659 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
661 ; GCN3-LABEL: flat_atomic_add_i32_noret_offset:
662 ; GCN3:       ; %bb.0:
663 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
664 ; GCN3-NEXT:    flat_atomic_add v[0:1], v2 offset:16
665 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
666 ; GCN3-NEXT:    buffer_wbinvl1_vol
667 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
668   %gep = getelementptr i32, ptr %out, i32 4
669   %tmp0 = atomicrmw add ptr %gep, i32 %in seq_cst
670   ret void
673 define i32 @flat_atomic_add_i32_ret(ptr %ptr, i32 %in) {
674 ; GCN1-LABEL: flat_atomic_add_i32_ret:
675 ; GCN1:       ; %bb.0:
676 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
677 ; GCN1-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
678 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
679 ; GCN1-NEXT:    buffer_wbinvl1_vol
680 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
682 ; GCN2-LABEL: flat_atomic_add_i32_ret:
683 ; GCN2:       ; %bb.0:
684 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
685 ; GCN2-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
686 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
687 ; GCN2-NEXT:    buffer_wbinvl1_vol
688 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
690 ; GCN3-LABEL: flat_atomic_add_i32_ret:
691 ; GCN3:       ; %bb.0:
692 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
693 ; GCN3-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
694 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
695 ; GCN3-NEXT:    buffer_wbinvl1_vol
696 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
697   %result = atomicrmw add ptr %ptr, i32 %in seq_cst
698   ret i32 %result
701 define i32 @flat_atomic_add_i32_ret_offset(ptr %out, i32 %in) {
702 ; GCN1-LABEL: flat_atomic_add_i32_ret_offset:
703 ; GCN1:       ; %bb.0:
704 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
705 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
706 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
707 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
708 ; GCN1-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
709 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
710 ; GCN1-NEXT:    buffer_wbinvl1_vol
711 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
713 ; GCN2-LABEL: flat_atomic_add_i32_ret_offset:
714 ; GCN2:       ; %bb.0:
715 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
716 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
717 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
718 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
719 ; GCN2-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
720 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
721 ; GCN2-NEXT:    buffer_wbinvl1_vol
722 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
724 ; GCN3-LABEL: flat_atomic_add_i32_ret_offset:
725 ; GCN3:       ; %bb.0:
726 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
727 ; GCN3-NEXT:    flat_atomic_add v0, v[0:1], v2 offset:16 glc
728 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
729 ; GCN3-NEXT:    buffer_wbinvl1_vol
730 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
731   %gep = getelementptr i32, ptr %out, i32 4
732   %result = atomicrmw add ptr %gep, i32 %in seq_cst
733   ret i32 %result
736 define amdgpu_gfx void @flat_atomic_add_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
737 ; GCN1-LABEL: flat_atomic_add_i32_noret_scalar:
738 ; GCN1:       ; %bb.0:
739 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
740 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
741 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
742 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
743 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
744 ; GCN1-NEXT:    flat_atomic_add v[0:1], v2
745 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
746 ; GCN1-NEXT:    buffer_wbinvl1_vol
747 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
749 ; GCN2-LABEL: flat_atomic_add_i32_noret_scalar:
750 ; GCN2:       ; %bb.0:
751 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
752 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
753 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
754 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
755 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
756 ; GCN2-NEXT:    flat_atomic_add v[0:1], v2
757 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
758 ; GCN2-NEXT:    buffer_wbinvl1_vol
759 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
761 ; GCN3-LABEL: flat_atomic_add_i32_noret_scalar:
762 ; GCN3:       ; %bb.0:
763 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
764 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
765 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
766 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
767 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
768 ; GCN3-NEXT:    flat_atomic_add v[0:1], v2
769 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
770 ; GCN3-NEXT:    buffer_wbinvl1_vol
771 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
772   %tmp0 = atomicrmw add ptr %ptr, i32 %in seq_cst
773   ret void
776 define amdgpu_gfx void @flat_atomic_add_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
777 ; GCN1-LABEL: flat_atomic_add_i32_noret_offset_scalar:
778 ; GCN1:       ; %bb.0:
779 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
780 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
781 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
782 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
783 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
784 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
785 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
786 ; GCN1-NEXT:    flat_atomic_add v[0:1], v2
787 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
788 ; GCN1-NEXT:    buffer_wbinvl1_vol
789 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
791 ; GCN2-LABEL: flat_atomic_add_i32_noret_offset_scalar:
792 ; GCN2:       ; %bb.0:
793 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
794 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
795 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
796 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
797 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
798 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
799 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
800 ; GCN2-NEXT:    flat_atomic_add v[0:1], v2
801 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
802 ; GCN2-NEXT:    buffer_wbinvl1_vol
803 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
805 ; GCN3-LABEL: flat_atomic_add_i32_noret_offset_scalar:
806 ; GCN3:       ; %bb.0:
807 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
808 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
809 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
810 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
811 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
812 ; GCN3-NEXT:    flat_atomic_add v[0:1], v2 offset:16
813 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
814 ; GCN3-NEXT:    buffer_wbinvl1_vol
815 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
816   %gep = getelementptr i32, ptr %out, i32 4
817   %tmp0 = atomicrmw add ptr %gep, i32 %in seq_cst
818   ret void
821 define amdgpu_gfx i32 @flat_atomic_add_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
822 ; GCN1-LABEL: flat_atomic_add_i32_ret_scalar:
823 ; GCN1:       ; %bb.0:
824 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
825 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
826 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
827 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
828 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
829 ; GCN1-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
830 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
831 ; GCN1-NEXT:    buffer_wbinvl1_vol
832 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
834 ; GCN2-LABEL: flat_atomic_add_i32_ret_scalar:
835 ; GCN2:       ; %bb.0:
836 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
837 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
838 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
839 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
840 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
841 ; GCN2-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
842 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
843 ; GCN2-NEXT:    buffer_wbinvl1_vol
844 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
846 ; GCN3-LABEL: flat_atomic_add_i32_ret_scalar:
847 ; GCN3:       ; %bb.0:
848 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
849 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
850 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
851 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
852 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
853 ; GCN3-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
854 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
855 ; GCN3-NEXT:    buffer_wbinvl1_vol
856 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
857   %result = atomicrmw add ptr %ptr, i32 %in seq_cst
858   ret i32 %result
861 define amdgpu_gfx i32 @flat_atomic_add_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
862 ; GCN1-LABEL: flat_atomic_add_i32_ret_offset_scalar:
863 ; GCN1:       ; %bb.0:
864 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
865 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
866 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
867 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
868 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
869 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
870 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
871 ; GCN1-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
872 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
873 ; GCN1-NEXT:    buffer_wbinvl1_vol
874 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
876 ; GCN2-LABEL: flat_atomic_add_i32_ret_offset_scalar:
877 ; GCN2:       ; %bb.0:
878 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
879 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
880 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
881 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
882 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
883 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
884 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
885 ; GCN2-NEXT:    flat_atomic_add v0, v[0:1], v2 glc
886 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
887 ; GCN2-NEXT:    buffer_wbinvl1_vol
888 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
890 ; GCN3-LABEL: flat_atomic_add_i32_ret_offset_scalar:
891 ; GCN3:       ; %bb.0:
892 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
893 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
894 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
895 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
896 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
897 ; GCN3-NEXT:    flat_atomic_add v0, v[0:1], v2 offset:16 glc
898 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
899 ; GCN3-NEXT:    buffer_wbinvl1_vol
900 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
901   %gep = getelementptr i32, ptr %out, i32 4
902   %result = atomicrmw add ptr %gep, i32 %in seq_cst
903   ret i32 %result
906 ; ---------------------------------------------------------------------
907 ; atomicrmw sub
908 ; ---------------------------------------------------------------------
910 define void @flat_atomic_sub_i32_noret(ptr %ptr, i32 %in) {
911 ; GCN1-LABEL: flat_atomic_sub_i32_noret:
912 ; GCN1:       ; %bb.0:
913 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
914 ; GCN1-NEXT:    flat_atomic_sub v[0:1], v2
915 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
916 ; GCN1-NEXT:    buffer_wbinvl1_vol
917 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
919 ; GCN2-LABEL: flat_atomic_sub_i32_noret:
920 ; GCN2:       ; %bb.0:
921 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
922 ; GCN2-NEXT:    flat_atomic_sub v[0:1], v2
923 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
924 ; GCN2-NEXT:    buffer_wbinvl1_vol
925 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
927 ; GCN3-LABEL: flat_atomic_sub_i32_noret:
928 ; GCN3:       ; %bb.0:
929 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
930 ; GCN3-NEXT:    flat_atomic_sub v[0:1], v2
931 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
932 ; GCN3-NEXT:    buffer_wbinvl1_vol
933 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
934   %tmp0 = atomicrmw sub ptr %ptr, i32 %in seq_cst
935   ret void
938 define void @flat_atomic_sub_i32_noret_offset(ptr %out, i32 %in) {
939 ; GCN1-LABEL: flat_atomic_sub_i32_noret_offset:
940 ; GCN1:       ; %bb.0:
941 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
942 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
943 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
944 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
945 ; GCN1-NEXT:    flat_atomic_sub v[0:1], v2
946 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
947 ; GCN1-NEXT:    buffer_wbinvl1_vol
948 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
950 ; GCN2-LABEL: flat_atomic_sub_i32_noret_offset:
951 ; GCN2:       ; %bb.0:
952 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
953 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
954 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
955 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
956 ; GCN2-NEXT:    flat_atomic_sub v[0:1], v2
957 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
958 ; GCN2-NEXT:    buffer_wbinvl1_vol
959 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
961 ; GCN3-LABEL: flat_atomic_sub_i32_noret_offset:
962 ; GCN3:       ; %bb.0:
963 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
964 ; GCN3-NEXT:    flat_atomic_sub v[0:1], v2 offset:16
965 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
966 ; GCN3-NEXT:    buffer_wbinvl1_vol
967 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
968   %gep = getelementptr i32, ptr %out, i32 4
969   %tmp0 = atomicrmw sub ptr %gep, i32 %in seq_cst
970   ret void
973 define i32 @flat_atomic_sub_i32_ret(ptr %ptr, i32 %in) {
974 ; GCN1-LABEL: flat_atomic_sub_i32_ret:
975 ; GCN1:       ; %bb.0:
976 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
977 ; GCN1-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
978 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
979 ; GCN1-NEXT:    buffer_wbinvl1_vol
980 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
982 ; GCN2-LABEL: flat_atomic_sub_i32_ret:
983 ; GCN2:       ; %bb.0:
984 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
985 ; GCN2-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
986 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
987 ; GCN2-NEXT:    buffer_wbinvl1_vol
988 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
990 ; GCN3-LABEL: flat_atomic_sub_i32_ret:
991 ; GCN3:       ; %bb.0:
992 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
993 ; GCN3-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
994 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
995 ; GCN3-NEXT:    buffer_wbinvl1_vol
996 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
997   %result = atomicrmw sub ptr %ptr, i32 %in seq_cst
998   ret i32 %result
1001 define i32 @flat_atomic_sub_i32_ret_offset(ptr %out, i32 %in) {
1002 ; GCN1-LABEL: flat_atomic_sub_i32_ret_offset:
1003 ; GCN1:       ; %bb.0:
1004 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1005 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
1006 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1007 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1008 ; GCN1-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1009 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1010 ; GCN1-NEXT:    buffer_wbinvl1_vol
1011 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1013 ; GCN2-LABEL: flat_atomic_sub_i32_ret_offset:
1014 ; GCN2:       ; %bb.0:
1015 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1016 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
1017 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1018 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1019 ; GCN2-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1020 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1021 ; GCN2-NEXT:    buffer_wbinvl1_vol
1022 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1024 ; GCN3-LABEL: flat_atomic_sub_i32_ret_offset:
1025 ; GCN3:       ; %bb.0:
1026 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1027 ; GCN3-NEXT:    flat_atomic_sub v0, v[0:1], v2 offset:16 glc
1028 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1029 ; GCN3-NEXT:    buffer_wbinvl1_vol
1030 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1031   %gep = getelementptr i32, ptr %out, i32 4
1032   %result = atomicrmw sub ptr %gep, i32 %in seq_cst
1033   ret i32 %result
1036 define amdgpu_gfx void @flat_atomic_sub_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
1037 ; GCN1-LABEL: flat_atomic_sub_i32_noret_scalar:
1038 ; GCN1:       ; %bb.0:
1039 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1040 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1041 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1042 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1043 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1044 ; GCN1-NEXT:    flat_atomic_sub v[0:1], v2
1045 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1046 ; GCN1-NEXT:    buffer_wbinvl1_vol
1047 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1049 ; GCN2-LABEL: flat_atomic_sub_i32_noret_scalar:
1050 ; GCN2:       ; %bb.0:
1051 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1052 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
1053 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
1054 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1055 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1056 ; GCN2-NEXT:    flat_atomic_sub v[0:1], v2
1057 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1058 ; GCN2-NEXT:    buffer_wbinvl1_vol
1059 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1061 ; GCN3-LABEL: flat_atomic_sub_i32_noret_scalar:
1062 ; GCN3:       ; %bb.0:
1063 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1064 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1065 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1066 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1067 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1068 ; GCN3-NEXT:    flat_atomic_sub v[0:1], v2
1069 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1070 ; GCN3-NEXT:    buffer_wbinvl1_vol
1071 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1072   %tmp0 = atomicrmw sub ptr %ptr, i32 %in seq_cst
1073   ret void
1076 define amdgpu_gfx void @flat_atomic_sub_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
1077 ; GCN1-LABEL: flat_atomic_sub_i32_noret_offset_scalar:
1078 ; GCN1:       ; %bb.0:
1079 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1080 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
1081 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
1082 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
1083 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
1084 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1085 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1086 ; GCN1-NEXT:    flat_atomic_sub v[0:1], v2
1087 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1088 ; GCN1-NEXT:    buffer_wbinvl1_vol
1089 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1091 ; GCN2-LABEL: flat_atomic_sub_i32_noret_offset_scalar:
1092 ; GCN2:       ; %bb.0:
1093 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1094 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
1095 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
1096 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
1097 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
1098 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1099 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1100 ; GCN2-NEXT:    flat_atomic_sub v[0:1], v2
1101 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1102 ; GCN2-NEXT:    buffer_wbinvl1_vol
1103 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1105 ; GCN3-LABEL: flat_atomic_sub_i32_noret_offset_scalar:
1106 ; GCN3:       ; %bb.0:
1107 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1108 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1109 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1110 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1111 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1112 ; GCN3-NEXT:    flat_atomic_sub v[0:1], v2 offset:16
1113 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1114 ; GCN3-NEXT:    buffer_wbinvl1_vol
1115 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1116   %gep = getelementptr i32, ptr %out, i32 4
1117   %tmp0 = atomicrmw sub ptr %gep, i32 %in seq_cst
1118   ret void
1121 define amdgpu_gfx i32 @flat_atomic_sub_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
1122 ; GCN1-LABEL: flat_atomic_sub_i32_ret_scalar:
1123 ; GCN1:       ; %bb.0:
1124 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1125 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1126 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1127 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1128 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1129 ; GCN1-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1130 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1131 ; GCN1-NEXT:    buffer_wbinvl1_vol
1132 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1134 ; GCN2-LABEL: flat_atomic_sub_i32_ret_scalar:
1135 ; GCN2:       ; %bb.0:
1136 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1137 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
1138 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
1139 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1140 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1141 ; GCN2-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1142 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1143 ; GCN2-NEXT:    buffer_wbinvl1_vol
1144 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1146 ; GCN3-LABEL: flat_atomic_sub_i32_ret_scalar:
1147 ; GCN3:       ; %bb.0:
1148 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1149 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1150 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1151 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1152 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1153 ; GCN3-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1154 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1155 ; GCN3-NEXT:    buffer_wbinvl1_vol
1156 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1157   %result = atomicrmw sub ptr %ptr, i32 %in seq_cst
1158   ret i32 %result
1161 define amdgpu_gfx i32 @flat_atomic_sub_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
1162 ; GCN1-LABEL: flat_atomic_sub_i32_ret_offset_scalar:
1163 ; GCN1:       ; %bb.0:
1164 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1165 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
1166 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
1167 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
1168 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
1169 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1170 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1171 ; GCN1-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1172 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1173 ; GCN1-NEXT:    buffer_wbinvl1_vol
1174 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1176 ; GCN2-LABEL: flat_atomic_sub_i32_ret_offset_scalar:
1177 ; GCN2:       ; %bb.0:
1178 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1179 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
1180 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
1181 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
1182 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
1183 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1184 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1185 ; GCN2-NEXT:    flat_atomic_sub v0, v[0:1], v2 glc
1186 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1187 ; GCN2-NEXT:    buffer_wbinvl1_vol
1188 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1190 ; GCN3-LABEL: flat_atomic_sub_i32_ret_offset_scalar:
1191 ; GCN3:       ; %bb.0:
1192 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1193 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1194 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1195 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1196 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1197 ; GCN3-NEXT:    flat_atomic_sub v0, v[0:1], v2 offset:16 glc
1198 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1199 ; GCN3-NEXT:    buffer_wbinvl1_vol
1200 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1201   %gep = getelementptr i32, ptr %out, i32 4
1202   %result = atomicrmw sub ptr %gep, i32 %in seq_cst
1203   ret i32 %result
1206 ; ---------------------------------------------------------------------
1207 ; atomicrmw and
1208 ; ---------------------------------------------------------------------
1210 define void @flat_atomic_and_i32_noret(ptr %ptr, i32 %in) {
1211 ; GCN1-LABEL: flat_atomic_and_i32_noret:
1212 ; GCN1:       ; %bb.0:
1213 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1214 ; GCN1-NEXT:    flat_atomic_and v[0:1], v2
1215 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1216 ; GCN1-NEXT:    buffer_wbinvl1_vol
1217 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1219 ; GCN2-LABEL: flat_atomic_and_i32_noret:
1220 ; GCN2:       ; %bb.0:
1221 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1222 ; GCN2-NEXT:    flat_atomic_and v[0:1], v2
1223 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1224 ; GCN2-NEXT:    buffer_wbinvl1_vol
1225 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1227 ; GCN3-LABEL: flat_atomic_and_i32_noret:
1228 ; GCN3:       ; %bb.0:
1229 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1230 ; GCN3-NEXT:    flat_atomic_and v[0:1], v2
1231 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1232 ; GCN3-NEXT:    buffer_wbinvl1_vol
1233 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1234   %tmp0 = atomicrmw and ptr %ptr, i32 %in seq_cst
1235   ret void
1238 define void @flat_atomic_and_i32_noret_offset(ptr %out, i32 %in) {
1239 ; GCN1-LABEL: flat_atomic_and_i32_noret_offset:
1240 ; GCN1:       ; %bb.0:
1241 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1242 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
1243 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1244 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1245 ; GCN1-NEXT:    flat_atomic_and v[0:1], v2
1246 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1247 ; GCN1-NEXT:    buffer_wbinvl1_vol
1248 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1250 ; GCN2-LABEL: flat_atomic_and_i32_noret_offset:
1251 ; GCN2:       ; %bb.0:
1252 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1253 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
1254 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1255 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1256 ; GCN2-NEXT:    flat_atomic_and v[0:1], v2
1257 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1258 ; GCN2-NEXT:    buffer_wbinvl1_vol
1259 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1261 ; GCN3-LABEL: flat_atomic_and_i32_noret_offset:
1262 ; GCN3:       ; %bb.0:
1263 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1264 ; GCN3-NEXT:    flat_atomic_and v[0:1], v2 offset:16
1265 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1266 ; GCN3-NEXT:    buffer_wbinvl1_vol
1267 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1268   %gep = getelementptr i32, ptr %out, i32 4
1269   %tmp0 = atomicrmw and ptr %gep, i32 %in seq_cst
1270   ret void
1273 define i32 @flat_atomic_and_i32_ret(ptr %ptr, i32 %in) {
1274 ; GCN1-LABEL: flat_atomic_and_i32_ret:
1275 ; GCN1:       ; %bb.0:
1276 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1277 ; GCN1-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1278 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1279 ; GCN1-NEXT:    buffer_wbinvl1_vol
1280 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1282 ; GCN2-LABEL: flat_atomic_and_i32_ret:
1283 ; GCN2:       ; %bb.0:
1284 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1285 ; GCN2-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1286 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1287 ; GCN2-NEXT:    buffer_wbinvl1_vol
1288 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1290 ; GCN3-LABEL: flat_atomic_and_i32_ret:
1291 ; GCN3:       ; %bb.0:
1292 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1293 ; GCN3-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1294 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1295 ; GCN3-NEXT:    buffer_wbinvl1_vol
1296 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1297   %result = atomicrmw and ptr %ptr, i32 %in seq_cst
1298   ret i32 %result
1301 define i32 @flat_atomic_and_i32_ret_offset(ptr %out, i32 %in) {
1302 ; GCN1-LABEL: flat_atomic_and_i32_ret_offset:
1303 ; GCN1:       ; %bb.0:
1304 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1305 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
1306 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1307 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1308 ; GCN1-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1309 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1310 ; GCN1-NEXT:    buffer_wbinvl1_vol
1311 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1313 ; GCN2-LABEL: flat_atomic_and_i32_ret_offset:
1314 ; GCN2:       ; %bb.0:
1315 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1316 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
1317 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1318 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1319 ; GCN2-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1320 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1321 ; GCN2-NEXT:    buffer_wbinvl1_vol
1322 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1324 ; GCN3-LABEL: flat_atomic_and_i32_ret_offset:
1325 ; GCN3:       ; %bb.0:
1326 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1327 ; GCN3-NEXT:    flat_atomic_and v0, v[0:1], v2 offset:16 glc
1328 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1329 ; GCN3-NEXT:    buffer_wbinvl1_vol
1330 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1331   %gep = getelementptr i32, ptr %out, i32 4
1332   %result = atomicrmw and ptr %gep, i32 %in seq_cst
1333   ret i32 %result
1336 define amdgpu_gfx void @flat_atomic_and_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
1337 ; GCN1-LABEL: flat_atomic_and_i32_noret_scalar:
1338 ; GCN1:       ; %bb.0:
1339 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1340 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1341 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1342 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1343 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1344 ; GCN1-NEXT:    flat_atomic_and v[0:1], v2
1345 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1346 ; GCN1-NEXT:    buffer_wbinvl1_vol
1347 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1349 ; GCN2-LABEL: flat_atomic_and_i32_noret_scalar:
1350 ; GCN2:       ; %bb.0:
1351 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1352 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
1353 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
1354 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1355 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1356 ; GCN2-NEXT:    flat_atomic_and v[0:1], v2
1357 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1358 ; GCN2-NEXT:    buffer_wbinvl1_vol
1359 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1361 ; GCN3-LABEL: flat_atomic_and_i32_noret_scalar:
1362 ; GCN3:       ; %bb.0:
1363 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1364 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1365 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1366 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1367 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1368 ; GCN3-NEXT:    flat_atomic_and v[0:1], v2
1369 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1370 ; GCN3-NEXT:    buffer_wbinvl1_vol
1371 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1372   %tmp0 = atomicrmw and ptr %ptr, i32 %in seq_cst
1373   ret void
1376 define amdgpu_gfx void @flat_atomic_and_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
1377 ; GCN1-LABEL: flat_atomic_and_i32_noret_offset_scalar:
1378 ; GCN1:       ; %bb.0:
1379 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1380 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
1381 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
1382 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
1383 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
1384 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1385 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1386 ; GCN1-NEXT:    flat_atomic_and v[0:1], v2
1387 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1388 ; GCN1-NEXT:    buffer_wbinvl1_vol
1389 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1391 ; GCN2-LABEL: flat_atomic_and_i32_noret_offset_scalar:
1392 ; GCN2:       ; %bb.0:
1393 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1394 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
1395 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
1396 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
1397 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
1398 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1399 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1400 ; GCN2-NEXT:    flat_atomic_and v[0:1], v2
1401 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1402 ; GCN2-NEXT:    buffer_wbinvl1_vol
1403 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1405 ; GCN3-LABEL: flat_atomic_and_i32_noret_offset_scalar:
1406 ; GCN3:       ; %bb.0:
1407 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1408 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1409 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1410 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1411 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1412 ; GCN3-NEXT:    flat_atomic_and v[0:1], v2 offset:16
1413 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1414 ; GCN3-NEXT:    buffer_wbinvl1_vol
1415 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1416   %gep = getelementptr i32, ptr %out, i32 4
1417   %tmp0 = atomicrmw and ptr %gep, i32 %in seq_cst
1418   ret void
1421 define amdgpu_gfx i32 @flat_atomic_and_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
1422 ; GCN1-LABEL: flat_atomic_and_i32_ret_scalar:
1423 ; GCN1:       ; %bb.0:
1424 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1425 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1426 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1427 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1428 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1429 ; GCN1-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1430 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1431 ; GCN1-NEXT:    buffer_wbinvl1_vol
1432 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1434 ; GCN2-LABEL: flat_atomic_and_i32_ret_scalar:
1435 ; GCN2:       ; %bb.0:
1436 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1437 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
1438 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
1439 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1440 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1441 ; GCN2-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1442 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1443 ; GCN2-NEXT:    buffer_wbinvl1_vol
1444 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1446 ; GCN3-LABEL: flat_atomic_and_i32_ret_scalar:
1447 ; GCN3:       ; %bb.0:
1448 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1449 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1450 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1451 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1452 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1453 ; GCN3-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1454 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1455 ; GCN3-NEXT:    buffer_wbinvl1_vol
1456 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1457   %result = atomicrmw and ptr %ptr, i32 %in seq_cst
1458   ret i32 %result
1461 define amdgpu_gfx i32 @flat_atomic_and_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
1462 ; GCN1-LABEL: flat_atomic_and_i32_ret_offset_scalar:
1463 ; GCN1:       ; %bb.0:
1464 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1465 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
1466 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
1467 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
1468 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
1469 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
1470 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1471 ; GCN1-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1472 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1473 ; GCN1-NEXT:    buffer_wbinvl1_vol
1474 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1476 ; GCN2-LABEL: flat_atomic_and_i32_ret_offset_scalar:
1477 ; GCN2:       ; %bb.0:
1478 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1479 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
1480 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
1481 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
1482 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
1483 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
1484 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1485 ; GCN2-NEXT:    flat_atomic_and v0, v[0:1], v2 glc
1486 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1487 ; GCN2-NEXT:    buffer_wbinvl1_vol
1488 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1490 ; GCN3-LABEL: flat_atomic_and_i32_ret_offset_scalar:
1491 ; GCN3:       ; %bb.0:
1492 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1493 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1494 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1495 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
1496 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1497 ; GCN3-NEXT:    flat_atomic_and v0, v[0:1], v2 offset:16 glc
1498 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1499 ; GCN3-NEXT:    buffer_wbinvl1_vol
1500 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1501   %gep = getelementptr i32, ptr %out, i32 4
1502   %result = atomicrmw and ptr %gep, i32 %in seq_cst
1503   ret i32 %result
1506 ; ---------------------------------------------------------------------
1507 ; atomicrmw nand
1508 ; ---------------------------------------------------------------------
1510 define void @flat_atomic_nand_i32_noret(ptr %ptr, i32 %in) {
1511 ; GCN1-LABEL: flat_atomic_nand_i32_noret:
1512 ; GCN1:       ; %bb.0:
1513 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1514 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
1515 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
1516 ; GCN1-NEXT:  .LBB40_1: ; %atomicrmw.start
1517 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1518 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1519 ; GCN1-NEXT:    v_and_b32_e32 v3, v4, v2
1520 ; GCN1-NEXT:    v_not_b32_e32 v3, v3
1521 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1522 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1523 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1524 ; GCN1-NEXT:    buffer_wbinvl1_vol
1525 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1526 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1527 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
1528 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1529 ; GCN1-NEXT:    s_cbranch_execnz .LBB40_1
1530 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1531 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
1532 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1534 ; GCN2-LABEL: flat_atomic_nand_i32_noret:
1535 ; GCN2:       ; %bb.0:
1536 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1537 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
1538 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
1539 ; GCN2-NEXT:  .LBB40_1: ; %atomicrmw.start
1540 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1541 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1542 ; GCN2-NEXT:    v_and_b32_e32 v3, v4, v2
1543 ; GCN2-NEXT:    v_not_b32_e32 v3, v3
1544 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1545 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1546 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1547 ; GCN2-NEXT:    buffer_wbinvl1_vol
1548 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1549 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1550 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
1551 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1552 ; GCN2-NEXT:    s_cbranch_execnz .LBB40_1
1553 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1554 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
1555 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1557 ; GCN3-LABEL: flat_atomic_nand_i32_noret:
1558 ; GCN3:       ; %bb.0:
1559 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1560 ; GCN3-NEXT:    flat_load_dword v4, v[0:1]
1561 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
1562 ; GCN3-NEXT:  .LBB40_1: ; %atomicrmw.start
1563 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1564 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1565 ; GCN3-NEXT:    v_and_b32_e32 v3, v4, v2
1566 ; GCN3-NEXT:    v_not_b32_e32 v3, v3
1567 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1568 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1569 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1570 ; GCN3-NEXT:    buffer_wbinvl1_vol
1571 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1572 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1573 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
1574 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1575 ; GCN3-NEXT:    s_cbranch_execnz .LBB40_1
1576 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1577 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
1578 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1579   %tmp0 = atomicrmw nand ptr %ptr, i32 %in seq_cst
1580   ret void
1583 define void @flat_atomic_nand_i32_noret_offset(ptr %out, i32 %in) {
1584 ; GCN1-LABEL: flat_atomic_nand_i32_noret_offset:
1585 ; GCN1:       ; %bb.0:
1586 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1587 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
1588 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1589 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
1590 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
1591 ; GCN1-NEXT:  .LBB41_1: ; %atomicrmw.start
1592 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1593 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1594 ; GCN1-NEXT:    v_and_b32_e32 v3, v4, v2
1595 ; GCN1-NEXT:    v_not_b32_e32 v3, v3
1596 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1597 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1598 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1599 ; GCN1-NEXT:    buffer_wbinvl1_vol
1600 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1601 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1602 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
1603 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1604 ; GCN1-NEXT:    s_cbranch_execnz .LBB41_1
1605 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1606 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
1607 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1609 ; GCN2-LABEL: flat_atomic_nand_i32_noret_offset:
1610 ; GCN2:       ; %bb.0:
1611 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1612 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
1613 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1614 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
1615 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
1616 ; GCN2-NEXT:  .LBB41_1: ; %atomicrmw.start
1617 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1618 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1619 ; GCN2-NEXT:    v_and_b32_e32 v3, v4, v2
1620 ; GCN2-NEXT:    v_not_b32_e32 v3, v3
1621 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1622 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1623 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1624 ; GCN2-NEXT:    buffer_wbinvl1_vol
1625 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1626 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1627 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
1628 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1629 ; GCN2-NEXT:    s_cbranch_execnz .LBB41_1
1630 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1631 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
1632 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1634 ; GCN3-LABEL: flat_atomic_nand_i32_noret_offset:
1635 ; GCN3:       ; %bb.0:
1636 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1637 ; GCN3-NEXT:    flat_load_dword v4, v[0:1] offset:16
1638 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
1639 ; GCN3-NEXT:  .LBB41_1: ; %atomicrmw.start
1640 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1641 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1642 ; GCN3-NEXT:    v_and_b32_e32 v3, v4, v2
1643 ; GCN3-NEXT:    v_not_b32_e32 v3, v3
1644 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1645 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
1646 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1647 ; GCN3-NEXT:    buffer_wbinvl1_vol
1648 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1649 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1650 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
1651 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1652 ; GCN3-NEXT:    s_cbranch_execnz .LBB41_1
1653 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1654 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
1655 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1656   %gep = getelementptr i32, ptr %out, i32 4
1657   %tmp0 = atomicrmw nand ptr %gep, i32 %in seq_cst
1658   ret void
1661 define i32 @flat_atomic_nand_i32_ret(ptr %ptr, i32 %in) {
1662 ; GCN1-LABEL: flat_atomic_nand_i32_ret:
1663 ; GCN1:       ; %bb.0:
1664 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1665 ; GCN1-NEXT:    flat_load_dword v3, v[0:1]
1666 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
1667 ; GCN1-NEXT:  .LBB42_1: ; %atomicrmw.start
1668 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1669 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1670 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
1671 ; GCN1-NEXT:    v_and_b32_e32 v3, v4, v2
1672 ; GCN1-NEXT:    v_not_b32_e32 v3, v3
1673 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1674 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1675 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1676 ; GCN1-NEXT:    buffer_wbinvl1_vol
1677 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1678 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1679 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1680 ; GCN1-NEXT:    s_cbranch_execnz .LBB42_1
1681 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1682 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
1683 ; GCN1-NEXT:    v_mov_b32_e32 v0, v3
1684 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1686 ; GCN2-LABEL: flat_atomic_nand_i32_ret:
1687 ; GCN2:       ; %bb.0:
1688 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1689 ; GCN2-NEXT:    flat_load_dword v3, v[0:1]
1690 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
1691 ; GCN2-NEXT:  .LBB42_1: ; %atomicrmw.start
1692 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1693 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1694 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
1695 ; GCN2-NEXT:    v_and_b32_e32 v3, v4, v2
1696 ; GCN2-NEXT:    v_not_b32_e32 v3, v3
1697 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1698 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1699 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1700 ; GCN2-NEXT:    buffer_wbinvl1_vol
1701 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1702 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1703 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1704 ; GCN2-NEXT:    s_cbranch_execnz .LBB42_1
1705 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1706 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
1707 ; GCN2-NEXT:    v_mov_b32_e32 v0, v3
1708 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1710 ; GCN3-LABEL: flat_atomic_nand_i32_ret:
1711 ; GCN3:       ; %bb.0:
1712 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1713 ; GCN3-NEXT:    flat_load_dword v3, v[0:1]
1714 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
1715 ; GCN3-NEXT:  .LBB42_1: ; %atomicrmw.start
1716 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1717 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1718 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
1719 ; GCN3-NEXT:    v_and_b32_e32 v3, v4, v2
1720 ; GCN3-NEXT:    v_not_b32_e32 v3, v3
1721 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1722 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
1723 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1724 ; GCN3-NEXT:    buffer_wbinvl1_vol
1725 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1726 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1727 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1728 ; GCN3-NEXT:    s_cbranch_execnz .LBB42_1
1729 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1730 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
1731 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
1732 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1733   %result = atomicrmw nand ptr %ptr, i32 %in seq_cst
1734   ret i32 %result
1737 define i32 @flat_atomic_nand_i32_ret_offset(ptr %out, i32 %in) {
1738 ; GCN1-LABEL: flat_atomic_nand_i32_ret_offset:
1739 ; GCN1:       ; %bb.0:
1740 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1741 ; GCN1-NEXT:    v_add_i32_e32 v3, vcc, 16, v0
1742 ; GCN1-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
1743 ; GCN1-NEXT:    flat_load_dword v0, v[3:4]
1744 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
1745 ; GCN1-NEXT:  .LBB43_1: ; %atomicrmw.start
1746 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1747 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1748 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
1749 ; GCN1-NEXT:    v_and_b32_e32 v0, v1, v2
1750 ; GCN1-NEXT:    v_not_b32_e32 v0, v0
1751 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1752 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
1753 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1754 ; GCN1-NEXT:    buffer_wbinvl1_vol
1755 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1756 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1757 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1758 ; GCN1-NEXT:    s_cbranch_execnz .LBB43_1
1759 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1760 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
1761 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1763 ; GCN2-LABEL: flat_atomic_nand_i32_ret_offset:
1764 ; GCN2:       ; %bb.0:
1765 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1766 ; GCN2-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
1767 ; GCN2-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
1768 ; GCN2-NEXT:    flat_load_dword v0, v[3:4]
1769 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
1770 ; GCN2-NEXT:  .LBB43_1: ; %atomicrmw.start
1771 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1772 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1773 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
1774 ; GCN2-NEXT:    v_and_b32_e32 v0, v1, v2
1775 ; GCN2-NEXT:    v_not_b32_e32 v0, v0
1776 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1777 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
1778 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1779 ; GCN2-NEXT:    buffer_wbinvl1_vol
1780 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1781 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1782 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1783 ; GCN2-NEXT:    s_cbranch_execnz .LBB43_1
1784 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1785 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
1786 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1788 ; GCN3-LABEL: flat_atomic_nand_i32_ret_offset:
1789 ; GCN3:       ; %bb.0:
1790 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1791 ; GCN3-NEXT:    flat_load_dword v3, v[0:1] offset:16
1792 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
1793 ; GCN3-NEXT:  .LBB43_1: ; %atomicrmw.start
1794 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1795 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1796 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
1797 ; GCN3-NEXT:    v_and_b32_e32 v3, v4, v2
1798 ; GCN3-NEXT:    v_not_b32_e32 v3, v3
1799 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1800 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
1801 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1802 ; GCN3-NEXT:    buffer_wbinvl1_vol
1803 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
1804 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
1805 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1806 ; GCN3-NEXT:    s_cbranch_execnz .LBB43_1
1807 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1808 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
1809 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
1810 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1811   %gep = getelementptr i32, ptr %out, i32 4
1812   %result = atomicrmw nand ptr %gep, i32 %in seq_cst
1813   ret i32 %result
1816 define amdgpu_gfx void @flat_atomic_nand_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
1817 ; GCN1-LABEL: flat_atomic_nand_i32_noret_scalar:
1818 ; GCN1:       ; %bb.0:
1819 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1820 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1821 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1822 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
1823 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
1824 ; GCN1-NEXT:  .LBB44_1: ; %atomicrmw.start
1825 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1826 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1827 ; GCN1-NEXT:    v_and_b32_e32 v0, s6, v1
1828 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
1829 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
1830 ; GCN1-NEXT:    v_not_b32_e32 v0, v0
1831 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1832 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
1833 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1834 ; GCN1-NEXT:    buffer_wbinvl1_vol
1835 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1836 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
1837 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
1838 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
1839 ; GCN1-NEXT:    s_cbranch_execnz .LBB44_1
1840 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1841 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
1842 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1844 ; GCN2-LABEL: flat_atomic_nand_i32_noret_scalar:
1845 ; GCN2:       ; %bb.0:
1846 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1847 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
1848 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
1849 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
1850 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
1851 ; GCN2-NEXT:  .LBB44_1: ; %atomicrmw.start
1852 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1853 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1854 ; GCN2-NEXT:    v_and_b32_e32 v0, s6, v1
1855 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
1856 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
1857 ; GCN2-NEXT:    v_not_b32_e32 v0, v0
1858 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1859 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
1860 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1861 ; GCN2-NEXT:    buffer_wbinvl1_vol
1862 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1863 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
1864 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
1865 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
1866 ; GCN2-NEXT:    s_cbranch_execnz .LBB44_1
1867 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1868 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
1869 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1871 ; GCN3-LABEL: flat_atomic_nand_i32_noret_scalar:
1872 ; GCN3:       ; %bb.0:
1873 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1874 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1875 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1876 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
1877 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
1878 ; GCN3-NEXT:  .LBB44_1: ; %atomicrmw.start
1879 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1880 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1881 ; GCN3-NEXT:    v_and_b32_e32 v0, s6, v1
1882 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
1883 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
1884 ; GCN3-NEXT:    v_not_b32_e32 v0, v0
1885 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1886 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
1887 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1888 ; GCN3-NEXT:    buffer_wbinvl1_vol
1889 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1890 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
1891 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
1892 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
1893 ; GCN3-NEXT:    s_cbranch_execnz .LBB44_1
1894 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1895 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
1896 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1897   %tmp0 = atomicrmw nand ptr %ptr, i32 %in seq_cst
1898   ret void
1901 define amdgpu_gfx void @flat_atomic_nand_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
1902 ; GCN1-LABEL: flat_atomic_nand_i32_noret_offset_scalar:
1903 ; GCN1:       ; %bb.0:
1904 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1905 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
1906 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
1907 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
1908 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
1909 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
1910 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
1911 ; GCN1-NEXT:  .LBB45_1: ; %atomicrmw.start
1912 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
1913 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1914 ; GCN1-NEXT:    v_and_b32_e32 v0, s6, v1
1915 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
1916 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
1917 ; GCN1-NEXT:    v_not_b32_e32 v0, v0
1918 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1919 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
1920 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1921 ; GCN1-NEXT:    buffer_wbinvl1_vol
1922 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1923 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
1924 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
1925 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
1926 ; GCN1-NEXT:    s_cbranch_execnz .LBB45_1
1927 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
1928 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
1929 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
1931 ; GCN2-LABEL: flat_atomic_nand_i32_noret_offset_scalar:
1932 ; GCN2:       ; %bb.0:
1933 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1934 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
1935 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
1936 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
1937 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
1938 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
1939 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
1940 ; GCN2-NEXT:  .LBB45_1: ; %atomicrmw.start
1941 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
1942 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1943 ; GCN2-NEXT:    v_and_b32_e32 v0, s6, v1
1944 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
1945 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
1946 ; GCN2-NEXT:    v_not_b32_e32 v0, v0
1947 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1948 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
1949 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1950 ; GCN2-NEXT:    buffer_wbinvl1_vol
1951 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1952 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
1953 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
1954 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
1955 ; GCN2-NEXT:    s_cbranch_execnz .LBB45_1
1956 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
1957 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
1958 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
1960 ; GCN3-LABEL: flat_atomic_nand_i32_noret_offset_scalar:
1961 ; GCN3:       ; %bb.0:
1962 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1963 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
1964 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
1965 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
1966 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
1967 ; GCN3-NEXT:  .LBB45_1: ; %atomicrmw.start
1968 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
1969 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1970 ; GCN3-NEXT:    v_and_b32_e32 v0, s6, v1
1971 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
1972 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
1973 ; GCN3-NEXT:    v_not_b32_e32 v0, v0
1974 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1975 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
1976 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1977 ; GCN3-NEXT:    buffer_wbinvl1_vol
1978 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
1979 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
1980 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
1981 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
1982 ; GCN3-NEXT:    s_cbranch_execnz .LBB45_1
1983 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
1984 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
1985 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
1986   %gep = getelementptr i32, ptr %out, i32 4
1987   %tmp0 = atomicrmw nand ptr %gep, i32 %in seq_cst
1988   ret void
1991 define amdgpu_gfx i32 @flat_atomic_nand_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
1992 ; GCN1-LABEL: flat_atomic_nand_i32_ret_scalar:
1993 ; GCN1:       ; %bb.0:
1994 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1995 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
1996 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
1997 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
1998 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
1999 ; GCN1-NEXT:  .LBB46_1: ; %atomicrmw.start
2000 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2001 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2002 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
2003 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
2004 ; GCN1-NEXT:    v_and_b32_e32 v0, s6, v1
2005 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
2006 ; GCN1-NEXT:    v_not_b32_e32 v0, v0
2007 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2008 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
2009 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2010 ; GCN1-NEXT:    buffer_wbinvl1_vol
2011 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2012 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
2013 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
2014 ; GCN1-NEXT:    s_cbranch_execnz .LBB46_1
2015 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
2016 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
2017 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2019 ; GCN2-LABEL: flat_atomic_nand_i32_ret_scalar:
2020 ; GCN2:       ; %bb.0:
2021 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2022 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
2023 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
2024 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
2025 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
2026 ; GCN2-NEXT:  .LBB46_1: ; %atomicrmw.start
2027 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
2028 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2029 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
2030 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
2031 ; GCN2-NEXT:    v_and_b32_e32 v0, s6, v1
2032 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
2033 ; GCN2-NEXT:    v_not_b32_e32 v0, v0
2034 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2035 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
2036 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2037 ; GCN2-NEXT:    buffer_wbinvl1_vol
2038 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2039 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
2040 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
2041 ; GCN2-NEXT:    s_cbranch_execnz .LBB46_1
2042 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
2043 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
2044 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2046 ; GCN3-LABEL: flat_atomic_nand_i32_ret_scalar:
2047 ; GCN3:       ; %bb.0:
2048 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2049 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2050 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2051 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
2052 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
2053 ; GCN3-NEXT:  .LBB46_1: ; %atomicrmw.start
2054 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
2055 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2056 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
2057 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
2058 ; GCN3-NEXT:    v_and_b32_e32 v0, s6, v1
2059 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
2060 ; GCN3-NEXT:    v_not_b32_e32 v0, v0
2061 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2062 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
2063 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2064 ; GCN3-NEXT:    buffer_wbinvl1_vol
2065 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2066 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
2067 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
2068 ; GCN3-NEXT:    s_cbranch_execnz .LBB46_1
2069 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
2070 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
2071 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2072   %result = atomicrmw nand ptr %ptr, i32 %in seq_cst
2073   ret i32 %result
2076 define amdgpu_gfx i32 @flat_atomic_nand_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
2077 ; GCN1-LABEL: flat_atomic_nand_i32_ret_offset_scalar:
2078 ; GCN1:       ; %bb.0:
2079 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2080 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
2081 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
2082 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
2083 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
2084 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
2085 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
2086 ; GCN1-NEXT:  .LBB47_1: ; %atomicrmw.start
2087 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2088 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2089 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
2090 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
2091 ; GCN1-NEXT:    v_and_b32_e32 v0, s6, v1
2092 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
2093 ; GCN1-NEXT:    v_not_b32_e32 v0, v0
2094 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2095 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
2096 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2097 ; GCN1-NEXT:    buffer_wbinvl1_vol
2098 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2099 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
2100 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
2101 ; GCN1-NEXT:    s_cbranch_execnz .LBB47_1
2102 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
2103 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
2104 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2106 ; GCN2-LABEL: flat_atomic_nand_i32_ret_offset_scalar:
2107 ; GCN2:       ; %bb.0:
2108 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2109 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
2110 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
2111 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
2112 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
2113 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
2114 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
2115 ; GCN2-NEXT:  .LBB47_1: ; %atomicrmw.start
2116 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
2117 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2118 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
2119 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
2120 ; GCN2-NEXT:    v_and_b32_e32 v0, s6, v1
2121 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
2122 ; GCN2-NEXT:    v_not_b32_e32 v0, v0
2123 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2124 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
2125 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2126 ; GCN2-NEXT:    buffer_wbinvl1_vol
2127 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2128 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
2129 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
2130 ; GCN2-NEXT:    s_cbranch_execnz .LBB47_1
2131 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
2132 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
2133 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2135 ; GCN3-LABEL: flat_atomic_nand_i32_ret_offset_scalar:
2136 ; GCN3:       ; %bb.0:
2137 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2138 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2139 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2140 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
2141 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
2142 ; GCN3-NEXT:  .LBB47_1: ; %atomicrmw.start
2143 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
2144 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2145 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
2146 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
2147 ; GCN3-NEXT:    v_and_b32_e32 v0, s6, v1
2148 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
2149 ; GCN3-NEXT:    v_not_b32_e32 v0, v0
2150 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2151 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
2152 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2153 ; GCN3-NEXT:    buffer_wbinvl1_vol
2154 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
2155 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
2156 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
2157 ; GCN3-NEXT:    s_cbranch_execnz .LBB47_1
2158 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
2159 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
2160 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2161   %gep = getelementptr i32, ptr %out, i32 4
2162   %result = atomicrmw nand ptr %gep, i32 %in seq_cst
2163   ret i32 %result
2166 ; ---------------------------------------------------------------------
2167 ; atomicrmw or
2168 ; ---------------------------------------------------------------------
2170 define void @flat_atomic_or_i32_noret(ptr %ptr, i32 %in) {
2171 ; GCN1-LABEL: flat_atomic_or_i32_noret:
2172 ; GCN1:       ; %bb.0:
2173 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2174 ; GCN1-NEXT:    flat_atomic_or v[0:1], v2
2175 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2176 ; GCN1-NEXT:    buffer_wbinvl1_vol
2177 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2179 ; GCN2-LABEL: flat_atomic_or_i32_noret:
2180 ; GCN2:       ; %bb.0:
2181 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2182 ; GCN2-NEXT:    flat_atomic_or v[0:1], v2
2183 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2184 ; GCN2-NEXT:    buffer_wbinvl1_vol
2185 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2187 ; GCN3-LABEL: flat_atomic_or_i32_noret:
2188 ; GCN3:       ; %bb.0:
2189 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2190 ; GCN3-NEXT:    flat_atomic_or v[0:1], v2
2191 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2192 ; GCN3-NEXT:    buffer_wbinvl1_vol
2193 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2194   %tmp0 = atomicrmw or ptr %ptr, i32 %in seq_cst
2195   ret void
2198 define void @flat_atomic_or_i32_noret_offset(ptr %out, i32 %in) {
2199 ; GCN1-LABEL: flat_atomic_or_i32_noret_offset:
2200 ; GCN1:       ; %bb.0:
2201 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2202 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
2203 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2204 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2205 ; GCN1-NEXT:    flat_atomic_or v[0:1], v2
2206 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2207 ; GCN1-NEXT:    buffer_wbinvl1_vol
2208 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2210 ; GCN2-LABEL: flat_atomic_or_i32_noret_offset:
2211 ; GCN2:       ; %bb.0:
2212 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2213 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
2214 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2215 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2216 ; GCN2-NEXT:    flat_atomic_or v[0:1], v2
2217 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2218 ; GCN2-NEXT:    buffer_wbinvl1_vol
2219 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2221 ; GCN3-LABEL: flat_atomic_or_i32_noret_offset:
2222 ; GCN3:       ; %bb.0:
2223 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2224 ; GCN3-NEXT:    flat_atomic_or v[0:1], v2 offset:16
2225 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2226 ; GCN3-NEXT:    buffer_wbinvl1_vol
2227 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2228   %gep = getelementptr i32, ptr %out, i32 4
2229   %tmp0 = atomicrmw or ptr %gep, i32 %in seq_cst
2230   ret void
2233 define i32 @flat_atomic_or_i32_ret(ptr %ptr, i32 %in) {
2234 ; GCN1-LABEL: flat_atomic_or_i32_ret:
2235 ; GCN1:       ; %bb.0:
2236 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2237 ; GCN1-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2238 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2239 ; GCN1-NEXT:    buffer_wbinvl1_vol
2240 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2242 ; GCN2-LABEL: flat_atomic_or_i32_ret:
2243 ; GCN2:       ; %bb.0:
2244 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2245 ; GCN2-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2246 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2247 ; GCN2-NEXT:    buffer_wbinvl1_vol
2248 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2250 ; GCN3-LABEL: flat_atomic_or_i32_ret:
2251 ; GCN3:       ; %bb.0:
2252 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2253 ; GCN3-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2254 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2255 ; GCN3-NEXT:    buffer_wbinvl1_vol
2256 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2257   %result = atomicrmw or ptr %ptr, i32 %in seq_cst
2258   ret i32 %result
2261 define i32 @flat_atomic_or_i32_ret_offset(ptr %out, i32 %in) {
2262 ; GCN1-LABEL: flat_atomic_or_i32_ret_offset:
2263 ; GCN1:       ; %bb.0:
2264 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2265 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
2266 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2267 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2268 ; GCN1-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2269 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2270 ; GCN1-NEXT:    buffer_wbinvl1_vol
2271 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2273 ; GCN2-LABEL: flat_atomic_or_i32_ret_offset:
2274 ; GCN2:       ; %bb.0:
2275 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2276 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
2277 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2278 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2279 ; GCN2-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2280 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2281 ; GCN2-NEXT:    buffer_wbinvl1_vol
2282 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2284 ; GCN3-LABEL: flat_atomic_or_i32_ret_offset:
2285 ; GCN3:       ; %bb.0:
2286 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2287 ; GCN3-NEXT:    flat_atomic_or v0, v[0:1], v2 offset:16 glc
2288 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2289 ; GCN3-NEXT:    buffer_wbinvl1_vol
2290 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2291   %gep = getelementptr i32, ptr %out, i32 4
2292   %result = atomicrmw or ptr %gep, i32 %in seq_cst
2293   ret i32 %result
2296 define amdgpu_gfx void @flat_atomic_or_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
2297 ; GCN1-LABEL: flat_atomic_or_i32_noret_scalar:
2298 ; GCN1:       ; %bb.0:
2299 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2300 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
2301 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
2302 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2303 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2304 ; GCN1-NEXT:    flat_atomic_or v[0:1], v2
2305 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2306 ; GCN1-NEXT:    buffer_wbinvl1_vol
2307 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2309 ; GCN2-LABEL: flat_atomic_or_i32_noret_scalar:
2310 ; GCN2:       ; %bb.0:
2311 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2312 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
2313 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
2314 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2315 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2316 ; GCN2-NEXT:    flat_atomic_or v[0:1], v2
2317 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2318 ; GCN2-NEXT:    buffer_wbinvl1_vol
2319 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2321 ; GCN3-LABEL: flat_atomic_or_i32_noret_scalar:
2322 ; GCN3:       ; %bb.0:
2323 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2324 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2325 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2326 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2327 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2328 ; GCN3-NEXT:    flat_atomic_or v[0:1], v2
2329 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2330 ; GCN3-NEXT:    buffer_wbinvl1_vol
2331 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2332   %tmp0 = atomicrmw or ptr %ptr, i32 %in seq_cst
2333   ret void
2336 define amdgpu_gfx void @flat_atomic_or_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
2337 ; GCN1-LABEL: flat_atomic_or_i32_noret_offset_scalar:
2338 ; GCN1:       ; %bb.0:
2339 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2340 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
2341 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
2342 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
2343 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
2344 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2345 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2346 ; GCN1-NEXT:    flat_atomic_or v[0:1], v2
2347 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2348 ; GCN1-NEXT:    buffer_wbinvl1_vol
2349 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2351 ; GCN2-LABEL: flat_atomic_or_i32_noret_offset_scalar:
2352 ; GCN2:       ; %bb.0:
2353 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2354 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
2355 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
2356 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
2357 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
2358 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2359 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2360 ; GCN2-NEXT:    flat_atomic_or v[0:1], v2
2361 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2362 ; GCN2-NEXT:    buffer_wbinvl1_vol
2363 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2365 ; GCN3-LABEL: flat_atomic_or_i32_noret_offset_scalar:
2366 ; GCN3:       ; %bb.0:
2367 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2368 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2369 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2370 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2371 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2372 ; GCN3-NEXT:    flat_atomic_or v[0:1], v2 offset:16
2373 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2374 ; GCN3-NEXT:    buffer_wbinvl1_vol
2375 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2376   %gep = getelementptr i32, ptr %out, i32 4
2377   %tmp0 = atomicrmw or ptr %gep, i32 %in seq_cst
2378   ret void
2381 define amdgpu_gfx i32 @flat_atomic_or_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
2382 ; GCN1-LABEL: flat_atomic_or_i32_ret_scalar:
2383 ; GCN1:       ; %bb.0:
2384 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2385 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
2386 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
2387 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2388 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2389 ; GCN1-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2390 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2391 ; GCN1-NEXT:    buffer_wbinvl1_vol
2392 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2394 ; GCN2-LABEL: flat_atomic_or_i32_ret_scalar:
2395 ; GCN2:       ; %bb.0:
2396 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2397 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
2398 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
2399 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2400 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2401 ; GCN2-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2402 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2403 ; GCN2-NEXT:    buffer_wbinvl1_vol
2404 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2406 ; GCN3-LABEL: flat_atomic_or_i32_ret_scalar:
2407 ; GCN3:       ; %bb.0:
2408 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2409 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2410 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2411 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2412 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2413 ; GCN3-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2414 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2415 ; GCN3-NEXT:    buffer_wbinvl1_vol
2416 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2417   %result = atomicrmw or ptr %ptr, i32 %in seq_cst
2418   ret i32 %result
2421 define amdgpu_gfx i32 @flat_atomic_or_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
2422 ; GCN1-LABEL: flat_atomic_or_i32_ret_offset_scalar:
2423 ; GCN1:       ; %bb.0:
2424 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2425 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
2426 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
2427 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
2428 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
2429 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2430 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2431 ; GCN1-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2432 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2433 ; GCN1-NEXT:    buffer_wbinvl1_vol
2434 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2436 ; GCN2-LABEL: flat_atomic_or_i32_ret_offset_scalar:
2437 ; GCN2:       ; %bb.0:
2438 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2439 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
2440 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
2441 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
2442 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
2443 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2444 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2445 ; GCN2-NEXT:    flat_atomic_or v0, v[0:1], v2 glc
2446 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2447 ; GCN2-NEXT:    buffer_wbinvl1_vol
2448 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2450 ; GCN3-LABEL: flat_atomic_or_i32_ret_offset_scalar:
2451 ; GCN3:       ; %bb.0:
2452 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2453 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2454 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2455 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2456 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2457 ; GCN3-NEXT:    flat_atomic_or v0, v[0:1], v2 offset:16 glc
2458 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2459 ; GCN3-NEXT:    buffer_wbinvl1_vol
2460 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2461   %gep = getelementptr i32, ptr %out, i32 4
2462   %result = atomicrmw or ptr %gep, i32 %in seq_cst
2463   ret i32 %result
2466 ; ---------------------------------------------------------------------
2467 ; atomicrmw xor
2468 ; ---------------------------------------------------------------------
2470 define void @flat_atomic_xor_i32_noret(ptr %ptr, i32 %in) {
2471 ; GCN1-LABEL: flat_atomic_xor_i32_noret:
2472 ; GCN1:       ; %bb.0:
2473 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2474 ; GCN1-NEXT:    flat_atomic_xor v[0:1], v2
2475 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2476 ; GCN1-NEXT:    buffer_wbinvl1_vol
2477 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2479 ; GCN2-LABEL: flat_atomic_xor_i32_noret:
2480 ; GCN2:       ; %bb.0:
2481 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2482 ; GCN2-NEXT:    flat_atomic_xor v[0:1], v2
2483 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2484 ; GCN2-NEXT:    buffer_wbinvl1_vol
2485 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2487 ; GCN3-LABEL: flat_atomic_xor_i32_noret:
2488 ; GCN3:       ; %bb.0:
2489 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2490 ; GCN3-NEXT:    flat_atomic_xor v[0:1], v2
2491 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2492 ; GCN3-NEXT:    buffer_wbinvl1_vol
2493 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2494   %tmp0 = atomicrmw xor ptr %ptr, i32 %in seq_cst
2495   ret void
2498 define void @flat_atomic_xor_i32_noret_offset(ptr %out, i32 %in) {
2499 ; GCN1-LABEL: flat_atomic_xor_i32_noret_offset:
2500 ; GCN1:       ; %bb.0:
2501 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2502 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
2503 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2504 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2505 ; GCN1-NEXT:    flat_atomic_xor v[0:1], v2
2506 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2507 ; GCN1-NEXT:    buffer_wbinvl1_vol
2508 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2510 ; GCN2-LABEL: flat_atomic_xor_i32_noret_offset:
2511 ; GCN2:       ; %bb.0:
2512 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2513 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
2514 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2515 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2516 ; GCN2-NEXT:    flat_atomic_xor v[0:1], v2
2517 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2518 ; GCN2-NEXT:    buffer_wbinvl1_vol
2519 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2521 ; GCN3-LABEL: flat_atomic_xor_i32_noret_offset:
2522 ; GCN3:       ; %bb.0:
2523 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2524 ; GCN3-NEXT:    flat_atomic_xor v[0:1], v2 offset:16
2525 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2526 ; GCN3-NEXT:    buffer_wbinvl1_vol
2527 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2528   %gep = getelementptr i32, ptr %out, i32 4
2529   %tmp0 = atomicrmw xor ptr %gep, i32 %in seq_cst
2530   ret void
2533 define i32 @flat_atomic_xor_i32_ret(ptr %ptr, i32 %in) {
2534 ; GCN1-LABEL: flat_atomic_xor_i32_ret:
2535 ; GCN1:       ; %bb.0:
2536 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2537 ; GCN1-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2538 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2539 ; GCN1-NEXT:    buffer_wbinvl1_vol
2540 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2542 ; GCN2-LABEL: flat_atomic_xor_i32_ret:
2543 ; GCN2:       ; %bb.0:
2544 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2545 ; GCN2-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2546 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2547 ; GCN2-NEXT:    buffer_wbinvl1_vol
2548 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2550 ; GCN3-LABEL: flat_atomic_xor_i32_ret:
2551 ; GCN3:       ; %bb.0:
2552 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2553 ; GCN3-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2554 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2555 ; GCN3-NEXT:    buffer_wbinvl1_vol
2556 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2557   %result = atomicrmw xor ptr %ptr, i32 %in seq_cst
2558   ret i32 %result
2561 define i32 @flat_atomic_xor_i32_ret_offset(ptr %out, i32 %in) {
2562 ; GCN1-LABEL: flat_atomic_xor_i32_ret_offset:
2563 ; GCN1:       ; %bb.0:
2564 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2565 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
2566 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2567 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2568 ; GCN1-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2569 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2570 ; GCN1-NEXT:    buffer_wbinvl1_vol
2571 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2573 ; GCN2-LABEL: flat_atomic_xor_i32_ret_offset:
2574 ; GCN2:       ; %bb.0:
2575 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2576 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
2577 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2578 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2579 ; GCN2-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2580 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2581 ; GCN2-NEXT:    buffer_wbinvl1_vol
2582 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2584 ; GCN3-LABEL: flat_atomic_xor_i32_ret_offset:
2585 ; GCN3:       ; %bb.0:
2586 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2587 ; GCN3-NEXT:    flat_atomic_xor v0, v[0:1], v2 offset:16 glc
2588 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2589 ; GCN3-NEXT:    buffer_wbinvl1_vol
2590 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2591   %gep = getelementptr i32, ptr %out, i32 4
2592   %result = atomicrmw xor ptr %gep, i32 %in seq_cst
2593   ret i32 %result
2596 define amdgpu_gfx void @flat_atomic_xor_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
2597 ; GCN1-LABEL: flat_atomic_xor_i32_noret_scalar:
2598 ; GCN1:       ; %bb.0:
2599 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2600 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
2601 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
2602 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2603 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2604 ; GCN1-NEXT:    flat_atomic_xor v[0:1], v2
2605 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2606 ; GCN1-NEXT:    buffer_wbinvl1_vol
2607 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2609 ; GCN2-LABEL: flat_atomic_xor_i32_noret_scalar:
2610 ; GCN2:       ; %bb.0:
2611 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2612 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
2613 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
2614 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2615 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2616 ; GCN2-NEXT:    flat_atomic_xor v[0:1], v2
2617 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2618 ; GCN2-NEXT:    buffer_wbinvl1_vol
2619 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2621 ; GCN3-LABEL: flat_atomic_xor_i32_noret_scalar:
2622 ; GCN3:       ; %bb.0:
2623 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2624 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2625 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2626 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2627 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2628 ; GCN3-NEXT:    flat_atomic_xor v[0:1], v2
2629 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2630 ; GCN3-NEXT:    buffer_wbinvl1_vol
2631 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2632   %tmp0 = atomicrmw xor ptr %ptr, i32 %in seq_cst
2633   ret void
2636 define amdgpu_gfx void @flat_atomic_xor_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
2637 ; GCN1-LABEL: flat_atomic_xor_i32_noret_offset_scalar:
2638 ; GCN1:       ; %bb.0:
2639 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2640 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
2641 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
2642 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
2643 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
2644 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2645 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2646 ; GCN1-NEXT:    flat_atomic_xor v[0:1], v2
2647 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2648 ; GCN1-NEXT:    buffer_wbinvl1_vol
2649 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2651 ; GCN2-LABEL: flat_atomic_xor_i32_noret_offset_scalar:
2652 ; GCN2:       ; %bb.0:
2653 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2654 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
2655 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
2656 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
2657 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
2658 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2659 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2660 ; GCN2-NEXT:    flat_atomic_xor v[0:1], v2
2661 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2662 ; GCN2-NEXT:    buffer_wbinvl1_vol
2663 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2665 ; GCN3-LABEL: flat_atomic_xor_i32_noret_offset_scalar:
2666 ; GCN3:       ; %bb.0:
2667 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2668 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2669 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2670 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2671 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2672 ; GCN3-NEXT:    flat_atomic_xor v[0:1], v2 offset:16
2673 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2674 ; GCN3-NEXT:    buffer_wbinvl1_vol
2675 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2676   %gep = getelementptr i32, ptr %out, i32 4
2677   %tmp0 = atomicrmw xor ptr %gep, i32 %in seq_cst
2678   ret void
2681 define amdgpu_gfx i32 @flat_atomic_xor_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
2682 ; GCN1-LABEL: flat_atomic_xor_i32_ret_scalar:
2683 ; GCN1:       ; %bb.0:
2684 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2685 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
2686 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
2687 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2688 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2689 ; GCN1-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2690 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2691 ; GCN1-NEXT:    buffer_wbinvl1_vol
2692 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2694 ; GCN2-LABEL: flat_atomic_xor_i32_ret_scalar:
2695 ; GCN2:       ; %bb.0:
2696 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2697 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
2698 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
2699 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2700 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2701 ; GCN2-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2702 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2703 ; GCN2-NEXT:    buffer_wbinvl1_vol
2704 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2706 ; GCN3-LABEL: flat_atomic_xor_i32_ret_scalar:
2707 ; GCN3:       ; %bb.0:
2708 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2709 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2710 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2711 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2712 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2713 ; GCN3-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2714 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2715 ; GCN3-NEXT:    buffer_wbinvl1_vol
2716 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2717   %result = atomicrmw xor ptr %ptr, i32 %in seq_cst
2718   ret i32 %result
2721 define amdgpu_gfx i32 @flat_atomic_xor_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
2722 ; GCN1-LABEL: flat_atomic_xor_i32_ret_offset_scalar:
2723 ; GCN1:       ; %bb.0:
2724 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2725 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
2726 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
2727 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
2728 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
2729 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
2730 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2731 ; GCN1-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2732 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2733 ; GCN1-NEXT:    buffer_wbinvl1_vol
2734 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2736 ; GCN2-LABEL: flat_atomic_xor_i32_ret_offset_scalar:
2737 ; GCN2:       ; %bb.0:
2738 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2739 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
2740 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
2741 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
2742 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
2743 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
2744 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2745 ; GCN2-NEXT:    flat_atomic_xor v0, v[0:1], v2 glc
2746 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2747 ; GCN2-NEXT:    buffer_wbinvl1_vol
2748 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2750 ; GCN3-LABEL: flat_atomic_xor_i32_ret_offset_scalar:
2751 ; GCN3:       ; %bb.0:
2752 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2753 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
2754 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
2755 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
2756 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2757 ; GCN3-NEXT:    flat_atomic_xor v0, v[0:1], v2 offset:16 glc
2758 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2759 ; GCN3-NEXT:    buffer_wbinvl1_vol
2760 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2761   %gep = getelementptr i32, ptr %out, i32 4
2762   %result = atomicrmw xor ptr %gep, i32 %in seq_cst
2763   ret i32 %result
2766 ; ---------------------------------------------------------------------
2767 ; atomicrmw max
2768 ; ---------------------------------------------------------------------
2770 define void @flat_atomic_max_i32_noret(ptr %ptr, i32 %in) {
2771 ; GCN1-LABEL: flat_atomic_max_i32_noret:
2772 ; GCN1:       ; %bb.0:
2773 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2774 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
2775 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
2776 ; GCN1-NEXT:  .LBB64_1: ; %atomicrmw.start
2777 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2778 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2779 ; GCN1-NEXT:    v_max_i32_e32 v3, v4, v2
2780 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2781 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2782 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2783 ; GCN1-NEXT:    buffer_wbinvl1_vol
2784 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2785 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2786 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
2787 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2788 ; GCN1-NEXT:    s_cbranch_execnz .LBB64_1
2789 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
2790 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
2791 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2793 ; GCN2-LABEL: flat_atomic_max_i32_noret:
2794 ; GCN2:       ; %bb.0:
2795 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2796 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
2797 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
2798 ; GCN2-NEXT:  .LBB64_1: ; %atomicrmw.start
2799 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
2800 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2801 ; GCN2-NEXT:    v_max_i32_e32 v3, v4, v2
2802 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2803 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2804 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2805 ; GCN2-NEXT:    buffer_wbinvl1_vol
2806 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2807 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2808 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
2809 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2810 ; GCN2-NEXT:    s_cbranch_execnz .LBB64_1
2811 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
2812 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
2813 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2815 ; GCN3-LABEL: flat_atomic_max_i32_noret:
2816 ; GCN3:       ; %bb.0:
2817 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2818 ; GCN3-NEXT:    flat_load_dword v4, v[0:1]
2819 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
2820 ; GCN3-NEXT:  .LBB64_1: ; %atomicrmw.start
2821 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
2822 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2823 ; GCN3-NEXT:    v_max_i32_e32 v3, v4, v2
2824 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2825 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2826 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2827 ; GCN3-NEXT:    buffer_wbinvl1_vol
2828 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2829 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2830 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
2831 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2832 ; GCN3-NEXT:    s_cbranch_execnz .LBB64_1
2833 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
2834 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
2835 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2836   %tmp0 = atomicrmw max ptr %ptr, i32 %in seq_cst
2837   ret void
2840 define void @flat_atomic_max_i32_noret_offset(ptr %out, i32 %in) {
2841 ; GCN1-LABEL: flat_atomic_max_i32_noret_offset:
2842 ; GCN1:       ; %bb.0:
2843 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2844 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
2845 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2846 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
2847 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
2848 ; GCN1-NEXT:  .LBB65_1: ; %atomicrmw.start
2849 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2850 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2851 ; GCN1-NEXT:    v_max_i32_e32 v3, v4, v2
2852 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2853 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2854 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2855 ; GCN1-NEXT:    buffer_wbinvl1_vol
2856 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2857 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2858 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
2859 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2860 ; GCN1-NEXT:    s_cbranch_execnz .LBB65_1
2861 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
2862 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
2863 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2865 ; GCN2-LABEL: flat_atomic_max_i32_noret_offset:
2866 ; GCN2:       ; %bb.0:
2867 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2868 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
2869 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2870 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
2871 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
2872 ; GCN2-NEXT:  .LBB65_1: ; %atomicrmw.start
2873 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
2874 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2875 ; GCN2-NEXT:    v_max_i32_e32 v3, v4, v2
2876 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2877 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2878 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2879 ; GCN2-NEXT:    buffer_wbinvl1_vol
2880 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2881 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2882 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
2883 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2884 ; GCN2-NEXT:    s_cbranch_execnz .LBB65_1
2885 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
2886 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
2887 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2889 ; GCN3-LABEL: flat_atomic_max_i32_noret_offset:
2890 ; GCN3:       ; %bb.0:
2891 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2892 ; GCN3-NEXT:    flat_load_dword v4, v[0:1] offset:16
2893 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
2894 ; GCN3-NEXT:  .LBB65_1: ; %atomicrmw.start
2895 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
2896 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2897 ; GCN3-NEXT:    v_max_i32_e32 v3, v4, v2
2898 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2899 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
2900 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2901 ; GCN3-NEXT:    buffer_wbinvl1_vol
2902 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2903 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2904 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
2905 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2906 ; GCN3-NEXT:    s_cbranch_execnz .LBB65_1
2907 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
2908 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
2909 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2910   %gep = getelementptr i32, ptr %out, i32 4
2911   %tmp0 = atomicrmw max ptr %gep, i32 %in seq_cst
2912   ret void
2915 define i32 @flat_atomic_max_i32_ret(ptr %ptr, i32 %in) {
2916 ; GCN1-LABEL: flat_atomic_max_i32_ret:
2917 ; GCN1:       ; %bb.0:
2918 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2919 ; GCN1-NEXT:    flat_load_dword v3, v[0:1]
2920 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
2921 ; GCN1-NEXT:  .LBB66_1: ; %atomicrmw.start
2922 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2923 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2924 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
2925 ; GCN1-NEXT:    v_max_i32_e32 v3, v4, v2
2926 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2927 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2928 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2929 ; GCN1-NEXT:    buffer_wbinvl1_vol
2930 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2931 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2932 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2933 ; GCN1-NEXT:    s_cbranch_execnz .LBB66_1
2934 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
2935 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
2936 ; GCN1-NEXT:    v_mov_b32_e32 v0, v3
2937 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
2939 ; GCN2-LABEL: flat_atomic_max_i32_ret:
2940 ; GCN2:       ; %bb.0:
2941 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2942 ; GCN2-NEXT:    flat_load_dword v3, v[0:1]
2943 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
2944 ; GCN2-NEXT:  .LBB66_1: ; %atomicrmw.start
2945 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
2946 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2947 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
2948 ; GCN2-NEXT:    v_max_i32_e32 v3, v4, v2
2949 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2950 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2951 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2952 ; GCN2-NEXT:    buffer_wbinvl1_vol
2953 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2954 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2955 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2956 ; GCN2-NEXT:    s_cbranch_execnz .LBB66_1
2957 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
2958 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
2959 ; GCN2-NEXT:    v_mov_b32_e32 v0, v3
2960 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
2962 ; GCN3-LABEL: flat_atomic_max_i32_ret:
2963 ; GCN3:       ; %bb.0:
2964 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2965 ; GCN3-NEXT:    flat_load_dword v3, v[0:1]
2966 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
2967 ; GCN3-NEXT:  .LBB66_1: ; %atomicrmw.start
2968 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
2969 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2970 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
2971 ; GCN3-NEXT:    v_max_i32_e32 v3, v4, v2
2972 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2973 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
2974 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2975 ; GCN3-NEXT:    buffer_wbinvl1_vol
2976 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
2977 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
2978 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
2979 ; GCN3-NEXT:    s_cbranch_execnz .LBB66_1
2980 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
2981 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
2982 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
2983 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
2984   %result = atomicrmw max ptr %ptr, i32 %in seq_cst
2985   ret i32 %result
2988 define i32 @flat_atomic_max_i32_ret_offset(ptr %out, i32 %in) {
2989 ; GCN1-LABEL: flat_atomic_max_i32_ret_offset:
2990 ; GCN1:       ; %bb.0:
2991 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2992 ; GCN1-NEXT:    v_add_i32_e32 v3, vcc, 16, v0
2993 ; GCN1-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
2994 ; GCN1-NEXT:    flat_load_dword v0, v[3:4]
2995 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
2996 ; GCN1-NEXT:  .LBB67_1: ; %atomicrmw.start
2997 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
2998 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2999 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3000 ; GCN1-NEXT:    v_max_i32_e32 v0, v1, v2
3001 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3002 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
3003 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3004 ; GCN1-NEXT:    buffer_wbinvl1_vol
3005 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3006 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3007 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3008 ; GCN1-NEXT:    s_cbranch_execnz .LBB67_1
3009 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3010 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
3011 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3013 ; GCN2-LABEL: flat_atomic_max_i32_ret_offset:
3014 ; GCN2:       ; %bb.0:
3015 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3016 ; GCN2-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
3017 ; GCN2-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
3018 ; GCN2-NEXT:    flat_load_dword v0, v[3:4]
3019 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
3020 ; GCN2-NEXT:  .LBB67_1: ; %atomicrmw.start
3021 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3022 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3023 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3024 ; GCN2-NEXT:    v_max_i32_e32 v0, v1, v2
3025 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3026 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
3027 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3028 ; GCN2-NEXT:    buffer_wbinvl1_vol
3029 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3030 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3031 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3032 ; GCN2-NEXT:    s_cbranch_execnz .LBB67_1
3033 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3034 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
3035 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3037 ; GCN3-LABEL: flat_atomic_max_i32_ret_offset:
3038 ; GCN3:       ; %bb.0:
3039 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3040 ; GCN3-NEXT:    flat_load_dword v3, v[0:1] offset:16
3041 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3042 ; GCN3-NEXT:  .LBB67_1: ; %atomicrmw.start
3043 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3044 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3045 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
3046 ; GCN3-NEXT:    v_max_i32_e32 v3, v4, v2
3047 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3048 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
3049 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3050 ; GCN3-NEXT:    buffer_wbinvl1_vol
3051 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3052 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3053 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3054 ; GCN3-NEXT:    s_cbranch_execnz .LBB67_1
3055 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3056 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
3057 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
3058 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3059   %gep = getelementptr i32, ptr %out, i32 4
3060   %result = atomicrmw max ptr %gep, i32 %in seq_cst
3061   ret i32 %result
3064 define amdgpu_gfx void @flat_atomic_max_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
3065 ; GCN1-LABEL: flat_atomic_max_i32_noret_scalar:
3066 ; GCN1:       ; %bb.0:
3067 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3068 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
3069 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
3070 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
3071 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
3072 ; GCN1-NEXT:  .LBB68_1: ; %atomicrmw.start
3073 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3074 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
3075 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3076 ; GCN1-NEXT:    v_max_i32_e32 v0, s6, v1
3077 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
3078 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3079 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3080 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3081 ; GCN1-NEXT:    buffer_wbinvl1_vol
3082 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3083 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3084 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3085 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3086 ; GCN1-NEXT:    s_cbranch_execnz .LBB68_1
3087 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3088 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
3089 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3091 ; GCN2-LABEL: flat_atomic_max_i32_noret_scalar:
3092 ; GCN2:       ; %bb.0:
3093 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3094 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
3095 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
3096 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
3097 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
3098 ; GCN2-NEXT:  .LBB68_1: ; %atomicrmw.start
3099 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3100 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
3101 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3102 ; GCN2-NEXT:    v_max_i32_e32 v0, s6, v1
3103 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
3104 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3105 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3106 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3107 ; GCN2-NEXT:    buffer_wbinvl1_vol
3108 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3109 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3110 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3111 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3112 ; GCN2-NEXT:    s_cbranch_execnz .LBB68_1
3113 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3114 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
3115 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3117 ; GCN3-LABEL: flat_atomic_max_i32_noret_scalar:
3118 ; GCN3:       ; %bb.0:
3119 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3120 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
3121 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
3122 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
3123 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
3124 ; GCN3-NEXT:  .LBB68_1: ; %atomicrmw.start
3125 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3126 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
3127 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3128 ; GCN3-NEXT:    v_max_i32_e32 v0, s6, v1
3129 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
3130 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3131 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3132 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3133 ; GCN3-NEXT:    buffer_wbinvl1_vol
3134 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3135 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3136 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3137 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3138 ; GCN3-NEXT:    s_cbranch_execnz .LBB68_1
3139 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3140 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
3141 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3142   %tmp0 = atomicrmw max ptr %ptr, i32 %in seq_cst
3143   ret void
3146 define amdgpu_gfx void @flat_atomic_max_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
3147 ; GCN1-LABEL: flat_atomic_max_i32_noret_offset_scalar:
3148 ; GCN1:       ; %bb.0:
3149 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3150 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
3151 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
3152 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
3153 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
3154 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
3155 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
3156 ; GCN1-NEXT:  .LBB69_1: ; %atomicrmw.start
3157 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3158 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
3159 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3160 ; GCN1-NEXT:    v_max_i32_e32 v0, s6, v1
3161 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
3162 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3163 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3164 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3165 ; GCN1-NEXT:    buffer_wbinvl1_vol
3166 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3167 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
3168 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3169 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
3170 ; GCN1-NEXT:    s_cbranch_execnz .LBB69_1
3171 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3172 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
3173 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3175 ; GCN2-LABEL: flat_atomic_max_i32_noret_offset_scalar:
3176 ; GCN2:       ; %bb.0:
3177 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3178 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
3179 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
3180 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
3181 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
3182 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
3183 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
3184 ; GCN2-NEXT:  .LBB69_1: ; %atomicrmw.start
3185 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3186 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
3187 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3188 ; GCN2-NEXT:    v_max_i32_e32 v0, s6, v1
3189 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
3190 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3191 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3192 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3193 ; GCN2-NEXT:    buffer_wbinvl1_vol
3194 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3195 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
3196 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3197 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
3198 ; GCN2-NEXT:    s_cbranch_execnz .LBB69_1
3199 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3200 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
3201 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3203 ; GCN3-LABEL: flat_atomic_max_i32_noret_offset_scalar:
3204 ; GCN3:       ; %bb.0:
3205 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3206 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
3207 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
3208 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
3209 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
3210 ; GCN3-NEXT:  .LBB69_1: ; %atomicrmw.start
3211 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3212 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
3213 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3214 ; GCN3-NEXT:    v_max_i32_e32 v0, s6, v1
3215 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
3216 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3217 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
3218 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3219 ; GCN3-NEXT:    buffer_wbinvl1_vol
3220 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3221 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3222 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3223 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3224 ; GCN3-NEXT:    s_cbranch_execnz .LBB69_1
3225 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3226 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
3227 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3228   %gep = getelementptr i32, ptr %out, i32 4
3229   %tmp0 = atomicrmw max ptr %gep, i32 %in seq_cst
3230   ret void
3233 define amdgpu_gfx i32 @flat_atomic_max_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
3234 ; GCN1-LABEL: flat_atomic_max_i32_ret_scalar:
3235 ; GCN1:       ; %bb.0:
3236 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3237 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
3238 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
3239 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
3240 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
3241 ; GCN1-NEXT:  .LBB70_1: ; %atomicrmw.start
3242 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3243 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3244 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3245 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
3246 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
3247 ; GCN1-NEXT:    v_max_i32_e32 v0, s6, v1
3248 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3249 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3250 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3251 ; GCN1-NEXT:    buffer_wbinvl1_vol
3252 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3253 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3254 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3255 ; GCN1-NEXT:    s_cbranch_execnz .LBB70_1
3256 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3257 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
3258 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3260 ; GCN2-LABEL: flat_atomic_max_i32_ret_scalar:
3261 ; GCN2:       ; %bb.0:
3262 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3263 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
3264 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
3265 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
3266 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
3267 ; GCN2-NEXT:  .LBB70_1: ; %atomicrmw.start
3268 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3269 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3270 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3271 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
3272 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
3273 ; GCN2-NEXT:    v_max_i32_e32 v0, s6, v1
3274 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3275 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3276 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3277 ; GCN2-NEXT:    buffer_wbinvl1_vol
3278 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3279 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3280 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3281 ; GCN2-NEXT:    s_cbranch_execnz .LBB70_1
3282 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3283 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
3284 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3286 ; GCN3-LABEL: flat_atomic_max_i32_ret_scalar:
3287 ; GCN3:       ; %bb.0:
3288 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3289 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
3290 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
3291 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
3292 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
3293 ; GCN3-NEXT:  .LBB70_1: ; %atomicrmw.start
3294 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3295 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3296 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3297 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
3298 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
3299 ; GCN3-NEXT:    v_max_i32_e32 v0, s6, v1
3300 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3301 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3302 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3303 ; GCN3-NEXT:    buffer_wbinvl1_vol
3304 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3305 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3306 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3307 ; GCN3-NEXT:    s_cbranch_execnz .LBB70_1
3308 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3309 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
3310 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3311   %result = atomicrmw max ptr %ptr, i32 %in seq_cst
3312   ret i32 %result
3315 define amdgpu_gfx i32 @flat_atomic_max_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
3316 ; GCN1-LABEL: flat_atomic_max_i32_ret_offset_scalar:
3317 ; GCN1:       ; %bb.0:
3318 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3319 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
3320 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
3321 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
3322 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
3323 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
3324 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
3325 ; GCN1-NEXT:  .LBB71_1: ; %atomicrmw.start
3326 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3327 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3328 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3329 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
3330 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
3331 ; GCN1-NEXT:    v_max_i32_e32 v0, s6, v1
3332 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3333 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3334 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3335 ; GCN1-NEXT:    buffer_wbinvl1_vol
3336 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3337 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
3338 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
3339 ; GCN1-NEXT:    s_cbranch_execnz .LBB71_1
3340 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3341 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
3342 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3344 ; GCN2-LABEL: flat_atomic_max_i32_ret_offset_scalar:
3345 ; GCN2:       ; %bb.0:
3346 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3347 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
3348 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
3349 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
3350 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
3351 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
3352 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
3353 ; GCN2-NEXT:  .LBB71_1: ; %atomicrmw.start
3354 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3355 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3356 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3357 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
3358 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
3359 ; GCN2-NEXT:    v_max_i32_e32 v0, s6, v1
3360 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3361 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3362 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3363 ; GCN2-NEXT:    buffer_wbinvl1_vol
3364 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3365 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
3366 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
3367 ; GCN2-NEXT:    s_cbranch_execnz .LBB71_1
3368 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3369 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
3370 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3372 ; GCN3-LABEL: flat_atomic_max_i32_ret_offset_scalar:
3373 ; GCN3:       ; %bb.0:
3374 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3375 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
3376 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
3377 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
3378 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
3379 ; GCN3-NEXT:  .LBB71_1: ; %atomicrmw.start
3380 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3381 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3382 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3383 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
3384 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
3385 ; GCN3-NEXT:    v_max_i32_e32 v0, s6, v1
3386 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3387 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
3388 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3389 ; GCN3-NEXT:    buffer_wbinvl1_vol
3390 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3391 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
3392 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
3393 ; GCN3-NEXT:    s_cbranch_execnz .LBB71_1
3394 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3395 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
3396 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3397   %gep = getelementptr i32, ptr %out, i32 4
3398   %result = atomicrmw max ptr %gep, i32 %in seq_cst
3399   ret i32 %result
3402 define amdgpu_kernel void @atomic_max_i32_addr64_offset(ptr %out, i32 %in, i32 %index) {
3403 ; GCN1-LABEL: atomic_max_i32_addr64_offset:
3404 ; GCN1:       ; %bb.0: ; %entry
3405 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3406 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
3407 ; GCN1-NEXT:    s_ashr_i32 s5, s3, 31
3408 ; GCN1-NEXT:    s_mov_b32 s4, s3
3409 ; GCN1-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3410 ; GCN1-NEXT:    s_add_u32 s0, s0, s4
3411 ; GCN1-NEXT:    s_addc_u32 s1, s1, s5
3412 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
3413 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
3414 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
3415 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
3416 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
3417 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
3418 ; GCN1-NEXT:  .LBB72_1: ; %atomicrmw.start
3419 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3420 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
3421 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3422 ; GCN1-NEXT:    v_max_i32_e32 v0, s2, v1
3423 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
3424 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3425 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3426 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3427 ; GCN1-NEXT:    buffer_wbinvl1_vol
3428 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3429 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3430 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3431 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3432 ; GCN1-NEXT:    s_cbranch_execnz .LBB72_1
3433 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3434 ; GCN1-NEXT:    s_endpgm
3436 ; GCN2-LABEL: atomic_max_i32_addr64_offset:
3437 ; GCN2:       ; %bb.0: ; %entry
3438 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3439 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
3440 ; GCN2-NEXT:    s_ashr_i32 s5, s3, 31
3441 ; GCN2-NEXT:    s_mov_b32 s4, s3
3442 ; GCN2-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3443 ; GCN2-NEXT:    s_add_u32 s0, s0, s4
3444 ; GCN2-NEXT:    s_addc_u32 s1, s1, s5
3445 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
3446 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
3447 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
3448 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
3449 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
3450 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
3451 ; GCN2-NEXT:  .LBB72_1: ; %atomicrmw.start
3452 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3453 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
3454 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3455 ; GCN2-NEXT:    v_max_i32_e32 v0, s2, v1
3456 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
3457 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3458 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3459 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3460 ; GCN2-NEXT:    buffer_wbinvl1_vol
3461 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3462 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3463 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3464 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3465 ; GCN2-NEXT:    s_cbranch_execnz .LBB72_1
3466 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3467 ; GCN2-NEXT:    s_endpgm
3469 ; GCN3-LABEL: atomic_max_i32_addr64_offset:
3470 ; GCN3:       ; %bb.0: ; %entry
3471 ; GCN3-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3472 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
3473 ; GCN3-NEXT:    s_ashr_i32 s5, s3, 31
3474 ; GCN3-NEXT:    s_mov_b32 s4, s3
3475 ; GCN3-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3476 ; GCN3-NEXT:    s_add_u32 s0, s0, s4
3477 ; GCN3-NEXT:    s_addc_u32 s1, s1, s5
3478 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
3479 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
3480 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
3481 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3482 ; GCN3-NEXT:  .LBB72_1: ; %atomicrmw.start
3483 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3484 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
3485 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3486 ; GCN3-NEXT:    v_max_i32_e32 v0, s2, v1
3487 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
3488 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3489 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
3490 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3491 ; GCN3-NEXT:    buffer_wbinvl1_vol
3492 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3493 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3494 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3495 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3496 ; GCN3-NEXT:    s_cbranch_execnz .LBB72_1
3497 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3498 ; GCN3-NEXT:    s_endpgm
3499 entry:
3500   %ptr = getelementptr i32, ptr %out, i32 %index
3501   %gep = getelementptr i32, ptr %ptr, i32 4
3502   %tmp0 = atomicrmw max ptr %gep, i32 %in seq_cst
3503   ret void
3506 define amdgpu_kernel void @atomic_max_i32_ret_addr64_offset(ptr %out, ptr %out2, i32 %in, i32 %index) {
3507 ; GCN1-LABEL: atomic_max_i32_ret_addr64_offset:
3508 ; GCN1:       ; %bb.0: ; %entry
3509 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3510 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3511 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
3512 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
3513 ; GCN1-NEXT:    s_mov_b32 s6, s5
3514 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
3515 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
3516 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
3517 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
3518 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
3519 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
3520 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
3521 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
3522 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
3523 ; GCN1-NEXT:  .LBB73_1: ; %atomicrmw.start
3524 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3525 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3526 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3527 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
3528 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
3529 ; GCN1-NEXT:    v_max_i32_e32 v0, s4, v1
3530 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3531 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3532 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3533 ; GCN1-NEXT:    buffer_wbinvl1_vol
3534 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3535 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
3536 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
3537 ; GCN1-NEXT:    s_cbranch_execnz .LBB73_1
3538 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3539 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
3540 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
3541 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
3542 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
3543 ; GCN1-NEXT:    s_endpgm
3545 ; GCN2-LABEL: atomic_max_i32_ret_addr64_offset:
3546 ; GCN2:       ; %bb.0: ; %entry
3547 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
3548 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3549 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
3550 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
3551 ; GCN2-NEXT:    s_mov_b32 s6, s5
3552 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
3553 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
3554 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
3555 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
3556 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
3557 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
3558 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
3559 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
3560 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
3561 ; GCN2-NEXT:  .LBB73_1: ; %atomicrmw.start
3562 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3563 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3564 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3565 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
3566 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
3567 ; GCN2-NEXT:    v_max_i32_e32 v0, s4, v1
3568 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3569 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3570 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3571 ; GCN2-NEXT:    buffer_wbinvl1_vol
3572 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3573 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
3574 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
3575 ; GCN2-NEXT:    s_cbranch_execnz .LBB73_1
3576 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3577 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
3578 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
3579 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
3580 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
3581 ; GCN2-NEXT:    s_endpgm
3583 ; GCN3-LABEL: atomic_max_i32_ret_addr64_offset:
3584 ; GCN3:       ; %bb.0: ; %entry
3585 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3586 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3587 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
3588 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
3589 ; GCN3-NEXT:    s_mov_b32 s0, s3
3590 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
3591 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
3592 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
3593 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
3594 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
3595 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
3596 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3597 ; GCN3-NEXT:  .LBB73_1: ; %atomicrmw.start
3598 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3599 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3600 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3601 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
3602 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
3603 ; GCN3-NEXT:    v_max_i32_e32 v0, s2, v1
3604 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3605 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
3606 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3607 ; GCN3-NEXT:    buffer_wbinvl1_vol
3608 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3609 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3610 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3611 ; GCN3-NEXT:    s_cbranch_execnz .LBB73_1
3612 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3613 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
3614 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
3615 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
3616 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
3617 ; GCN3-NEXT:    s_endpgm
3618 entry:
3619   %ptr = getelementptr i32, ptr %out, i32 %index
3620   %gep = getelementptr i32, ptr %ptr, i32 4
3621   %tmp0 = atomicrmw max ptr %gep, i32 %in seq_cst
3622   store i32 %tmp0, ptr %out2
3623   ret void
3626 define amdgpu_kernel void @atomic_max_i32_addr64(ptr %out, i32 %in, i32 %index) {
3627 ; GCN1-LABEL: atomic_max_i32_addr64:
3628 ; GCN1:       ; %bb.0: ; %entry
3629 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3630 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
3631 ; GCN1-NEXT:    s_ashr_i32 s5, s3, 31
3632 ; GCN1-NEXT:    s_mov_b32 s4, s3
3633 ; GCN1-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3634 ; GCN1-NEXT:    s_add_u32 s0, s0, s4
3635 ; GCN1-NEXT:    s_addc_u32 s1, s1, s5
3636 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
3637 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
3638 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
3639 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
3640 ; GCN1-NEXT:  .LBB74_1: ; %atomicrmw.start
3641 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3642 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
3643 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3644 ; GCN1-NEXT:    v_max_i32_e32 v0, s2, v1
3645 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
3646 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3647 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3648 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3649 ; GCN1-NEXT:    buffer_wbinvl1_vol
3650 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3651 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3652 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3653 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3654 ; GCN1-NEXT:    s_cbranch_execnz .LBB74_1
3655 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3656 ; GCN1-NEXT:    s_endpgm
3658 ; GCN2-LABEL: atomic_max_i32_addr64:
3659 ; GCN2:       ; %bb.0: ; %entry
3660 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3661 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
3662 ; GCN2-NEXT:    s_ashr_i32 s5, s3, 31
3663 ; GCN2-NEXT:    s_mov_b32 s4, s3
3664 ; GCN2-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3665 ; GCN2-NEXT:    s_add_u32 s0, s0, s4
3666 ; GCN2-NEXT:    s_addc_u32 s1, s1, s5
3667 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
3668 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
3669 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
3670 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
3671 ; GCN2-NEXT:  .LBB74_1: ; %atomicrmw.start
3672 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3673 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
3674 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3675 ; GCN2-NEXT:    v_max_i32_e32 v0, s2, v1
3676 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
3677 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3678 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3679 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3680 ; GCN2-NEXT:    buffer_wbinvl1_vol
3681 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3682 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3683 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3684 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3685 ; GCN2-NEXT:    s_cbranch_execnz .LBB74_1
3686 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3687 ; GCN2-NEXT:    s_endpgm
3689 ; GCN3-LABEL: atomic_max_i32_addr64:
3690 ; GCN3:       ; %bb.0: ; %entry
3691 ; GCN3-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3692 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
3693 ; GCN3-NEXT:    s_ashr_i32 s5, s3, 31
3694 ; GCN3-NEXT:    s_mov_b32 s4, s3
3695 ; GCN3-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
3696 ; GCN3-NEXT:    s_add_u32 s0, s0, s4
3697 ; GCN3-NEXT:    s_addc_u32 s1, s1, s5
3698 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
3699 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
3700 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
3701 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3702 ; GCN3-NEXT:  .LBB74_1: ; %atomicrmw.start
3703 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3704 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
3705 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3706 ; GCN3-NEXT:    v_max_i32_e32 v0, s2, v1
3707 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
3708 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3709 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3710 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3711 ; GCN3-NEXT:    buffer_wbinvl1_vol
3712 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3713 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3714 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3715 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3716 ; GCN3-NEXT:    s_cbranch_execnz .LBB74_1
3717 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3718 ; GCN3-NEXT:    s_endpgm
3719 entry:
3720   %ptr = getelementptr i32, ptr %out, i32 %index
3721   %tmp0 = atomicrmw max ptr %ptr, i32 %in seq_cst
3722   ret void
3725 define amdgpu_kernel void @atomic_max_i32_ret_addr64(ptr %out, ptr %out2, i32 %in, i32 %index) {
3726 ; GCN1-LABEL: atomic_max_i32_ret_addr64:
3727 ; GCN1:       ; %bb.0: ; %entry
3728 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
3729 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
3730 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
3731 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
3732 ; GCN1-NEXT:    s_mov_b32 s6, s5
3733 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
3734 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
3735 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
3736 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
3737 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
3738 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
3739 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
3740 ; GCN1-NEXT:  .LBB75_1: ; %atomicrmw.start
3741 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3742 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3743 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
3744 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
3745 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
3746 ; GCN1-NEXT:    v_max_i32_e32 v0, s4, v1
3747 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3748 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3749 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3750 ; GCN1-NEXT:    buffer_wbinvl1_vol
3751 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3752 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
3753 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
3754 ; GCN1-NEXT:    s_cbranch_execnz .LBB75_1
3755 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3756 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
3757 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
3758 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
3759 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
3760 ; GCN1-NEXT:    s_endpgm
3762 ; GCN2-LABEL: atomic_max_i32_ret_addr64:
3763 ; GCN2:       ; %bb.0: ; %entry
3764 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
3765 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
3766 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
3767 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
3768 ; GCN2-NEXT:    s_mov_b32 s6, s5
3769 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
3770 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
3771 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
3772 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
3773 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
3774 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
3775 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
3776 ; GCN2-NEXT:  .LBB75_1: ; %atomicrmw.start
3777 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3778 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3779 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
3780 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
3781 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
3782 ; GCN2-NEXT:    v_max_i32_e32 v0, s4, v1
3783 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3784 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3785 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3786 ; GCN2-NEXT:    buffer_wbinvl1_vol
3787 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3788 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
3789 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
3790 ; GCN2-NEXT:    s_cbranch_execnz .LBB75_1
3791 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3792 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
3793 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
3794 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
3795 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
3796 ; GCN2-NEXT:    s_endpgm
3798 ; GCN3-LABEL: atomic_max_i32_ret_addr64:
3799 ; GCN3:       ; %bb.0: ; %entry
3800 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
3801 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
3802 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
3803 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
3804 ; GCN3-NEXT:    s_mov_b32 s0, s3
3805 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
3806 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
3807 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
3808 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
3809 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
3810 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
3811 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3812 ; GCN3-NEXT:  .LBB75_1: ; %atomicrmw.start
3813 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3814 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3815 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
3816 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
3817 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
3818 ; GCN3-NEXT:    v_max_i32_e32 v0, s2, v1
3819 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3820 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
3821 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3822 ; GCN3-NEXT:    buffer_wbinvl1_vol
3823 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
3824 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3825 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3826 ; GCN3-NEXT:    s_cbranch_execnz .LBB75_1
3827 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3828 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
3829 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
3830 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
3831 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
3832 ; GCN3-NEXT:    s_endpgm
3833 entry:
3834   %ptr = getelementptr i32, ptr %out, i32 %index
3835   %tmp0 = atomicrmw max ptr %ptr, i32 %in seq_cst
3836   store i32 %tmp0, ptr %out2
3837   ret void
3840 ; ---------------------------------------------------------------------
3841 ; atomicrmw umax
3842 ; ---------------------------------------------------------------------
3844 define void @flat_atomic_umax_i32_noret(ptr %ptr, i32 %in) {
3845 ; GCN1-LABEL: flat_atomic_umax_i32_noret:
3846 ; GCN1:       ; %bb.0:
3847 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3848 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
3849 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
3850 ; GCN1-NEXT:  .LBB76_1: ; %atomicrmw.start
3851 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3852 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3853 ; GCN1-NEXT:    v_max_u32_e32 v3, v4, v2
3854 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3855 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
3856 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3857 ; GCN1-NEXT:    buffer_wbinvl1_vol
3858 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3859 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3860 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
3861 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3862 ; GCN1-NEXT:    s_cbranch_execnz .LBB76_1
3863 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3864 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
3865 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3867 ; GCN2-LABEL: flat_atomic_umax_i32_noret:
3868 ; GCN2:       ; %bb.0:
3869 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3870 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
3871 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
3872 ; GCN2-NEXT:  .LBB76_1: ; %atomicrmw.start
3873 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3874 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3875 ; GCN2-NEXT:    v_max_u32_e32 v3, v4, v2
3876 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3877 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
3878 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3879 ; GCN2-NEXT:    buffer_wbinvl1_vol
3880 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3881 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3882 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
3883 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3884 ; GCN2-NEXT:    s_cbranch_execnz .LBB76_1
3885 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3886 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
3887 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3889 ; GCN3-LABEL: flat_atomic_umax_i32_noret:
3890 ; GCN3:       ; %bb.0:
3891 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3892 ; GCN3-NEXT:    flat_load_dword v4, v[0:1]
3893 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3894 ; GCN3-NEXT:  .LBB76_1: ; %atomicrmw.start
3895 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3896 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3897 ; GCN3-NEXT:    v_max_u32_e32 v3, v4, v2
3898 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3899 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
3900 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3901 ; GCN3-NEXT:    buffer_wbinvl1_vol
3902 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3903 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3904 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
3905 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3906 ; GCN3-NEXT:    s_cbranch_execnz .LBB76_1
3907 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3908 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
3909 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3910   %tmp0 = atomicrmw umax ptr %ptr, i32 %in seq_cst
3911   ret void
3914 define void @flat_atomic_umax_i32_noret_offset(ptr %out, i32 %in) {
3915 ; GCN1-LABEL: flat_atomic_umax_i32_noret_offset:
3916 ; GCN1:       ; %bb.0:
3917 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3918 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
3919 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3920 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
3921 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
3922 ; GCN1-NEXT:  .LBB77_1: ; %atomicrmw.start
3923 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3924 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3925 ; GCN1-NEXT:    v_max_u32_e32 v3, v4, v2
3926 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3927 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
3928 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3929 ; GCN1-NEXT:    buffer_wbinvl1_vol
3930 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3931 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3932 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
3933 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3934 ; GCN1-NEXT:    s_cbranch_execnz .LBB77_1
3935 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
3936 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
3937 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
3939 ; GCN2-LABEL: flat_atomic_umax_i32_noret_offset:
3940 ; GCN2:       ; %bb.0:
3941 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3942 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
3943 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
3944 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
3945 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
3946 ; GCN2-NEXT:  .LBB77_1: ; %atomicrmw.start
3947 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
3948 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3949 ; GCN2-NEXT:    v_max_u32_e32 v3, v4, v2
3950 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3951 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
3952 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3953 ; GCN2-NEXT:    buffer_wbinvl1_vol
3954 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3955 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3956 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
3957 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3958 ; GCN2-NEXT:    s_cbranch_execnz .LBB77_1
3959 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
3960 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
3961 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
3963 ; GCN3-LABEL: flat_atomic_umax_i32_noret_offset:
3964 ; GCN3:       ; %bb.0:
3965 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3966 ; GCN3-NEXT:    flat_load_dword v4, v[0:1] offset:16
3967 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
3968 ; GCN3-NEXT:  .LBB77_1: ; %atomicrmw.start
3969 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
3970 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3971 ; GCN3-NEXT:    v_max_u32_e32 v3, v4, v2
3972 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3973 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
3974 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3975 ; GCN3-NEXT:    buffer_wbinvl1_vol
3976 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
3977 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
3978 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
3979 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
3980 ; GCN3-NEXT:    s_cbranch_execnz .LBB77_1
3981 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
3982 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
3983 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
3984   %gep = getelementptr i32, ptr %out, i32 4
3985   %tmp0 = atomicrmw umax ptr %gep, i32 %in seq_cst
3986   ret void
3989 define i32 @flat_atomic_umax_i32_ret(ptr %ptr, i32 %in) {
3990 ; GCN1-LABEL: flat_atomic_umax_i32_ret:
3991 ; GCN1:       ; %bb.0:
3992 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3993 ; GCN1-NEXT:    flat_load_dword v3, v[0:1]
3994 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
3995 ; GCN1-NEXT:  .LBB78_1: ; %atomicrmw.start
3996 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
3997 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3998 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
3999 ; GCN1-NEXT:    v_max_u32_e32 v3, v4, v2
4000 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4001 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4002 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4003 ; GCN1-NEXT:    buffer_wbinvl1_vol
4004 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4005 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4006 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4007 ; GCN1-NEXT:    s_cbranch_execnz .LBB78_1
4008 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4009 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
4010 ; GCN1-NEXT:    v_mov_b32_e32 v0, v3
4011 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4013 ; GCN2-LABEL: flat_atomic_umax_i32_ret:
4014 ; GCN2:       ; %bb.0:
4015 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4016 ; GCN2-NEXT:    flat_load_dword v3, v[0:1]
4017 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4018 ; GCN2-NEXT:  .LBB78_1: ; %atomicrmw.start
4019 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4020 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4021 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
4022 ; GCN2-NEXT:    v_max_u32_e32 v3, v4, v2
4023 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4024 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4025 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4026 ; GCN2-NEXT:    buffer_wbinvl1_vol
4027 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4028 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4029 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4030 ; GCN2-NEXT:    s_cbranch_execnz .LBB78_1
4031 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4032 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
4033 ; GCN2-NEXT:    v_mov_b32_e32 v0, v3
4034 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4036 ; GCN3-LABEL: flat_atomic_umax_i32_ret:
4037 ; GCN3:       ; %bb.0:
4038 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4039 ; GCN3-NEXT:    flat_load_dword v3, v[0:1]
4040 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4041 ; GCN3-NEXT:  .LBB78_1: ; %atomicrmw.start
4042 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4043 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4044 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
4045 ; GCN3-NEXT:    v_max_u32_e32 v3, v4, v2
4046 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4047 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4048 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4049 ; GCN3-NEXT:    buffer_wbinvl1_vol
4050 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4051 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4052 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4053 ; GCN3-NEXT:    s_cbranch_execnz .LBB78_1
4054 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4055 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4056 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
4057 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4058   %result = atomicrmw umax ptr %ptr, i32 %in seq_cst
4059   ret i32 %result
4062 define i32 @flat_atomic_umax_i32_ret_offset(ptr %out, i32 %in) {
4063 ; GCN1-LABEL: flat_atomic_umax_i32_ret_offset:
4064 ; GCN1:       ; %bb.0:
4065 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4066 ; GCN1-NEXT:    v_add_i32_e32 v3, vcc, 16, v0
4067 ; GCN1-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
4068 ; GCN1-NEXT:    flat_load_dword v0, v[3:4]
4069 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
4070 ; GCN1-NEXT:  .LBB79_1: ; %atomicrmw.start
4071 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4072 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4073 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4074 ; GCN1-NEXT:    v_max_u32_e32 v0, v1, v2
4075 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4076 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
4077 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4078 ; GCN1-NEXT:    buffer_wbinvl1_vol
4079 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4080 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4081 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4082 ; GCN1-NEXT:    s_cbranch_execnz .LBB79_1
4083 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4084 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
4085 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4087 ; GCN2-LABEL: flat_atomic_umax_i32_ret_offset:
4088 ; GCN2:       ; %bb.0:
4089 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4090 ; GCN2-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
4091 ; GCN2-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
4092 ; GCN2-NEXT:    flat_load_dword v0, v[3:4]
4093 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4094 ; GCN2-NEXT:  .LBB79_1: ; %atomicrmw.start
4095 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4096 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4097 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4098 ; GCN2-NEXT:    v_max_u32_e32 v0, v1, v2
4099 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4100 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
4101 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4102 ; GCN2-NEXT:    buffer_wbinvl1_vol
4103 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4104 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4105 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4106 ; GCN2-NEXT:    s_cbranch_execnz .LBB79_1
4107 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4108 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
4109 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4111 ; GCN3-LABEL: flat_atomic_umax_i32_ret_offset:
4112 ; GCN3:       ; %bb.0:
4113 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4114 ; GCN3-NEXT:    flat_load_dword v3, v[0:1] offset:16
4115 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4116 ; GCN3-NEXT:  .LBB79_1: ; %atomicrmw.start
4117 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4118 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4119 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
4120 ; GCN3-NEXT:    v_max_u32_e32 v3, v4, v2
4121 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4122 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
4123 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4124 ; GCN3-NEXT:    buffer_wbinvl1_vol
4125 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4126 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4127 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4128 ; GCN3-NEXT:    s_cbranch_execnz .LBB79_1
4129 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4130 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4131 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
4132 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4133   %gep = getelementptr i32, ptr %out, i32 4
4134   %result = atomicrmw umax ptr %gep, i32 %in seq_cst
4135   ret i32 %result
4138 define amdgpu_gfx void @flat_atomic_umax_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
4139 ; GCN1-LABEL: flat_atomic_umax_i32_noret_scalar:
4140 ; GCN1:       ; %bb.0:
4141 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4142 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
4143 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
4144 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
4145 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
4146 ; GCN1-NEXT:  .LBB80_1: ; %atomicrmw.start
4147 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4148 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
4149 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4150 ; GCN1-NEXT:    v_max_u32_e32 v0, s6, v1
4151 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
4152 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4153 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4154 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4155 ; GCN1-NEXT:    buffer_wbinvl1_vol
4156 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4157 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4158 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4159 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4160 ; GCN1-NEXT:    s_cbranch_execnz .LBB80_1
4161 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4162 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
4163 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4165 ; GCN2-LABEL: flat_atomic_umax_i32_noret_scalar:
4166 ; GCN2:       ; %bb.0:
4167 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4168 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
4169 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
4170 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
4171 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
4172 ; GCN2-NEXT:  .LBB80_1: ; %atomicrmw.start
4173 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4174 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
4175 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4176 ; GCN2-NEXT:    v_max_u32_e32 v0, s6, v1
4177 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
4178 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4179 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4180 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4181 ; GCN2-NEXT:    buffer_wbinvl1_vol
4182 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4183 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4184 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4185 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4186 ; GCN2-NEXT:    s_cbranch_execnz .LBB80_1
4187 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4188 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
4189 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4191 ; GCN3-LABEL: flat_atomic_umax_i32_noret_scalar:
4192 ; GCN3:       ; %bb.0:
4193 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4194 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
4195 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
4196 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
4197 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
4198 ; GCN3-NEXT:  .LBB80_1: ; %atomicrmw.start
4199 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4200 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
4201 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4202 ; GCN3-NEXT:    v_max_u32_e32 v0, s6, v1
4203 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
4204 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4205 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4206 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4207 ; GCN3-NEXT:    buffer_wbinvl1_vol
4208 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4209 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4210 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4211 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4212 ; GCN3-NEXT:    s_cbranch_execnz .LBB80_1
4213 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4214 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
4215 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4216   %tmp0 = atomicrmw umax ptr %ptr, i32 %in seq_cst
4217   ret void
4220 define amdgpu_gfx void @flat_atomic_umax_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
4221 ; GCN1-LABEL: flat_atomic_umax_i32_noret_offset_scalar:
4222 ; GCN1:       ; %bb.0:
4223 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4224 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
4225 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
4226 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
4227 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
4228 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
4229 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
4230 ; GCN1-NEXT:  .LBB81_1: ; %atomicrmw.start
4231 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4232 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
4233 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4234 ; GCN1-NEXT:    v_max_u32_e32 v0, s6, v1
4235 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
4236 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4237 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4238 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4239 ; GCN1-NEXT:    buffer_wbinvl1_vol
4240 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4241 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
4242 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4243 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
4244 ; GCN1-NEXT:    s_cbranch_execnz .LBB81_1
4245 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4246 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
4247 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4249 ; GCN2-LABEL: flat_atomic_umax_i32_noret_offset_scalar:
4250 ; GCN2:       ; %bb.0:
4251 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4252 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
4253 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
4254 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
4255 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
4256 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
4257 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
4258 ; GCN2-NEXT:  .LBB81_1: ; %atomicrmw.start
4259 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4260 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
4261 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4262 ; GCN2-NEXT:    v_max_u32_e32 v0, s6, v1
4263 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
4264 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4265 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4266 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4267 ; GCN2-NEXT:    buffer_wbinvl1_vol
4268 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4269 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
4270 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4271 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
4272 ; GCN2-NEXT:    s_cbranch_execnz .LBB81_1
4273 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4274 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
4275 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4277 ; GCN3-LABEL: flat_atomic_umax_i32_noret_offset_scalar:
4278 ; GCN3:       ; %bb.0:
4279 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4280 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
4281 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
4282 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
4283 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
4284 ; GCN3-NEXT:  .LBB81_1: ; %atomicrmw.start
4285 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4286 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
4287 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4288 ; GCN3-NEXT:    v_max_u32_e32 v0, s6, v1
4289 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
4290 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4291 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
4292 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4293 ; GCN3-NEXT:    buffer_wbinvl1_vol
4294 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4295 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4296 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4297 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4298 ; GCN3-NEXT:    s_cbranch_execnz .LBB81_1
4299 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4300 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
4301 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4302   %gep = getelementptr i32, ptr %out, i32 4
4303   %tmp0 = atomicrmw umax ptr %gep, i32 %in seq_cst
4304   ret void
4307 define amdgpu_gfx i32 @flat_atomic_umax_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
4308 ; GCN1-LABEL: flat_atomic_umax_i32_ret_scalar:
4309 ; GCN1:       ; %bb.0:
4310 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4311 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
4312 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
4313 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
4314 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
4315 ; GCN1-NEXT:  .LBB82_1: ; %atomicrmw.start
4316 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4317 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4318 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4319 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
4320 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
4321 ; GCN1-NEXT:    v_max_u32_e32 v0, s6, v1
4322 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4323 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4324 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4325 ; GCN1-NEXT:    buffer_wbinvl1_vol
4326 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4327 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4328 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4329 ; GCN1-NEXT:    s_cbranch_execnz .LBB82_1
4330 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4331 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
4332 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4334 ; GCN2-LABEL: flat_atomic_umax_i32_ret_scalar:
4335 ; GCN2:       ; %bb.0:
4336 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4337 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
4338 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
4339 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
4340 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
4341 ; GCN2-NEXT:  .LBB82_1: ; %atomicrmw.start
4342 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4343 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4344 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4345 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
4346 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
4347 ; GCN2-NEXT:    v_max_u32_e32 v0, s6, v1
4348 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4349 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4350 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4351 ; GCN2-NEXT:    buffer_wbinvl1_vol
4352 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4353 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4354 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4355 ; GCN2-NEXT:    s_cbranch_execnz .LBB82_1
4356 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4357 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
4358 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4360 ; GCN3-LABEL: flat_atomic_umax_i32_ret_scalar:
4361 ; GCN3:       ; %bb.0:
4362 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4363 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
4364 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
4365 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
4366 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
4367 ; GCN3-NEXT:  .LBB82_1: ; %atomicrmw.start
4368 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4369 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4370 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4371 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
4372 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
4373 ; GCN3-NEXT:    v_max_u32_e32 v0, s6, v1
4374 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4375 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4376 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4377 ; GCN3-NEXT:    buffer_wbinvl1_vol
4378 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4379 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4380 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4381 ; GCN3-NEXT:    s_cbranch_execnz .LBB82_1
4382 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4383 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
4384 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4385   %result = atomicrmw umax ptr %ptr, i32 %in seq_cst
4386   ret i32 %result
4389 define amdgpu_gfx i32 @flat_atomic_umax_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
4390 ; GCN1-LABEL: flat_atomic_umax_i32_ret_offset_scalar:
4391 ; GCN1:       ; %bb.0:
4392 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4393 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
4394 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
4395 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
4396 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
4397 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
4398 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
4399 ; GCN1-NEXT:  .LBB83_1: ; %atomicrmw.start
4400 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4401 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4402 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4403 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
4404 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
4405 ; GCN1-NEXT:    v_max_u32_e32 v0, s6, v1
4406 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4407 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4408 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4409 ; GCN1-NEXT:    buffer_wbinvl1_vol
4410 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4411 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
4412 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
4413 ; GCN1-NEXT:    s_cbranch_execnz .LBB83_1
4414 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4415 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
4416 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4418 ; GCN2-LABEL: flat_atomic_umax_i32_ret_offset_scalar:
4419 ; GCN2:       ; %bb.0:
4420 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4421 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
4422 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
4423 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
4424 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
4425 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
4426 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
4427 ; GCN2-NEXT:  .LBB83_1: ; %atomicrmw.start
4428 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4429 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4430 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4431 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
4432 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
4433 ; GCN2-NEXT:    v_max_u32_e32 v0, s6, v1
4434 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4435 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4436 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4437 ; GCN2-NEXT:    buffer_wbinvl1_vol
4438 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4439 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
4440 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
4441 ; GCN2-NEXT:    s_cbranch_execnz .LBB83_1
4442 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4443 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
4444 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4446 ; GCN3-LABEL: flat_atomic_umax_i32_ret_offset_scalar:
4447 ; GCN3:       ; %bb.0:
4448 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4449 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
4450 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
4451 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
4452 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
4453 ; GCN3-NEXT:  .LBB83_1: ; %atomicrmw.start
4454 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4455 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4456 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4457 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
4458 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
4459 ; GCN3-NEXT:    v_max_u32_e32 v0, s6, v1
4460 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4461 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
4462 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4463 ; GCN3-NEXT:    buffer_wbinvl1_vol
4464 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4465 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
4466 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
4467 ; GCN3-NEXT:    s_cbranch_execnz .LBB83_1
4468 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4469 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
4470 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4471   %gep = getelementptr i32, ptr %out, i32 4
4472   %result = atomicrmw umax ptr %gep, i32 %in seq_cst
4473   ret i32 %result
4476 define amdgpu_kernel void @atomic_umax_i32_addr64_offset(ptr %out, i32 %in, i32 %index) {
4477 ; GCN1-LABEL: atomic_umax_i32_addr64_offset:
4478 ; GCN1:       ; %bb.0: ; %entry
4479 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4480 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
4481 ; GCN1-NEXT:    s_ashr_i32 s5, s3, 31
4482 ; GCN1-NEXT:    s_mov_b32 s4, s3
4483 ; GCN1-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4484 ; GCN1-NEXT:    s_add_u32 s0, s0, s4
4485 ; GCN1-NEXT:    s_addc_u32 s1, s1, s5
4486 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
4487 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
4488 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
4489 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
4490 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
4491 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
4492 ; GCN1-NEXT:  .LBB84_1: ; %atomicrmw.start
4493 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4494 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
4495 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4496 ; GCN1-NEXT:    v_max_u32_e32 v0, s2, v1
4497 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
4498 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4499 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4500 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4501 ; GCN1-NEXT:    buffer_wbinvl1_vol
4502 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4503 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4504 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4505 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4506 ; GCN1-NEXT:    s_cbranch_execnz .LBB84_1
4507 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4508 ; GCN1-NEXT:    s_endpgm
4510 ; GCN2-LABEL: atomic_umax_i32_addr64_offset:
4511 ; GCN2:       ; %bb.0: ; %entry
4512 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4513 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
4514 ; GCN2-NEXT:    s_ashr_i32 s5, s3, 31
4515 ; GCN2-NEXT:    s_mov_b32 s4, s3
4516 ; GCN2-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4517 ; GCN2-NEXT:    s_add_u32 s0, s0, s4
4518 ; GCN2-NEXT:    s_addc_u32 s1, s1, s5
4519 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
4520 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
4521 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
4522 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
4523 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
4524 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4525 ; GCN2-NEXT:  .LBB84_1: ; %atomicrmw.start
4526 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4527 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
4528 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4529 ; GCN2-NEXT:    v_max_u32_e32 v0, s2, v1
4530 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
4531 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4532 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4533 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4534 ; GCN2-NEXT:    buffer_wbinvl1_vol
4535 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4536 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4537 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4538 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4539 ; GCN2-NEXT:    s_cbranch_execnz .LBB84_1
4540 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4541 ; GCN2-NEXT:    s_endpgm
4543 ; GCN3-LABEL: atomic_umax_i32_addr64_offset:
4544 ; GCN3:       ; %bb.0: ; %entry
4545 ; GCN3-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4546 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
4547 ; GCN3-NEXT:    s_ashr_i32 s5, s3, 31
4548 ; GCN3-NEXT:    s_mov_b32 s4, s3
4549 ; GCN3-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
4550 ; GCN3-NEXT:    s_add_u32 s0, s0, s4
4551 ; GCN3-NEXT:    s_addc_u32 s1, s1, s5
4552 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
4553 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
4554 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
4555 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4556 ; GCN3-NEXT:  .LBB84_1: ; %atomicrmw.start
4557 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4558 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
4559 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4560 ; GCN3-NEXT:    v_max_u32_e32 v0, s2, v1
4561 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
4562 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4563 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
4564 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4565 ; GCN3-NEXT:    buffer_wbinvl1_vol
4566 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4567 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4568 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4569 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4570 ; GCN3-NEXT:    s_cbranch_execnz .LBB84_1
4571 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4572 ; GCN3-NEXT:    s_endpgm
4573 entry:
4574   %ptr = getelementptr i32, ptr %out, i32 %index
4575   %gep = getelementptr i32, ptr %ptr, i32 4
4576   %tmp0 = atomicrmw umax ptr %gep, i32 %in seq_cst
4577   ret void
4580 define amdgpu_kernel void @atomic_umax_i32_ret_addr64_offset(ptr %out, ptr %out2, i32 %in, i32 %index) {
4581 ; GCN1-LABEL: atomic_umax_i32_ret_addr64_offset:
4582 ; GCN1:       ; %bb.0: ; %entry
4583 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4584 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4585 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
4586 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
4587 ; GCN1-NEXT:    s_mov_b32 s6, s5
4588 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
4589 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
4590 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
4591 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
4592 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
4593 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
4594 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
4595 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
4596 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
4597 ; GCN1-NEXT:  .LBB85_1: ; %atomicrmw.start
4598 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4599 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4600 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4601 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
4602 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
4603 ; GCN1-NEXT:    v_max_u32_e32 v0, s4, v1
4604 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4605 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4606 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4607 ; GCN1-NEXT:    buffer_wbinvl1_vol
4608 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4609 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
4610 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
4611 ; GCN1-NEXT:    s_cbranch_execnz .LBB85_1
4612 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4613 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
4614 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
4615 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
4616 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
4617 ; GCN1-NEXT:    s_endpgm
4619 ; GCN2-LABEL: atomic_umax_i32_ret_addr64_offset:
4620 ; GCN2:       ; %bb.0: ; %entry
4621 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
4622 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4623 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
4624 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
4625 ; GCN2-NEXT:    s_mov_b32 s6, s5
4626 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
4627 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
4628 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
4629 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
4630 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
4631 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
4632 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
4633 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
4634 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
4635 ; GCN2-NEXT:  .LBB85_1: ; %atomicrmw.start
4636 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4637 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4638 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4639 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
4640 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
4641 ; GCN2-NEXT:    v_max_u32_e32 v0, s4, v1
4642 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4643 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4644 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4645 ; GCN2-NEXT:    buffer_wbinvl1_vol
4646 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4647 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
4648 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
4649 ; GCN2-NEXT:    s_cbranch_execnz .LBB85_1
4650 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4651 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
4652 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
4653 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
4654 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
4655 ; GCN2-NEXT:    s_endpgm
4657 ; GCN3-LABEL: atomic_umax_i32_ret_addr64_offset:
4658 ; GCN3:       ; %bb.0: ; %entry
4659 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4660 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4661 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
4662 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
4663 ; GCN3-NEXT:    s_mov_b32 s0, s3
4664 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
4665 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
4666 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
4667 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
4668 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
4669 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
4670 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4671 ; GCN3-NEXT:  .LBB85_1: ; %atomicrmw.start
4672 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4673 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4674 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4675 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
4676 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
4677 ; GCN3-NEXT:    v_max_u32_e32 v0, s2, v1
4678 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4679 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
4680 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4681 ; GCN3-NEXT:    buffer_wbinvl1_vol
4682 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4683 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4684 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4685 ; GCN3-NEXT:    s_cbranch_execnz .LBB85_1
4686 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4687 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4688 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
4689 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
4690 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
4691 ; GCN3-NEXT:    s_endpgm
4692 entry:
4693   %ptr = getelementptr i32, ptr %out, i32 %index
4694   %gep = getelementptr i32, ptr %ptr, i32 4
4695   %tmp0 = atomicrmw umax ptr %gep, i32 %in seq_cst
4696   store i32 %tmp0, ptr %out2
4697   ret void
4700 define amdgpu_kernel void @atomic_umax_i32_ret_addr64(ptr %out, ptr %out2, i32 %in, i32 %index) {
4701 ; GCN1-LABEL: atomic_umax_i32_ret_addr64:
4702 ; GCN1:       ; %bb.0: ; %entry
4703 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
4704 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
4705 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
4706 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
4707 ; GCN1-NEXT:    s_mov_b32 s6, s5
4708 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
4709 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
4710 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
4711 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
4712 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
4713 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
4714 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
4715 ; GCN1-NEXT:  .LBB86_1: ; %atomicrmw.start
4716 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4717 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4718 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
4719 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
4720 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
4721 ; GCN1-NEXT:    v_max_u32_e32 v0, s4, v1
4722 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4723 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4724 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4725 ; GCN1-NEXT:    buffer_wbinvl1_vol
4726 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4727 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
4728 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
4729 ; GCN1-NEXT:    s_cbranch_execnz .LBB86_1
4730 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4731 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
4732 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
4733 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
4734 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
4735 ; GCN1-NEXT:    s_endpgm
4737 ; GCN2-LABEL: atomic_umax_i32_ret_addr64:
4738 ; GCN2:       ; %bb.0: ; %entry
4739 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
4740 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
4741 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
4742 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
4743 ; GCN2-NEXT:    s_mov_b32 s6, s5
4744 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
4745 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
4746 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
4747 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
4748 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
4749 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
4750 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
4751 ; GCN2-NEXT:  .LBB86_1: ; %atomicrmw.start
4752 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4753 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4754 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
4755 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
4756 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
4757 ; GCN2-NEXT:    v_max_u32_e32 v0, s4, v1
4758 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4759 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4760 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4761 ; GCN2-NEXT:    buffer_wbinvl1_vol
4762 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4763 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
4764 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
4765 ; GCN2-NEXT:    s_cbranch_execnz .LBB86_1
4766 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4767 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
4768 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
4769 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
4770 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
4771 ; GCN2-NEXT:    s_endpgm
4773 ; GCN3-LABEL: atomic_umax_i32_ret_addr64:
4774 ; GCN3:       ; %bb.0: ; %entry
4775 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
4776 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
4777 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
4778 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
4779 ; GCN3-NEXT:    s_mov_b32 s0, s3
4780 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
4781 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
4782 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
4783 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
4784 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
4785 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
4786 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4787 ; GCN3-NEXT:  .LBB86_1: ; %atomicrmw.start
4788 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4789 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4790 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
4791 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
4792 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
4793 ; GCN3-NEXT:    v_max_u32_e32 v0, s2, v1
4794 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4795 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
4796 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4797 ; GCN3-NEXT:    buffer_wbinvl1_vol
4798 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
4799 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4800 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4801 ; GCN3-NEXT:    s_cbranch_execnz .LBB86_1
4802 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4803 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4804 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
4805 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
4806 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
4807 ; GCN3-NEXT:    s_endpgm
4808 entry:
4809   %ptr = getelementptr i32, ptr %out, i32 %index
4810   %tmp0 = atomicrmw umax ptr %ptr, i32 %in seq_cst
4811   store i32 %tmp0, ptr %out2
4812   ret void
4815 ; ---------------------------------------------------------------------
4816 ; atomicrmw umin
4817 ; ---------------------------------------------------------------------
4819 define void @flat_atomic_umin_i32_noret(ptr %ptr, i32 %in) {
4820 ; GCN1-LABEL: flat_atomic_umin_i32_noret:
4821 ; GCN1:       ; %bb.0:
4822 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4823 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
4824 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
4825 ; GCN1-NEXT:  .LBB87_1: ; %atomicrmw.start
4826 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4827 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4828 ; GCN1-NEXT:    v_min_u32_e32 v3, v4, v2
4829 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4830 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4831 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4832 ; GCN1-NEXT:    buffer_wbinvl1_vol
4833 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4834 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4835 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
4836 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4837 ; GCN1-NEXT:    s_cbranch_execnz .LBB87_1
4838 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4839 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
4840 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4842 ; GCN2-LABEL: flat_atomic_umin_i32_noret:
4843 ; GCN2:       ; %bb.0:
4844 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4845 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
4846 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4847 ; GCN2-NEXT:  .LBB87_1: ; %atomicrmw.start
4848 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4849 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4850 ; GCN2-NEXT:    v_min_u32_e32 v3, v4, v2
4851 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4852 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4853 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4854 ; GCN2-NEXT:    buffer_wbinvl1_vol
4855 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4856 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4857 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
4858 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4859 ; GCN2-NEXT:    s_cbranch_execnz .LBB87_1
4860 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4861 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
4862 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4864 ; GCN3-LABEL: flat_atomic_umin_i32_noret:
4865 ; GCN3:       ; %bb.0:
4866 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4867 ; GCN3-NEXT:    flat_load_dword v4, v[0:1]
4868 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4869 ; GCN3-NEXT:  .LBB87_1: ; %atomicrmw.start
4870 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4871 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4872 ; GCN3-NEXT:    v_min_u32_e32 v3, v4, v2
4873 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4874 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4875 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4876 ; GCN3-NEXT:    buffer_wbinvl1_vol
4877 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4878 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4879 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
4880 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4881 ; GCN3-NEXT:    s_cbranch_execnz .LBB87_1
4882 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4883 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4884 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4885   %tmp0 = atomicrmw umin ptr %ptr, i32 %in seq_cst
4886   ret void
4889 define void @flat_atomic_umin_i32_noret_offset(ptr %out, i32 %in) {
4890 ; GCN1-LABEL: flat_atomic_umin_i32_noret_offset:
4891 ; GCN1:       ; %bb.0:
4892 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4893 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
4894 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4895 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
4896 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
4897 ; GCN1-NEXT:  .LBB88_1: ; %atomicrmw.start
4898 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4899 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4900 ; GCN1-NEXT:    v_min_u32_e32 v3, v4, v2
4901 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4902 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4903 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4904 ; GCN1-NEXT:    buffer_wbinvl1_vol
4905 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4906 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4907 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
4908 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4909 ; GCN1-NEXT:    s_cbranch_execnz .LBB88_1
4910 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4911 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
4912 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4914 ; GCN2-LABEL: flat_atomic_umin_i32_noret_offset:
4915 ; GCN2:       ; %bb.0:
4916 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4917 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
4918 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
4919 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
4920 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4921 ; GCN2-NEXT:  .LBB88_1: ; %atomicrmw.start
4922 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4923 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4924 ; GCN2-NEXT:    v_min_u32_e32 v3, v4, v2
4925 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4926 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4927 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4928 ; GCN2-NEXT:    buffer_wbinvl1_vol
4929 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4930 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4931 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
4932 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4933 ; GCN2-NEXT:    s_cbranch_execnz .LBB88_1
4934 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
4935 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
4936 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
4938 ; GCN3-LABEL: flat_atomic_umin_i32_noret_offset:
4939 ; GCN3:       ; %bb.0:
4940 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4941 ; GCN3-NEXT:    flat_load_dword v4, v[0:1] offset:16
4942 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
4943 ; GCN3-NEXT:  .LBB88_1: ; %atomicrmw.start
4944 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
4945 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4946 ; GCN3-NEXT:    v_min_u32_e32 v3, v4, v2
4947 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4948 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
4949 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4950 ; GCN3-NEXT:    buffer_wbinvl1_vol
4951 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4952 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4953 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
4954 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4955 ; GCN3-NEXT:    s_cbranch_execnz .LBB88_1
4956 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
4957 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
4958 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
4959   %gep = getelementptr i32, ptr %out, i32 4
4960   %tmp0 = atomicrmw umin ptr %gep, i32 %in seq_cst
4961   ret void
4964 define i32 @flat_atomic_umin_i32_ret(ptr %ptr, i32 %in) {
4965 ; GCN1-LABEL: flat_atomic_umin_i32_ret:
4966 ; GCN1:       ; %bb.0:
4967 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4968 ; GCN1-NEXT:    flat_load_dword v3, v[0:1]
4969 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
4970 ; GCN1-NEXT:  .LBB89_1: ; %atomicrmw.start
4971 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
4972 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4973 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
4974 ; GCN1-NEXT:    v_min_u32_e32 v3, v4, v2
4975 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4976 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
4977 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4978 ; GCN1-NEXT:    buffer_wbinvl1_vol
4979 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
4980 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
4981 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
4982 ; GCN1-NEXT:    s_cbranch_execnz .LBB89_1
4983 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
4984 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
4985 ; GCN1-NEXT:    v_mov_b32_e32 v0, v3
4986 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
4988 ; GCN2-LABEL: flat_atomic_umin_i32_ret:
4989 ; GCN2:       ; %bb.0:
4990 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
4991 ; GCN2-NEXT:    flat_load_dword v3, v[0:1]
4992 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
4993 ; GCN2-NEXT:  .LBB89_1: ; %atomicrmw.start
4994 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
4995 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4996 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
4997 ; GCN2-NEXT:    v_min_u32_e32 v3, v4, v2
4998 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4999 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5000 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5001 ; GCN2-NEXT:    buffer_wbinvl1_vol
5002 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5003 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5004 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5005 ; GCN2-NEXT:    s_cbranch_execnz .LBB89_1
5006 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5007 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5008 ; GCN2-NEXT:    v_mov_b32_e32 v0, v3
5009 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5011 ; GCN3-LABEL: flat_atomic_umin_i32_ret:
5012 ; GCN3:       ; %bb.0:
5013 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5014 ; GCN3-NEXT:    flat_load_dword v3, v[0:1]
5015 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5016 ; GCN3-NEXT:  .LBB89_1: ; %atomicrmw.start
5017 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5018 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5019 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5020 ; GCN3-NEXT:    v_min_u32_e32 v3, v4, v2
5021 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5022 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5023 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5024 ; GCN3-NEXT:    buffer_wbinvl1_vol
5025 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5026 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5027 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5028 ; GCN3-NEXT:    s_cbranch_execnz .LBB89_1
5029 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5030 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5031 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
5032 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5033   %result = atomicrmw umin ptr %ptr, i32 %in seq_cst
5034   ret i32 %result
5037 define i32 @flat_atomic_umin_i32_ret_offset(ptr %out, i32 %in) {
5038 ; GCN1-LABEL: flat_atomic_umin_i32_ret_offset:
5039 ; GCN1:       ; %bb.0:
5040 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5041 ; GCN1-NEXT:    v_add_i32_e32 v3, vcc, 16, v0
5042 ; GCN1-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
5043 ; GCN1-NEXT:    flat_load_dword v0, v[3:4]
5044 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
5045 ; GCN1-NEXT:  .LBB90_1: ; %atomicrmw.start
5046 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5047 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5048 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5049 ; GCN1-NEXT:    v_min_u32_e32 v0, v1, v2
5050 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5051 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
5052 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5053 ; GCN1-NEXT:    buffer_wbinvl1_vol
5054 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5055 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5056 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5057 ; GCN1-NEXT:    s_cbranch_execnz .LBB90_1
5058 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5059 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
5060 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5062 ; GCN2-LABEL: flat_atomic_umin_i32_ret_offset:
5063 ; GCN2:       ; %bb.0:
5064 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5065 ; GCN2-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
5066 ; GCN2-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
5067 ; GCN2-NEXT:    flat_load_dword v0, v[3:4]
5068 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
5069 ; GCN2-NEXT:  .LBB90_1: ; %atomicrmw.start
5070 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5071 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5072 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5073 ; GCN2-NEXT:    v_min_u32_e32 v0, v1, v2
5074 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5075 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
5076 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5077 ; GCN2-NEXT:    buffer_wbinvl1_vol
5078 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5079 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5080 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5081 ; GCN2-NEXT:    s_cbranch_execnz .LBB90_1
5082 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5083 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5084 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5086 ; GCN3-LABEL: flat_atomic_umin_i32_ret_offset:
5087 ; GCN3:       ; %bb.0:
5088 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5089 ; GCN3-NEXT:    flat_load_dword v3, v[0:1] offset:16
5090 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5091 ; GCN3-NEXT:  .LBB90_1: ; %atomicrmw.start
5092 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5093 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5094 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5095 ; GCN3-NEXT:    v_min_u32_e32 v3, v4, v2
5096 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5097 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
5098 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5099 ; GCN3-NEXT:    buffer_wbinvl1_vol
5100 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5101 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5102 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5103 ; GCN3-NEXT:    s_cbranch_execnz .LBB90_1
5104 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5105 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5106 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
5107 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5108   %gep = getelementptr i32, ptr %out, i32 4
5109   %result = atomicrmw umin ptr %gep, i32 %in seq_cst
5110   ret i32 %result
5113 define amdgpu_gfx void @flat_atomic_umin_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
5114 ; GCN1-LABEL: flat_atomic_umin_i32_noret_scalar:
5115 ; GCN1:       ; %bb.0:
5116 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5117 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
5118 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
5119 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
5120 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
5121 ; GCN1-NEXT:  .LBB91_1: ; %atomicrmw.start
5122 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5123 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
5124 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5125 ; GCN1-NEXT:    v_min_u32_e32 v0, s6, v1
5126 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
5127 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5128 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5129 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5130 ; GCN1-NEXT:    buffer_wbinvl1_vol
5131 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5132 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5133 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5134 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5135 ; GCN1-NEXT:    s_cbranch_execnz .LBB91_1
5136 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5137 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
5138 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5140 ; GCN2-LABEL: flat_atomic_umin_i32_noret_scalar:
5141 ; GCN2:       ; %bb.0:
5142 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5143 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
5144 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
5145 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
5146 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
5147 ; GCN2-NEXT:  .LBB91_1: ; %atomicrmw.start
5148 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5149 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
5150 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5151 ; GCN2-NEXT:    v_min_u32_e32 v0, s6, v1
5152 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
5153 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5154 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5155 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5156 ; GCN2-NEXT:    buffer_wbinvl1_vol
5157 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5158 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5159 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5160 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5161 ; GCN2-NEXT:    s_cbranch_execnz .LBB91_1
5162 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5163 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
5164 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5166 ; GCN3-LABEL: flat_atomic_umin_i32_noret_scalar:
5167 ; GCN3:       ; %bb.0:
5168 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5169 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5170 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5171 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
5172 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5173 ; GCN3-NEXT:  .LBB91_1: ; %atomicrmw.start
5174 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5175 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5176 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5177 ; GCN3-NEXT:    v_min_u32_e32 v0, s6, v1
5178 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5179 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5180 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5181 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5182 ; GCN3-NEXT:    buffer_wbinvl1_vol
5183 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5184 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5185 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5186 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5187 ; GCN3-NEXT:    s_cbranch_execnz .LBB91_1
5188 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5189 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5190 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5191   %tmp0 = atomicrmw umin ptr %ptr, i32 %in seq_cst
5192   ret void
5195 define amdgpu_gfx void @flat_atomic_umin_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
5196 ; GCN1-LABEL: flat_atomic_umin_i32_noret_offset_scalar:
5197 ; GCN1:       ; %bb.0:
5198 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5199 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
5200 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
5201 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
5202 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
5203 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
5204 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
5205 ; GCN1-NEXT:  .LBB92_1: ; %atomicrmw.start
5206 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5207 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
5208 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5209 ; GCN1-NEXT:    v_min_u32_e32 v0, s6, v1
5210 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
5211 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5212 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5213 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5214 ; GCN1-NEXT:    buffer_wbinvl1_vol
5215 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5216 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5217 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5218 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5219 ; GCN1-NEXT:    s_cbranch_execnz .LBB92_1
5220 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5221 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
5222 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5224 ; GCN2-LABEL: flat_atomic_umin_i32_noret_offset_scalar:
5225 ; GCN2:       ; %bb.0:
5226 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5227 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
5228 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
5229 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
5230 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
5231 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
5232 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
5233 ; GCN2-NEXT:  .LBB92_1: ; %atomicrmw.start
5234 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5235 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
5236 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5237 ; GCN2-NEXT:    v_min_u32_e32 v0, s6, v1
5238 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
5239 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5240 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5241 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5242 ; GCN2-NEXT:    buffer_wbinvl1_vol
5243 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5244 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5245 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5246 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5247 ; GCN2-NEXT:    s_cbranch_execnz .LBB92_1
5248 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5249 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
5250 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5252 ; GCN3-LABEL: flat_atomic_umin_i32_noret_offset_scalar:
5253 ; GCN3:       ; %bb.0:
5254 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5255 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5256 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5257 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
5258 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5259 ; GCN3-NEXT:  .LBB92_1: ; %atomicrmw.start
5260 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5261 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5262 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5263 ; GCN3-NEXT:    v_min_u32_e32 v0, s6, v1
5264 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5265 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5266 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
5267 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5268 ; GCN3-NEXT:    buffer_wbinvl1_vol
5269 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5270 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5271 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5272 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5273 ; GCN3-NEXT:    s_cbranch_execnz .LBB92_1
5274 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5275 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5276 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5277   %gep = getelementptr i32, ptr %out, i32 4
5278   %tmp0 = atomicrmw umin ptr %gep, i32 %in seq_cst
5279   ret void
5282 define amdgpu_gfx i32 @flat_atomic_umin_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
5283 ; GCN1-LABEL: flat_atomic_umin_i32_ret_scalar:
5284 ; GCN1:       ; %bb.0:
5285 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5286 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
5287 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
5288 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
5289 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
5290 ; GCN1-NEXT:  .LBB93_1: ; %atomicrmw.start
5291 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5292 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5293 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5294 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
5295 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
5296 ; GCN1-NEXT:    v_min_u32_e32 v0, s6, v1
5297 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5298 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5299 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5300 ; GCN1-NEXT:    buffer_wbinvl1_vol
5301 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5302 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5303 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5304 ; GCN1-NEXT:    s_cbranch_execnz .LBB93_1
5305 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5306 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
5307 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5309 ; GCN2-LABEL: flat_atomic_umin_i32_ret_scalar:
5310 ; GCN2:       ; %bb.0:
5311 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5312 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
5313 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
5314 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
5315 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
5316 ; GCN2-NEXT:  .LBB93_1: ; %atomicrmw.start
5317 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5318 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5319 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5320 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
5321 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
5322 ; GCN2-NEXT:    v_min_u32_e32 v0, s6, v1
5323 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5324 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5325 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5326 ; GCN2-NEXT:    buffer_wbinvl1_vol
5327 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5328 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5329 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5330 ; GCN2-NEXT:    s_cbranch_execnz .LBB93_1
5331 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5332 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
5333 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5335 ; GCN3-LABEL: flat_atomic_umin_i32_ret_scalar:
5336 ; GCN3:       ; %bb.0:
5337 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5338 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5339 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5340 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
5341 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5342 ; GCN3-NEXT:  .LBB93_1: ; %atomicrmw.start
5343 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5344 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5345 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5346 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5347 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5348 ; GCN3-NEXT:    v_min_u32_e32 v0, s6, v1
5349 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5350 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5351 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5352 ; GCN3-NEXT:    buffer_wbinvl1_vol
5353 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5354 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5355 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5356 ; GCN3-NEXT:    s_cbranch_execnz .LBB93_1
5357 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5358 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5359 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5360   %result = atomicrmw umin ptr %ptr, i32 %in seq_cst
5361   ret i32 %result
5364 define amdgpu_gfx i32 @flat_atomic_umin_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
5365 ; GCN1-LABEL: flat_atomic_umin_i32_ret_offset_scalar:
5366 ; GCN1:       ; %bb.0:
5367 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5368 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
5369 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
5370 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
5371 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
5372 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
5373 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
5374 ; GCN1-NEXT:  .LBB94_1: ; %atomicrmw.start
5375 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5376 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5377 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5378 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
5379 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
5380 ; GCN1-NEXT:    v_min_u32_e32 v0, s6, v1
5381 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5382 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5383 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5384 ; GCN1-NEXT:    buffer_wbinvl1_vol
5385 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5386 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5387 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5388 ; GCN1-NEXT:    s_cbranch_execnz .LBB94_1
5389 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5390 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
5391 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5393 ; GCN2-LABEL: flat_atomic_umin_i32_ret_offset_scalar:
5394 ; GCN2:       ; %bb.0:
5395 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5396 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
5397 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
5398 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
5399 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
5400 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
5401 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
5402 ; GCN2-NEXT:  .LBB94_1: ; %atomicrmw.start
5403 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5404 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5405 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5406 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
5407 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
5408 ; GCN2-NEXT:    v_min_u32_e32 v0, s6, v1
5409 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5410 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5411 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5412 ; GCN2-NEXT:    buffer_wbinvl1_vol
5413 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5414 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5415 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5416 ; GCN2-NEXT:    s_cbranch_execnz .LBB94_1
5417 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5418 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
5419 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5421 ; GCN3-LABEL: flat_atomic_umin_i32_ret_offset_scalar:
5422 ; GCN3:       ; %bb.0:
5423 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5424 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5425 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5426 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
5427 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5428 ; GCN3-NEXT:  .LBB94_1: ; %atomicrmw.start
5429 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5430 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5431 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5432 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5433 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5434 ; GCN3-NEXT:    v_min_u32_e32 v0, s6, v1
5435 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5436 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
5437 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5438 ; GCN3-NEXT:    buffer_wbinvl1_vol
5439 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5440 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5441 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5442 ; GCN3-NEXT:    s_cbranch_execnz .LBB94_1
5443 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5444 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5445 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5446   %gep = getelementptr i32, ptr %out, i32 4
5447   %result = atomicrmw umin ptr %gep, i32 %in seq_cst
5448   ret i32 %result
5451 ; ---------------------------------------------------------------------
5452 ; atomicrmw min
5453 ; ---------------------------------------------------------------------
5455 define void @flat_atomic_min_i32_noret(ptr %ptr, i32 %in) {
5456 ; GCN1-LABEL: flat_atomic_min_i32_noret:
5457 ; GCN1:       ; %bb.0:
5458 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5459 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
5460 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
5461 ; GCN1-NEXT:  .LBB95_1: ; %atomicrmw.start
5462 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5463 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5464 ; GCN1-NEXT:    v_min_i32_e32 v3, v4, v2
5465 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5466 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5467 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5468 ; GCN1-NEXT:    buffer_wbinvl1_vol
5469 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5470 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5471 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
5472 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5473 ; GCN1-NEXT:    s_cbranch_execnz .LBB95_1
5474 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5475 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
5476 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5478 ; GCN2-LABEL: flat_atomic_min_i32_noret:
5479 ; GCN2:       ; %bb.0:
5480 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5481 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
5482 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
5483 ; GCN2-NEXT:  .LBB95_1: ; %atomicrmw.start
5484 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5485 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5486 ; GCN2-NEXT:    v_min_i32_e32 v3, v4, v2
5487 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5488 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5489 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5490 ; GCN2-NEXT:    buffer_wbinvl1_vol
5491 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5492 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5493 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
5494 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5495 ; GCN2-NEXT:    s_cbranch_execnz .LBB95_1
5496 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5497 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5498 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5500 ; GCN3-LABEL: flat_atomic_min_i32_noret:
5501 ; GCN3:       ; %bb.0:
5502 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5503 ; GCN3-NEXT:    flat_load_dword v4, v[0:1]
5504 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5505 ; GCN3-NEXT:  .LBB95_1: ; %atomicrmw.start
5506 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5507 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5508 ; GCN3-NEXT:    v_min_i32_e32 v3, v4, v2
5509 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5510 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5511 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5512 ; GCN3-NEXT:    buffer_wbinvl1_vol
5513 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5514 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5515 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5516 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5517 ; GCN3-NEXT:    s_cbranch_execnz .LBB95_1
5518 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5519 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5520 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5521   %tmp0 = atomicrmw min ptr %ptr, i32 %in seq_cst
5522   ret void
5525 define void @flat_atomic_min_i32_noret_offset(ptr %out, i32 %in) {
5526 ; GCN1-LABEL: flat_atomic_min_i32_noret_offset:
5527 ; GCN1:       ; %bb.0:
5528 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5529 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
5530 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
5531 ; GCN1-NEXT:    flat_load_dword v4, v[0:1]
5532 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
5533 ; GCN1-NEXT:  .LBB96_1: ; %atomicrmw.start
5534 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5535 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5536 ; GCN1-NEXT:    v_min_i32_e32 v3, v4, v2
5537 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5538 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5539 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5540 ; GCN1-NEXT:    buffer_wbinvl1_vol
5541 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5542 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5543 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
5544 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5545 ; GCN1-NEXT:    s_cbranch_execnz .LBB96_1
5546 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5547 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
5548 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5550 ; GCN2-LABEL: flat_atomic_min_i32_noret_offset:
5551 ; GCN2:       ; %bb.0:
5552 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5553 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
5554 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
5555 ; GCN2-NEXT:    flat_load_dword v4, v[0:1]
5556 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
5557 ; GCN2-NEXT:  .LBB96_1: ; %atomicrmw.start
5558 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5559 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5560 ; GCN2-NEXT:    v_min_i32_e32 v3, v4, v2
5561 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5562 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5563 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5564 ; GCN2-NEXT:    buffer_wbinvl1_vol
5565 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5566 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5567 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
5568 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5569 ; GCN2-NEXT:    s_cbranch_execnz .LBB96_1
5570 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5571 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5572 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5574 ; GCN3-LABEL: flat_atomic_min_i32_noret_offset:
5575 ; GCN3:       ; %bb.0:
5576 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5577 ; GCN3-NEXT:    flat_load_dword v4, v[0:1] offset:16
5578 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5579 ; GCN3-NEXT:  .LBB96_1: ; %atomicrmw.start
5580 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5581 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5582 ; GCN3-NEXT:    v_min_i32_e32 v3, v4, v2
5583 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5584 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
5585 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5586 ; GCN3-NEXT:    buffer_wbinvl1_vol
5587 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5588 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5589 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5590 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5591 ; GCN3-NEXT:    s_cbranch_execnz .LBB96_1
5592 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5593 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5594 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5595   %gep = getelementptr i32, ptr %out, i32 4
5596   %tmp0 = atomicrmw min ptr %gep, i32 %in seq_cst
5597   ret void
5600 define i32 @flat_atomic_min_i32_ret(ptr %ptr, i32 %in) {
5601 ; GCN1-LABEL: flat_atomic_min_i32_ret:
5602 ; GCN1:       ; %bb.0:
5603 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5604 ; GCN1-NEXT:    flat_load_dword v3, v[0:1]
5605 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
5606 ; GCN1-NEXT:  .LBB97_1: ; %atomicrmw.start
5607 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5608 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5609 ; GCN1-NEXT:    v_mov_b32_e32 v4, v3
5610 ; GCN1-NEXT:    v_min_i32_e32 v3, v4, v2
5611 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5612 ; GCN1-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5613 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5614 ; GCN1-NEXT:    buffer_wbinvl1_vol
5615 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5616 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5617 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5618 ; GCN1-NEXT:    s_cbranch_execnz .LBB97_1
5619 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5620 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
5621 ; GCN1-NEXT:    v_mov_b32_e32 v0, v3
5622 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5624 ; GCN2-LABEL: flat_atomic_min_i32_ret:
5625 ; GCN2:       ; %bb.0:
5626 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5627 ; GCN2-NEXT:    flat_load_dword v3, v[0:1]
5628 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
5629 ; GCN2-NEXT:  .LBB97_1: ; %atomicrmw.start
5630 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5631 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5632 ; GCN2-NEXT:    v_mov_b32_e32 v4, v3
5633 ; GCN2-NEXT:    v_min_i32_e32 v3, v4, v2
5634 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5635 ; GCN2-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5636 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5637 ; GCN2-NEXT:    buffer_wbinvl1_vol
5638 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5639 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5640 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5641 ; GCN2-NEXT:    s_cbranch_execnz .LBB97_1
5642 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5643 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5644 ; GCN2-NEXT:    v_mov_b32_e32 v0, v3
5645 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5647 ; GCN3-LABEL: flat_atomic_min_i32_ret:
5648 ; GCN3:       ; %bb.0:
5649 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5650 ; GCN3-NEXT:    flat_load_dword v3, v[0:1]
5651 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5652 ; GCN3-NEXT:  .LBB97_1: ; %atomicrmw.start
5653 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5654 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5655 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5656 ; GCN3-NEXT:    v_min_i32_e32 v3, v4, v2
5657 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5658 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] glc
5659 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5660 ; GCN3-NEXT:    buffer_wbinvl1_vol
5661 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5662 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5663 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5664 ; GCN3-NEXT:    s_cbranch_execnz .LBB97_1
5665 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5666 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5667 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
5668 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5669   %result = atomicrmw min ptr %ptr, i32 %in seq_cst
5670   ret i32 %result
5673 define i32 @flat_atomic_min_i32_ret_offset(ptr %out, i32 %in) {
5674 ; GCN1-LABEL: flat_atomic_min_i32_ret_offset:
5675 ; GCN1:       ; %bb.0:
5676 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5677 ; GCN1-NEXT:    v_add_i32_e32 v3, vcc, 16, v0
5678 ; GCN1-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
5679 ; GCN1-NEXT:    flat_load_dword v0, v[3:4]
5680 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
5681 ; GCN1-NEXT:  .LBB98_1: ; %atomicrmw.start
5682 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5683 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5684 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5685 ; GCN1-NEXT:    v_min_i32_e32 v0, v1, v2
5686 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5687 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
5688 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5689 ; GCN1-NEXT:    buffer_wbinvl1_vol
5690 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5691 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5692 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5693 ; GCN1-NEXT:    s_cbranch_execnz .LBB98_1
5694 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5695 ; GCN1-NEXT:    s_or_b64 exec, exec, s[4:5]
5696 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5698 ; GCN2-LABEL: flat_atomic_min_i32_ret_offset:
5699 ; GCN2:       ; %bb.0:
5700 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5701 ; GCN2-NEXT:    v_add_u32_e32 v3, vcc, 16, v0
5702 ; GCN2-NEXT:    v_addc_u32_e32 v4, vcc, 0, v1, vcc
5703 ; GCN2-NEXT:    flat_load_dword v0, v[3:4]
5704 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
5705 ; GCN2-NEXT:  .LBB98_1: ; %atomicrmw.start
5706 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5707 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5708 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5709 ; GCN2-NEXT:    v_min_i32_e32 v0, v1, v2
5710 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5711 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[3:4], v[0:1] glc
5712 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5713 ; GCN2-NEXT:    buffer_wbinvl1_vol
5714 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5715 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5716 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5717 ; GCN2-NEXT:    s_cbranch_execnz .LBB98_1
5718 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5719 ; GCN2-NEXT:    s_or_b64 exec, exec, s[4:5]
5720 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5722 ; GCN3-LABEL: flat_atomic_min_i32_ret_offset:
5723 ; GCN3:       ; %bb.0:
5724 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5725 ; GCN3-NEXT:    flat_load_dword v3, v[0:1] offset:16
5726 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
5727 ; GCN3-NEXT:  .LBB98_1: ; %atomicrmw.start
5728 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5729 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5730 ; GCN3-NEXT:    v_mov_b32_e32 v4, v3
5731 ; GCN3-NEXT:    v_min_i32_e32 v3, v4, v2
5732 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5733 ; GCN3-NEXT:    flat_atomic_cmpswap v3, v[0:1], v[3:4] offset:16 glc
5734 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5735 ; GCN3-NEXT:    buffer_wbinvl1_vol
5736 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v3, v4
5737 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
5738 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
5739 ; GCN3-NEXT:    s_cbranch_execnz .LBB98_1
5740 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5741 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
5742 ; GCN3-NEXT:    v_mov_b32_e32 v0, v3
5743 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5744   %gep = getelementptr i32, ptr %out, i32 4
5745   %result = atomicrmw min ptr %gep, i32 %in seq_cst
5746   ret i32 %result
5749 define amdgpu_gfx void @flat_atomic_min_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
5750 ; GCN1-LABEL: flat_atomic_min_i32_noret_scalar:
5751 ; GCN1:       ; %bb.0:
5752 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5753 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
5754 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
5755 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
5756 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
5757 ; GCN1-NEXT:  .LBB99_1: ; %atomicrmw.start
5758 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5759 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
5760 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5761 ; GCN1-NEXT:    v_min_i32_e32 v0, s6, v1
5762 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
5763 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5764 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5765 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5766 ; GCN1-NEXT:    buffer_wbinvl1_vol
5767 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5768 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5769 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5770 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5771 ; GCN1-NEXT:    s_cbranch_execnz .LBB99_1
5772 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5773 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
5774 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5776 ; GCN2-LABEL: flat_atomic_min_i32_noret_scalar:
5777 ; GCN2:       ; %bb.0:
5778 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5779 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
5780 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
5781 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
5782 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
5783 ; GCN2-NEXT:  .LBB99_1: ; %atomicrmw.start
5784 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5785 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
5786 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5787 ; GCN2-NEXT:    v_min_i32_e32 v0, s6, v1
5788 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
5789 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5790 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5791 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5792 ; GCN2-NEXT:    buffer_wbinvl1_vol
5793 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5794 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5795 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5796 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5797 ; GCN2-NEXT:    s_cbranch_execnz .LBB99_1
5798 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5799 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
5800 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5802 ; GCN3-LABEL: flat_atomic_min_i32_noret_scalar:
5803 ; GCN3:       ; %bb.0:
5804 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5805 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5806 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5807 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
5808 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5809 ; GCN3-NEXT:  .LBB99_1: ; %atomicrmw.start
5810 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5811 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5812 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5813 ; GCN3-NEXT:    v_min_i32_e32 v0, s6, v1
5814 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5815 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5816 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5817 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5818 ; GCN3-NEXT:    buffer_wbinvl1_vol
5819 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5820 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5821 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5822 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5823 ; GCN3-NEXT:    s_cbranch_execnz .LBB99_1
5824 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5825 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5826 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5827   %tmp0 = atomicrmw min ptr %ptr, i32 %in seq_cst
5828   ret void
5831 define amdgpu_gfx void @flat_atomic_min_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
5832 ; GCN1-LABEL: flat_atomic_min_i32_noret_offset_scalar:
5833 ; GCN1:       ; %bb.0:
5834 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5835 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
5836 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
5837 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
5838 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
5839 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
5840 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
5841 ; GCN1-NEXT:  .LBB100_1: ; %atomicrmw.start
5842 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5843 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
5844 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5845 ; GCN1-NEXT:    v_min_i32_e32 v0, s6, v1
5846 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
5847 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5848 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5849 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5850 ; GCN1-NEXT:    buffer_wbinvl1_vol
5851 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5852 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5853 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5854 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5855 ; GCN1-NEXT:    s_cbranch_execnz .LBB100_1
5856 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5857 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
5858 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5860 ; GCN2-LABEL: flat_atomic_min_i32_noret_offset_scalar:
5861 ; GCN2:       ; %bb.0:
5862 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5863 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
5864 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
5865 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
5866 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
5867 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
5868 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
5869 ; GCN2-NEXT:  .LBB100_1: ; %atomicrmw.start
5870 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5871 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
5872 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5873 ; GCN2-NEXT:    v_min_i32_e32 v0, s6, v1
5874 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
5875 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5876 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5877 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5878 ; GCN2-NEXT:    buffer_wbinvl1_vol
5879 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5880 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
5881 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5882 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
5883 ; GCN2-NEXT:    s_cbranch_execnz .LBB100_1
5884 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5885 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
5886 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5888 ; GCN3-LABEL: flat_atomic_min_i32_noret_offset_scalar:
5889 ; GCN3:       ; %bb.0:
5890 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5891 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5892 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5893 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
5894 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5895 ; GCN3-NEXT:  .LBB100_1: ; %atomicrmw.start
5896 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5897 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5898 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5899 ; GCN3-NEXT:    v_min_i32_e32 v0, s6, v1
5900 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5901 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5902 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
5903 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5904 ; GCN3-NEXT:    buffer_wbinvl1_vol
5905 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5906 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5907 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5908 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5909 ; GCN3-NEXT:    s_cbranch_execnz .LBB100_1
5910 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5911 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5912 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5913   %gep = getelementptr i32, ptr %out, i32 4
5914   %tmp0 = atomicrmw min ptr %gep, i32 %in seq_cst
5915   ret void
5918 define amdgpu_gfx i32 @flat_atomic_min_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
5919 ; GCN1-LABEL: flat_atomic_min_i32_ret_scalar:
5920 ; GCN1:       ; %bb.0:
5921 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5922 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
5923 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
5924 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
5925 ; GCN1-NEXT:    s_mov_b64 s[34:35], 0
5926 ; GCN1-NEXT:  .LBB101_1: ; %atomicrmw.start
5927 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
5928 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5929 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
5930 ; GCN1-NEXT:    v_mov_b32_e32 v2, s4
5931 ; GCN1-NEXT:    v_mov_b32_e32 v3, s5
5932 ; GCN1-NEXT:    v_min_i32_e32 v0, s6, v1
5933 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5934 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5935 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5936 ; GCN1-NEXT:    buffer_wbinvl1_vol
5937 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5938 ; GCN1-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5939 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5940 ; GCN1-NEXT:    s_cbranch_execnz .LBB101_1
5941 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
5942 ; GCN1-NEXT:    s_or_b64 exec, exec, s[34:35]
5943 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
5945 ; GCN2-LABEL: flat_atomic_min_i32_ret_scalar:
5946 ; GCN2:       ; %bb.0:
5947 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5948 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
5949 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
5950 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
5951 ; GCN2-NEXT:    s_mov_b64 s[34:35], 0
5952 ; GCN2-NEXT:  .LBB101_1: ; %atomicrmw.start
5953 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
5954 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5955 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
5956 ; GCN2-NEXT:    v_mov_b32_e32 v2, s4
5957 ; GCN2-NEXT:    v_mov_b32_e32 v3, s5
5958 ; GCN2-NEXT:    v_min_i32_e32 v0, s6, v1
5959 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5960 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5961 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5962 ; GCN2-NEXT:    buffer_wbinvl1_vol
5963 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5964 ; GCN2-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5965 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5966 ; GCN2-NEXT:    s_cbranch_execnz .LBB101_1
5967 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
5968 ; GCN2-NEXT:    s_or_b64 exec, exec, s[34:35]
5969 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
5971 ; GCN3-LABEL: flat_atomic_min_i32_ret_scalar:
5972 ; GCN3:       ; %bb.0:
5973 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
5974 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
5975 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
5976 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
5977 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
5978 ; GCN3-NEXT:  .LBB101_1: ; %atomicrmw.start
5979 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
5980 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5981 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
5982 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
5983 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
5984 ; GCN3-NEXT:    v_min_i32_e32 v0, s6, v1
5985 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5986 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
5987 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5988 ; GCN3-NEXT:    buffer_wbinvl1_vol
5989 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
5990 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
5991 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
5992 ; GCN3-NEXT:    s_cbranch_execnz .LBB101_1
5993 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
5994 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
5995 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
5996   %result = atomicrmw min ptr %ptr, i32 %in seq_cst
5997   ret i32 %result
6000 define amdgpu_gfx i32 @flat_atomic_min_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
6001 ; GCN1-LABEL: flat_atomic_min_i32_ret_offset_scalar:
6002 ; GCN1:       ; %bb.0:
6003 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6004 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
6005 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
6006 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
6007 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
6008 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
6009 ; GCN1-NEXT:    s_mov_b64 s[36:37], 0
6010 ; GCN1-NEXT:  .LBB102_1: ; %atomicrmw.start
6011 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
6012 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6013 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
6014 ; GCN1-NEXT:    v_mov_b32_e32 v2, s34
6015 ; GCN1-NEXT:    v_mov_b32_e32 v3, s35
6016 ; GCN1-NEXT:    v_min_i32_e32 v0, s6, v1
6017 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6018 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6019 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6020 ; GCN1-NEXT:    buffer_wbinvl1_vol
6021 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6022 ; GCN1-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
6023 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[36:37]
6024 ; GCN1-NEXT:    s_cbranch_execnz .LBB102_1
6025 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
6026 ; GCN1-NEXT:    s_or_b64 exec, exec, s[36:37]
6027 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6029 ; GCN2-LABEL: flat_atomic_min_i32_ret_offset_scalar:
6030 ; GCN2:       ; %bb.0:
6031 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6032 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
6033 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
6034 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
6035 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
6036 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
6037 ; GCN2-NEXT:    s_mov_b64 s[36:37], 0
6038 ; GCN2-NEXT:  .LBB102_1: ; %atomicrmw.start
6039 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
6040 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6041 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
6042 ; GCN2-NEXT:    v_mov_b32_e32 v2, s34
6043 ; GCN2-NEXT:    v_mov_b32_e32 v3, s35
6044 ; GCN2-NEXT:    v_min_i32_e32 v0, s6, v1
6045 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6046 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6047 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6048 ; GCN2-NEXT:    buffer_wbinvl1_vol
6049 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6050 ; GCN2-NEXT:    s_or_b64 s[36:37], vcc, s[36:37]
6051 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[36:37]
6052 ; GCN2-NEXT:    s_cbranch_execnz .LBB102_1
6053 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
6054 ; GCN2-NEXT:    s_or_b64 exec, exec, s[36:37]
6055 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6057 ; GCN3-LABEL: flat_atomic_min_i32_ret_offset_scalar:
6058 ; GCN3:       ; %bb.0:
6059 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6060 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6061 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6062 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
6063 ; GCN3-NEXT:    s_mov_b64 s[34:35], 0
6064 ; GCN3-NEXT:  .LBB102_1: ; %atomicrmw.start
6065 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
6066 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6067 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
6068 ; GCN3-NEXT:    v_mov_b32_e32 v2, s4
6069 ; GCN3-NEXT:    v_mov_b32_e32 v3, s5
6070 ; GCN3-NEXT:    v_min_i32_e32 v0, s6, v1
6071 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6072 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
6073 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6074 ; GCN3-NEXT:    buffer_wbinvl1_vol
6075 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6076 ; GCN3-NEXT:    s_or_b64 s[34:35], vcc, s[34:35]
6077 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[34:35]
6078 ; GCN3-NEXT:    s_cbranch_execnz .LBB102_1
6079 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
6080 ; GCN3-NEXT:    s_or_b64 exec, exec, s[34:35]
6081 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6082   %gep = getelementptr i32, ptr %out, i32 4
6083   %result = atomicrmw min ptr %gep, i32 %in seq_cst
6084   ret i32 %result
6087 define amdgpu_kernel void @atomic_min_i32_addr64_offset(ptr %out, i32 %in, i32 %index) {
6088 ; GCN1-LABEL: atomic_min_i32_addr64_offset:
6089 ; GCN1:       ; %bb.0: ; %entry
6090 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6091 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
6092 ; GCN1-NEXT:    s_ashr_i32 s5, s3, 31
6093 ; GCN1-NEXT:    s_mov_b32 s4, s3
6094 ; GCN1-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
6095 ; GCN1-NEXT:    s_add_u32 s0, s0, s4
6096 ; GCN1-NEXT:    s_addc_u32 s1, s1, s5
6097 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
6098 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
6099 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
6100 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
6101 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
6102 ; GCN1-NEXT:    s_mov_b64 s[4:5], 0
6103 ; GCN1-NEXT:  .LBB103_1: ; %atomicrmw.start
6104 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
6105 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
6106 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6107 ; GCN1-NEXT:    v_min_i32_e32 v0, s2, v1
6108 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
6109 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6110 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6111 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6112 ; GCN1-NEXT:    buffer_wbinvl1_vol
6113 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6114 ; GCN1-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6115 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
6116 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6117 ; GCN1-NEXT:    s_cbranch_execnz .LBB103_1
6118 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
6119 ; GCN1-NEXT:    s_endpgm
6121 ; GCN2-LABEL: atomic_min_i32_addr64_offset:
6122 ; GCN2:       ; %bb.0: ; %entry
6123 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6124 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
6125 ; GCN2-NEXT:    s_ashr_i32 s5, s3, 31
6126 ; GCN2-NEXT:    s_mov_b32 s4, s3
6127 ; GCN2-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
6128 ; GCN2-NEXT:    s_add_u32 s0, s0, s4
6129 ; GCN2-NEXT:    s_addc_u32 s1, s1, s5
6130 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
6131 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
6132 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
6133 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
6134 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
6135 ; GCN2-NEXT:    s_mov_b64 s[4:5], 0
6136 ; GCN2-NEXT:  .LBB103_1: ; %atomicrmw.start
6137 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
6138 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
6139 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6140 ; GCN2-NEXT:    v_min_i32_e32 v0, s2, v1
6141 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
6142 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6143 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6144 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6145 ; GCN2-NEXT:    buffer_wbinvl1_vol
6146 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6147 ; GCN2-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6148 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
6149 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6150 ; GCN2-NEXT:    s_cbranch_execnz .LBB103_1
6151 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
6152 ; GCN2-NEXT:    s_endpgm
6154 ; GCN3-LABEL: atomic_min_i32_addr64_offset:
6155 ; GCN3:       ; %bb.0: ; %entry
6156 ; GCN3-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6157 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
6158 ; GCN3-NEXT:    s_ashr_i32 s5, s3, 31
6159 ; GCN3-NEXT:    s_mov_b32 s4, s3
6160 ; GCN3-NEXT:    s_lshl_b64 s[4:5], s[4:5], 2
6161 ; GCN3-NEXT:    s_add_u32 s0, s0, s4
6162 ; GCN3-NEXT:    s_addc_u32 s1, s1, s5
6163 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
6164 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
6165 ; GCN3-NEXT:    flat_load_dword v1, v[0:1] offset:16
6166 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
6167 ; GCN3-NEXT:  .LBB103_1: ; %atomicrmw.start
6168 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
6169 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
6170 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6171 ; GCN3-NEXT:    v_min_i32_e32 v0, s2, v1
6172 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
6173 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6174 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
6175 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6176 ; GCN3-NEXT:    buffer_wbinvl1_vol
6177 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6178 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6179 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
6180 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6181 ; GCN3-NEXT:    s_cbranch_execnz .LBB103_1
6182 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
6183 ; GCN3-NEXT:    s_endpgm
6184 entry:
6185   %ptr = getelementptr i32, ptr %out, i32 %index
6186   %gep = getelementptr i32, ptr %ptr, i32 4
6187   %tmp0 = atomicrmw min ptr %gep, i32 %in seq_cst
6188   ret void
6191 define amdgpu_kernel void @atomic_min_i32_ret_addr64_offset(ptr %out, ptr %out2, i32 %in, i32 %index) {
6192 ; GCN1-LABEL: atomic_min_i32_ret_addr64_offset:
6193 ; GCN1:       ; %bb.0: ; %entry
6194 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
6195 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6196 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
6197 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
6198 ; GCN1-NEXT:    s_mov_b32 s6, s5
6199 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6200 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
6201 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
6202 ; GCN1-NEXT:    s_add_u32 s0, s0, 16
6203 ; GCN1-NEXT:    s_addc_u32 s1, s1, 0
6204 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
6205 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
6206 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
6207 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
6208 ; GCN1-NEXT:  .LBB104_1: ; %atomicrmw.start
6209 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
6210 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6211 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
6212 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
6213 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
6214 ; GCN1-NEXT:    v_min_i32_e32 v0, s4, v1
6215 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6216 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6217 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6218 ; GCN1-NEXT:    buffer_wbinvl1_vol
6219 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6220 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6221 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6222 ; GCN1-NEXT:    s_cbranch_execnz .LBB104_1
6223 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
6224 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
6225 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
6226 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
6227 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
6228 ; GCN1-NEXT:    s_endpgm
6230 ; GCN2-LABEL: atomic_min_i32_ret_addr64_offset:
6231 ; GCN2:       ; %bb.0: ; %entry
6232 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
6233 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6234 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
6235 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
6236 ; GCN2-NEXT:    s_mov_b32 s6, s5
6237 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6238 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
6239 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
6240 ; GCN2-NEXT:    s_add_u32 s0, s0, 16
6241 ; GCN2-NEXT:    s_addc_u32 s1, s1, 0
6242 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
6243 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
6244 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
6245 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
6246 ; GCN2-NEXT:  .LBB104_1: ; %atomicrmw.start
6247 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
6248 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6249 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
6250 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
6251 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
6252 ; GCN2-NEXT:    v_min_i32_e32 v0, s4, v1
6253 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6254 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6255 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6256 ; GCN2-NEXT:    buffer_wbinvl1_vol
6257 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6258 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6259 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6260 ; GCN2-NEXT:    s_cbranch_execnz .LBB104_1
6261 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
6262 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
6263 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
6264 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
6265 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
6266 ; GCN2-NEXT:    s_endpgm
6268 ; GCN3-LABEL: atomic_min_i32_ret_addr64_offset:
6269 ; GCN3:       ; %bb.0: ; %entry
6270 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
6271 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6272 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
6273 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
6274 ; GCN3-NEXT:    s_mov_b32 s0, s3
6275 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
6276 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
6277 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
6278 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
6279 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
6280 ; GCN3-NEXT:    flat_load_dword v0, v[0:1] offset:16
6281 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
6282 ; GCN3-NEXT:  .LBB104_1: ; %atomicrmw.start
6283 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
6284 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6285 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
6286 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
6287 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
6288 ; GCN3-NEXT:    v_min_i32_e32 v0, s2, v1
6289 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6290 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] offset:16 glc
6291 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6292 ; GCN3-NEXT:    buffer_wbinvl1_vol
6293 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6294 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6295 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6296 ; GCN3-NEXT:    s_cbranch_execnz .LBB104_1
6297 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
6298 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
6299 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
6300 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
6301 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
6302 ; GCN3-NEXT:    s_endpgm
6303 entry:
6304   %ptr = getelementptr i32, ptr %out, i32 %index
6305   %gep = getelementptr i32, ptr %ptr, i32 4
6306   %tmp0 = atomicrmw min ptr %gep, i32 %in seq_cst
6307   store i32 %tmp0, ptr %out2
6308   ret void
6311 define amdgpu_kernel void @atomic_min_i32(ptr %out, i32 %in) {
6312 ; GCN1-LABEL: atomic_min_i32:
6313 ; GCN1:       ; %bb.0: ; %entry
6314 ; GCN1-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x9
6315 ; GCN1-NEXT:    s_load_dword s4, s[0:1], 0xb
6316 ; GCN1-NEXT:    s_mov_b64 s[0:1], 0
6317 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
6318 ; GCN1-NEXT:    v_mov_b32_e32 v0, s2
6319 ; GCN1-NEXT:    v_mov_b32_e32 v1, s3
6320 ; GCN1-NEXT:    flat_load_dword v1, v[0:1]
6321 ; GCN1-NEXT:  .LBB105_1: ; %atomicrmw.start
6322 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
6323 ; GCN1-NEXT:    v_mov_b32_e32 v2, s2
6324 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6325 ; GCN1-NEXT:    v_min_i32_e32 v0, s4, v1
6326 ; GCN1-NEXT:    v_mov_b32_e32 v3, s3
6327 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6328 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6329 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6330 ; GCN1-NEXT:    buffer_wbinvl1_vol
6331 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6332 ; GCN1-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
6333 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
6334 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[0:1]
6335 ; GCN1-NEXT:    s_cbranch_execnz .LBB105_1
6336 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
6337 ; GCN1-NEXT:    s_endpgm
6339 ; GCN2-LABEL: atomic_min_i32:
6340 ; GCN2:       ; %bb.0: ; %entry
6341 ; GCN2-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6342 ; GCN2-NEXT:    s_load_dword s4, s[0:1], 0x2c
6343 ; GCN2-NEXT:    s_mov_b64 s[0:1], 0
6344 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
6345 ; GCN2-NEXT:    v_mov_b32_e32 v0, s2
6346 ; GCN2-NEXT:    v_mov_b32_e32 v1, s3
6347 ; GCN2-NEXT:    flat_load_dword v1, v[0:1]
6348 ; GCN2-NEXT:  .LBB105_1: ; %atomicrmw.start
6349 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
6350 ; GCN2-NEXT:    v_mov_b32_e32 v2, s2
6351 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6352 ; GCN2-NEXT:    v_min_i32_e32 v0, s4, v1
6353 ; GCN2-NEXT:    v_mov_b32_e32 v3, s3
6354 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6355 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6356 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6357 ; GCN2-NEXT:    buffer_wbinvl1_vol
6358 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6359 ; GCN2-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
6360 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
6361 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[0:1]
6362 ; GCN2-NEXT:    s_cbranch_execnz .LBB105_1
6363 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
6364 ; GCN2-NEXT:    s_endpgm
6366 ; GCN3-LABEL: atomic_min_i32:
6367 ; GCN3:       ; %bb.0: ; %entry
6368 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
6369 ; GCN3-NEXT:    s_load_dword s4, s[0:1], 0x2c
6370 ; GCN3-NEXT:    s_mov_b64 s[0:1], 0
6371 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
6372 ; GCN3-NEXT:    v_mov_b32_e32 v0, s2
6373 ; GCN3-NEXT:    v_mov_b32_e32 v1, s3
6374 ; GCN3-NEXT:    flat_load_dword v1, v[0:1]
6375 ; GCN3-NEXT:  .LBB105_1: ; %atomicrmw.start
6376 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
6377 ; GCN3-NEXT:    v_mov_b32_e32 v2, s2
6378 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6379 ; GCN3-NEXT:    v_min_i32_e32 v0, s4, v1
6380 ; GCN3-NEXT:    v_mov_b32_e32 v3, s3
6381 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6382 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6383 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6384 ; GCN3-NEXT:    buffer_wbinvl1_vol
6385 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6386 ; GCN3-NEXT:    s_or_b64 s[0:1], vcc, s[0:1]
6387 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
6388 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[0:1]
6389 ; GCN3-NEXT:    s_cbranch_execnz .LBB105_1
6390 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
6391 ; GCN3-NEXT:    s_endpgm
6392 entry:
6393   %tmp0 = atomicrmw min ptr %out, i32 %in seq_cst
6394   ret void
6397 define amdgpu_kernel void @atomic_min_i32_ret_addr64(ptr %out, ptr %out2, i32 %in, i32 %index) {
6398 ; GCN1-LABEL: atomic_min_i32_ret_addr64:
6399 ; GCN1:       ; %bb.0: ; %entry
6400 ; GCN1-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0xd
6401 ; GCN1-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
6402 ; GCN1-NEXT:    s_waitcnt lgkmcnt(0)
6403 ; GCN1-NEXT:    s_ashr_i32 s7, s5, 31
6404 ; GCN1-NEXT:    s_mov_b32 s6, s5
6405 ; GCN1-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6406 ; GCN1-NEXT:    s_add_u32 s0, s0, s6
6407 ; GCN1-NEXT:    s_addc_u32 s1, s1, s7
6408 ; GCN1-NEXT:    v_mov_b32_e32 v0, s0
6409 ; GCN1-NEXT:    v_mov_b32_e32 v1, s1
6410 ; GCN1-NEXT:    flat_load_dword v0, v[0:1]
6411 ; GCN1-NEXT:    s_mov_b64 s[6:7], 0
6412 ; GCN1-NEXT:  .LBB106_1: ; %atomicrmw.start
6413 ; GCN1-NEXT:    ; =>This Inner Loop Header: Depth=1
6414 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6415 ; GCN1-NEXT:    v_mov_b32_e32 v1, v0
6416 ; GCN1-NEXT:    v_mov_b32_e32 v3, s1
6417 ; GCN1-NEXT:    v_mov_b32_e32 v2, s0
6418 ; GCN1-NEXT:    v_min_i32_e32 v0, s4, v1
6419 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6420 ; GCN1-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6421 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6422 ; GCN1-NEXT:    buffer_wbinvl1_vol
6423 ; GCN1-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6424 ; GCN1-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6425 ; GCN1-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6426 ; GCN1-NEXT:    s_cbranch_execnz .LBB106_1
6427 ; GCN1-NEXT:  ; %bb.2: ; %atomicrmw.end
6428 ; GCN1-NEXT:    s_or_b64 exec, exec, s[6:7]
6429 ; GCN1-NEXT:    v_mov_b32_e32 v1, s2
6430 ; GCN1-NEXT:    v_mov_b32_e32 v2, s3
6431 ; GCN1-NEXT:    flat_store_dword v[1:2], v0
6432 ; GCN1-NEXT:    s_endpgm
6434 ; GCN2-LABEL: atomic_min_i32_ret_addr64:
6435 ; GCN2:       ; %bb.0: ; %entry
6436 ; GCN2-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x34
6437 ; GCN2-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
6438 ; GCN2-NEXT:    s_waitcnt lgkmcnt(0)
6439 ; GCN2-NEXT:    s_ashr_i32 s7, s5, 31
6440 ; GCN2-NEXT:    s_mov_b32 s6, s5
6441 ; GCN2-NEXT:    s_lshl_b64 s[6:7], s[6:7], 2
6442 ; GCN2-NEXT:    s_add_u32 s0, s0, s6
6443 ; GCN2-NEXT:    s_addc_u32 s1, s1, s7
6444 ; GCN2-NEXT:    v_mov_b32_e32 v0, s0
6445 ; GCN2-NEXT:    v_mov_b32_e32 v1, s1
6446 ; GCN2-NEXT:    flat_load_dword v0, v[0:1]
6447 ; GCN2-NEXT:    s_mov_b64 s[6:7], 0
6448 ; GCN2-NEXT:  .LBB106_1: ; %atomicrmw.start
6449 ; GCN2-NEXT:    ; =>This Inner Loop Header: Depth=1
6450 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6451 ; GCN2-NEXT:    v_mov_b32_e32 v1, v0
6452 ; GCN2-NEXT:    v_mov_b32_e32 v3, s1
6453 ; GCN2-NEXT:    v_mov_b32_e32 v2, s0
6454 ; GCN2-NEXT:    v_min_i32_e32 v0, s4, v1
6455 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6456 ; GCN2-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6457 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6458 ; GCN2-NEXT:    buffer_wbinvl1_vol
6459 ; GCN2-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6460 ; GCN2-NEXT:    s_or_b64 s[6:7], vcc, s[6:7]
6461 ; GCN2-NEXT:    s_andn2_b64 exec, exec, s[6:7]
6462 ; GCN2-NEXT:    s_cbranch_execnz .LBB106_1
6463 ; GCN2-NEXT:  ; %bb.2: ; %atomicrmw.end
6464 ; GCN2-NEXT:    s_or_b64 exec, exec, s[6:7]
6465 ; GCN2-NEXT:    v_mov_b32_e32 v1, s2
6466 ; GCN2-NEXT:    v_mov_b32_e32 v2, s3
6467 ; GCN2-NEXT:    flat_store_dword v[1:2], v0
6468 ; GCN2-NEXT:    s_endpgm
6470 ; GCN3-LABEL: atomic_min_i32_ret_addr64:
6471 ; GCN3:       ; %bb.0: ; %entry
6472 ; GCN3-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x34
6473 ; GCN3-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
6474 ; GCN3-NEXT:    s_waitcnt lgkmcnt(0)
6475 ; GCN3-NEXT:    s_ashr_i32 s1, s3, 31
6476 ; GCN3-NEXT:    s_mov_b32 s0, s3
6477 ; GCN3-NEXT:    s_lshl_b64 s[0:1], s[0:1], 2
6478 ; GCN3-NEXT:    s_add_u32 s0, s4, s0
6479 ; GCN3-NEXT:    s_addc_u32 s1, s5, s1
6480 ; GCN3-NEXT:    v_mov_b32_e32 v0, s0
6481 ; GCN3-NEXT:    v_mov_b32_e32 v1, s1
6482 ; GCN3-NEXT:    flat_load_dword v0, v[0:1]
6483 ; GCN3-NEXT:    s_mov_b64 s[4:5], 0
6484 ; GCN3-NEXT:  .LBB106_1: ; %atomicrmw.start
6485 ; GCN3-NEXT:    ; =>This Inner Loop Header: Depth=1
6486 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6487 ; GCN3-NEXT:    v_mov_b32_e32 v1, v0
6488 ; GCN3-NEXT:    v_mov_b32_e32 v3, s1
6489 ; GCN3-NEXT:    v_mov_b32_e32 v2, s0
6490 ; GCN3-NEXT:    v_min_i32_e32 v0, s2, v1
6491 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6492 ; GCN3-NEXT:    flat_atomic_cmpswap v0, v[2:3], v[0:1] glc
6493 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6494 ; GCN3-NEXT:    buffer_wbinvl1_vol
6495 ; GCN3-NEXT:    v_cmp_eq_u32_e32 vcc, v0, v1
6496 ; GCN3-NEXT:    s_or_b64 s[4:5], vcc, s[4:5]
6497 ; GCN3-NEXT:    s_andn2_b64 exec, exec, s[4:5]
6498 ; GCN3-NEXT:    s_cbranch_execnz .LBB106_1
6499 ; GCN3-NEXT:  ; %bb.2: ; %atomicrmw.end
6500 ; GCN3-NEXT:    s_or_b64 exec, exec, s[4:5]
6501 ; GCN3-NEXT:    v_mov_b32_e32 v1, s6
6502 ; GCN3-NEXT:    v_mov_b32_e32 v2, s7
6503 ; GCN3-NEXT:    flat_store_dword v[1:2], v0
6504 ; GCN3-NEXT:    s_endpgm
6505 entry:
6506   %ptr = getelementptr i32, ptr %out, i32 %index
6507   %tmp0 = atomicrmw min ptr %ptr, i32 %in seq_cst
6508   store i32 %tmp0, ptr %out2
6509   ret void
6512 ; ---------------------------------------------------------------------
6513 ; atomicrmw uinc_wrap
6514 ; ---------------------------------------------------------------------
6516 define void @flat_atomic_uinc_wrap_i32_noret(ptr %ptr, i32 %in) {
6517 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_noret:
6518 ; GCN1:       ; %bb.0:
6519 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6520 ; GCN1-NEXT:    flat_atomic_inc v[0:1], v2
6521 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6522 ; GCN1-NEXT:    buffer_wbinvl1_vol
6523 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6525 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_noret:
6526 ; GCN2:       ; %bb.0:
6527 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6528 ; GCN2-NEXT:    flat_atomic_inc v[0:1], v2
6529 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6530 ; GCN2-NEXT:    buffer_wbinvl1_vol
6531 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6533 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_noret:
6534 ; GCN3:       ; %bb.0:
6535 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6536 ; GCN3-NEXT:    flat_atomic_inc v[0:1], v2
6537 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6538 ; GCN3-NEXT:    buffer_wbinvl1_vol
6539 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6540   %tmp0 = atomicrmw uinc_wrap ptr %ptr, i32 %in seq_cst
6541   ret void
6544 define void @flat_atomic_uinc_wrap_i32_noret_offset(ptr %out, i32 %in) {
6545 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_noret_offset:
6546 ; GCN1:       ; %bb.0:
6547 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6548 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
6549 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6550 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6551 ; GCN1-NEXT:    flat_atomic_inc v[0:1], v2
6552 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6553 ; GCN1-NEXT:    buffer_wbinvl1_vol
6554 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6556 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_noret_offset:
6557 ; GCN2:       ; %bb.0:
6558 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6559 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
6560 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6561 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6562 ; GCN2-NEXT:    flat_atomic_inc v[0:1], v2
6563 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6564 ; GCN2-NEXT:    buffer_wbinvl1_vol
6565 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6567 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_noret_offset:
6568 ; GCN3:       ; %bb.0:
6569 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6570 ; GCN3-NEXT:    flat_atomic_inc v[0:1], v2 offset:16
6571 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6572 ; GCN3-NEXT:    buffer_wbinvl1_vol
6573 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6574   %gep = getelementptr i32, ptr %out, i32 4
6575   %tmp0 = atomicrmw uinc_wrap ptr %gep, i32 %in seq_cst
6576   ret void
6579 define i32 @flat_atomic_uinc_wrap_i32_ret(ptr %ptr, i32 %in) {
6580 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_ret:
6581 ; GCN1:       ; %bb.0:
6582 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6583 ; GCN1-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6584 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6585 ; GCN1-NEXT:    buffer_wbinvl1_vol
6586 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6588 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_ret:
6589 ; GCN2:       ; %bb.0:
6590 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6591 ; GCN2-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6592 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6593 ; GCN2-NEXT:    buffer_wbinvl1_vol
6594 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6596 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_ret:
6597 ; GCN3:       ; %bb.0:
6598 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6599 ; GCN3-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6600 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6601 ; GCN3-NEXT:    buffer_wbinvl1_vol
6602 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6603   %result = atomicrmw uinc_wrap ptr %ptr, i32 %in seq_cst
6604   ret i32 %result
6607 define i32 @flat_atomic_uinc_wrap_i32_ret_offset(ptr %out, i32 %in) {
6608 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_ret_offset:
6609 ; GCN1:       ; %bb.0:
6610 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6611 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
6612 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6613 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6614 ; GCN1-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6615 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6616 ; GCN1-NEXT:    buffer_wbinvl1_vol
6617 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6619 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_ret_offset:
6620 ; GCN2:       ; %bb.0:
6621 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6622 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
6623 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6624 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6625 ; GCN2-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6626 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6627 ; GCN2-NEXT:    buffer_wbinvl1_vol
6628 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6630 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_ret_offset:
6631 ; GCN3:       ; %bb.0:
6632 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6633 ; GCN3-NEXT:    flat_atomic_inc v0, v[0:1], v2 offset:16 glc
6634 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6635 ; GCN3-NEXT:    buffer_wbinvl1_vol
6636 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6637   %gep = getelementptr i32, ptr %out, i32 4
6638   %result = atomicrmw uinc_wrap ptr %gep, i32 %in seq_cst
6639   ret i32 %result
6642 define amdgpu_gfx void @flat_atomic_uinc_wrap_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
6643 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_noret_scalar:
6644 ; GCN1:       ; %bb.0:
6645 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6646 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
6647 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
6648 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6649 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6650 ; GCN1-NEXT:    flat_atomic_inc v[0:1], v2
6651 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6652 ; GCN1-NEXT:    buffer_wbinvl1_vol
6653 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6655 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_noret_scalar:
6656 ; GCN2:       ; %bb.0:
6657 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6658 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
6659 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
6660 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
6661 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6662 ; GCN2-NEXT:    flat_atomic_inc v[0:1], v2
6663 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6664 ; GCN2-NEXT:    buffer_wbinvl1_vol
6665 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6667 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_noret_scalar:
6668 ; GCN3:       ; %bb.0:
6669 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6670 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6671 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6672 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
6673 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6674 ; GCN3-NEXT:    flat_atomic_inc v[0:1], v2
6675 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6676 ; GCN3-NEXT:    buffer_wbinvl1_vol
6677 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6678   %tmp0 = atomicrmw uinc_wrap ptr %ptr, i32 %in seq_cst
6679   ret void
6682 define amdgpu_gfx void @flat_atomic_uinc_wrap_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
6683 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_noret_offset_scalar:
6684 ; GCN1:       ; %bb.0:
6685 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6686 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
6687 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
6688 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
6689 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
6690 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6691 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6692 ; GCN1-NEXT:    flat_atomic_inc v[0:1], v2
6693 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6694 ; GCN1-NEXT:    buffer_wbinvl1_vol
6695 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6697 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_noret_offset_scalar:
6698 ; GCN2:       ; %bb.0:
6699 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6700 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
6701 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
6702 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
6703 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
6704 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
6705 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6706 ; GCN2-NEXT:    flat_atomic_inc v[0:1], v2
6707 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6708 ; GCN2-NEXT:    buffer_wbinvl1_vol
6709 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6711 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_noret_offset_scalar:
6712 ; GCN3:       ; %bb.0:
6713 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6714 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6715 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6716 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
6717 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6718 ; GCN3-NEXT:    flat_atomic_inc v[0:1], v2 offset:16
6719 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6720 ; GCN3-NEXT:    buffer_wbinvl1_vol
6721 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6722   %gep = getelementptr i32, ptr %out, i32 4
6723   %tmp0 = atomicrmw uinc_wrap ptr %gep, i32 %in seq_cst
6724   ret void
6727 define amdgpu_gfx i32 @flat_atomic_uinc_wrap_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
6728 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_ret_scalar:
6729 ; GCN1:       ; %bb.0:
6730 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6731 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
6732 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
6733 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6734 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6735 ; GCN1-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6736 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6737 ; GCN1-NEXT:    buffer_wbinvl1_vol
6738 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6740 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_ret_scalar:
6741 ; GCN2:       ; %bb.0:
6742 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6743 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
6744 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
6745 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
6746 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6747 ; GCN2-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6748 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6749 ; GCN2-NEXT:    buffer_wbinvl1_vol
6750 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6752 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_ret_scalar:
6753 ; GCN3:       ; %bb.0:
6754 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6755 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6756 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6757 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
6758 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6759 ; GCN3-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6760 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6761 ; GCN3-NEXT:    buffer_wbinvl1_vol
6762 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6763   %result = atomicrmw uinc_wrap ptr %ptr, i32 %in seq_cst
6764   ret i32 %result
6767 define amdgpu_gfx i32 @flat_atomic_uinc_wrap_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
6768 ; GCN1-LABEL: flat_atomic_uinc_wrap_i32_ret_offset_scalar:
6769 ; GCN1:       ; %bb.0:
6770 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6771 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
6772 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
6773 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
6774 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
6775 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6776 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6777 ; GCN1-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6778 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6779 ; GCN1-NEXT:    buffer_wbinvl1_vol
6780 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6782 ; GCN2-LABEL: flat_atomic_uinc_wrap_i32_ret_offset_scalar:
6783 ; GCN2:       ; %bb.0:
6784 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6785 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
6786 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
6787 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
6788 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
6789 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
6790 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6791 ; GCN2-NEXT:    flat_atomic_inc v0, v[0:1], v2 glc
6792 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6793 ; GCN2-NEXT:    buffer_wbinvl1_vol
6794 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6796 ; GCN3-LABEL: flat_atomic_uinc_wrap_i32_ret_offset_scalar:
6797 ; GCN3:       ; %bb.0:
6798 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6799 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6800 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6801 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
6802 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6803 ; GCN3-NEXT:    flat_atomic_inc v0, v[0:1], v2 offset:16 glc
6804 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6805 ; GCN3-NEXT:    buffer_wbinvl1_vol
6806 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6807   %gep = getelementptr i32, ptr %out, i32 4
6808   %result = atomicrmw uinc_wrap ptr %gep, i32 %in seq_cst
6809   ret i32 %result
6812 ; ---------------------------------------------------------------------
6813 ; atomicrmw udec_wrap
6814 ; ---------------------------------------------------------------------
6816 define void @flat_atomic_udec_wrap_i32_noret(ptr %ptr, i32 %in) {
6817 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_noret:
6818 ; GCN1:       ; %bb.0:
6819 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6820 ; GCN1-NEXT:    flat_atomic_dec v[0:1], v2
6821 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6822 ; GCN1-NEXT:    buffer_wbinvl1_vol
6823 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6825 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_noret:
6826 ; GCN2:       ; %bb.0:
6827 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6828 ; GCN2-NEXT:    flat_atomic_dec v[0:1], v2
6829 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6830 ; GCN2-NEXT:    buffer_wbinvl1_vol
6831 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6833 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_noret:
6834 ; GCN3:       ; %bb.0:
6835 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6836 ; GCN3-NEXT:    flat_atomic_dec v[0:1], v2
6837 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6838 ; GCN3-NEXT:    buffer_wbinvl1_vol
6839 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6840   %tmp0 = atomicrmw udec_wrap ptr %ptr, i32 %in seq_cst
6841   ret void
6844 define void @flat_atomic_udec_wrap_i32_noret_offset(ptr %out, i32 %in) {
6845 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_noret_offset:
6846 ; GCN1:       ; %bb.0:
6847 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6848 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
6849 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6850 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6851 ; GCN1-NEXT:    flat_atomic_dec v[0:1], v2
6852 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6853 ; GCN1-NEXT:    buffer_wbinvl1_vol
6854 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6856 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_noret_offset:
6857 ; GCN2:       ; %bb.0:
6858 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6859 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
6860 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6861 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6862 ; GCN2-NEXT:    flat_atomic_dec v[0:1], v2
6863 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6864 ; GCN2-NEXT:    buffer_wbinvl1_vol
6865 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6867 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_noret_offset:
6868 ; GCN3:       ; %bb.0:
6869 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6870 ; GCN3-NEXT:    flat_atomic_dec v[0:1], v2 offset:16
6871 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6872 ; GCN3-NEXT:    buffer_wbinvl1_vol
6873 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6874   %gep = getelementptr i32, ptr %out, i32 4
6875   %tmp0 = atomicrmw udec_wrap ptr %gep, i32 %in seq_cst
6876   ret void
6879 define i32 @flat_atomic_udec_wrap_i32_ret(ptr %ptr, i32 %in) {
6880 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_ret:
6881 ; GCN1:       ; %bb.0:
6882 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6883 ; GCN1-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
6884 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6885 ; GCN1-NEXT:    buffer_wbinvl1_vol
6886 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6888 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_ret:
6889 ; GCN2:       ; %bb.0:
6890 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6891 ; GCN2-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
6892 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6893 ; GCN2-NEXT:    buffer_wbinvl1_vol
6894 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6896 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_ret:
6897 ; GCN3:       ; %bb.0:
6898 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6899 ; GCN3-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
6900 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6901 ; GCN3-NEXT:    buffer_wbinvl1_vol
6902 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6903   %result = atomicrmw udec_wrap ptr %ptr, i32 %in seq_cst
6904   ret i32 %result
6907 define i32 @flat_atomic_udec_wrap_i32_ret_offset(ptr %out, i32 %in) {
6908 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_ret_offset:
6909 ; GCN1:       ; %bb.0:
6910 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6911 ; GCN1-NEXT:    v_add_i32_e32 v0, vcc, 16, v0
6912 ; GCN1-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6913 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6914 ; GCN1-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
6915 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6916 ; GCN1-NEXT:    buffer_wbinvl1_vol
6917 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6919 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_ret_offset:
6920 ; GCN2:       ; %bb.0:
6921 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6922 ; GCN2-NEXT:    v_add_u32_e32 v0, vcc, 16, v0
6923 ; GCN2-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
6924 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6925 ; GCN2-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
6926 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6927 ; GCN2-NEXT:    buffer_wbinvl1_vol
6928 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6930 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_ret_offset:
6931 ; GCN3:       ; %bb.0:
6932 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6933 ; GCN3-NEXT:    flat_atomic_dec v0, v[0:1], v2 offset:16 glc
6934 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6935 ; GCN3-NEXT:    buffer_wbinvl1_vol
6936 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6937   %gep = getelementptr i32, ptr %out, i32 4
6938   %result = atomicrmw udec_wrap ptr %gep, i32 %in seq_cst
6939   ret i32 %result
6942 define amdgpu_gfx void @flat_atomic_udec_wrap_i32_noret_scalar(ptr inreg %ptr, i32 inreg %in) {
6943 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_noret_scalar:
6944 ; GCN1:       ; %bb.0:
6945 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6946 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
6947 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
6948 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6949 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6950 ; GCN1-NEXT:    flat_atomic_dec v[0:1], v2
6951 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6952 ; GCN1-NEXT:    buffer_wbinvl1_vol
6953 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6955 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_noret_scalar:
6956 ; GCN2:       ; %bb.0:
6957 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6958 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
6959 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
6960 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
6961 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6962 ; GCN2-NEXT:    flat_atomic_dec v[0:1], v2
6963 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6964 ; GCN2-NEXT:    buffer_wbinvl1_vol
6965 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
6967 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_noret_scalar:
6968 ; GCN3:       ; %bb.0:
6969 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6970 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
6971 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
6972 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
6973 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6974 ; GCN3-NEXT:    flat_atomic_dec v[0:1], v2
6975 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6976 ; GCN3-NEXT:    buffer_wbinvl1_vol
6977 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
6978   %tmp0 = atomicrmw udec_wrap ptr %ptr, i32 %in seq_cst
6979   ret void
6982 define amdgpu_gfx void @flat_atomic_udec_wrap_i32_noret_offset_scalar(ptr inreg %out, i32 inreg %in) {
6983 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_noret_offset_scalar:
6984 ; GCN1:       ; %bb.0:
6985 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
6986 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
6987 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
6988 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
6989 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
6990 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
6991 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6992 ; GCN1-NEXT:    flat_atomic_dec v[0:1], v2
6993 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6994 ; GCN1-NEXT:    buffer_wbinvl1_vol
6995 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
6997 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_noret_offset_scalar:
6998 ; GCN2:       ; %bb.0:
6999 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7000 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
7001 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
7002 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
7003 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
7004 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
7005 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7006 ; GCN2-NEXT:    flat_atomic_dec v[0:1], v2
7007 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7008 ; GCN2-NEXT:    buffer_wbinvl1_vol
7009 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
7011 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_noret_offset_scalar:
7012 ; GCN3:       ; %bb.0:
7013 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7014 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
7015 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
7016 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
7017 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7018 ; GCN3-NEXT:    flat_atomic_dec v[0:1], v2 offset:16
7019 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7020 ; GCN3-NEXT:    buffer_wbinvl1_vol
7021 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
7022   %gep = getelementptr i32, ptr %out, i32 4
7023   %tmp0 = atomicrmw udec_wrap ptr %gep, i32 %in seq_cst
7024   ret void
7027 define amdgpu_gfx i32 @flat_atomic_udec_wrap_i32_ret_scalar(ptr inreg %ptr, i32 inreg %in) {
7028 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_ret_scalar:
7029 ; GCN1:       ; %bb.0:
7030 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7031 ; GCN1-NEXT:    v_mov_b32_e32 v0, s4
7032 ; GCN1-NEXT:    v_mov_b32_e32 v1, s5
7033 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
7034 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7035 ; GCN1-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7036 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7037 ; GCN1-NEXT:    buffer_wbinvl1_vol
7038 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
7040 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_ret_scalar:
7041 ; GCN2:       ; %bb.0:
7042 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7043 ; GCN2-NEXT:    v_mov_b32_e32 v0, s4
7044 ; GCN2-NEXT:    v_mov_b32_e32 v1, s5
7045 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
7046 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7047 ; GCN2-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7048 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7049 ; GCN2-NEXT:    buffer_wbinvl1_vol
7050 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
7052 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_ret_scalar:
7053 ; GCN3:       ; %bb.0:
7054 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7055 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
7056 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
7057 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
7058 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7059 ; GCN3-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7060 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7061 ; GCN3-NEXT:    buffer_wbinvl1_vol
7062 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
7063   %result = atomicrmw udec_wrap ptr %ptr, i32 %in seq_cst
7064   ret i32 %result
7067 define amdgpu_gfx i32 @flat_atomic_udec_wrap_i32_ret_offset_scalar(ptr inreg %out, i32 inreg %in) {
7068 ; GCN1-LABEL: flat_atomic_udec_wrap_i32_ret_offset_scalar:
7069 ; GCN1:       ; %bb.0:
7070 ; GCN1-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7071 ; GCN1-NEXT:    s_add_u32 s34, s4, 16
7072 ; GCN1-NEXT:    s_addc_u32 s35, s5, 0
7073 ; GCN1-NEXT:    v_mov_b32_e32 v0, s34
7074 ; GCN1-NEXT:    v_mov_b32_e32 v1, s35
7075 ; GCN1-NEXT:    v_mov_b32_e32 v2, s6
7076 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7077 ; GCN1-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7078 ; GCN1-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7079 ; GCN1-NEXT:    buffer_wbinvl1_vol
7080 ; GCN1-NEXT:    s_setpc_b64 s[30:31]
7082 ; GCN2-LABEL: flat_atomic_udec_wrap_i32_ret_offset_scalar:
7083 ; GCN2:       ; %bb.0:
7084 ; GCN2-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7085 ; GCN2-NEXT:    s_add_u32 s34, s4, 16
7086 ; GCN2-NEXT:    s_addc_u32 s35, s5, 0
7087 ; GCN2-NEXT:    v_mov_b32_e32 v0, s34
7088 ; GCN2-NEXT:    v_mov_b32_e32 v1, s35
7089 ; GCN2-NEXT:    v_mov_b32_e32 v2, s6
7090 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7091 ; GCN2-NEXT:    flat_atomic_dec v0, v[0:1], v2 glc
7092 ; GCN2-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7093 ; GCN2-NEXT:    buffer_wbinvl1_vol
7094 ; GCN2-NEXT:    s_setpc_b64 s[30:31]
7096 ; GCN3-LABEL: flat_atomic_udec_wrap_i32_ret_offset_scalar:
7097 ; GCN3:       ; %bb.0:
7098 ; GCN3-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
7099 ; GCN3-NEXT:    v_mov_b32_e32 v0, s4
7100 ; GCN3-NEXT:    v_mov_b32_e32 v1, s5
7101 ; GCN3-NEXT:    v_mov_b32_e32 v2, s6
7102 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7103 ; GCN3-NEXT:    flat_atomic_dec v0, v[0:1], v2 offset:16 glc
7104 ; GCN3-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7105 ; GCN3-NEXT:    buffer_wbinvl1_vol
7106 ; GCN3-NEXT:    s_setpc_b64 s[30:31]
7107   %gep = getelementptr i32, ptr %out, i32 4
7108   %result = atomicrmw udec_wrap ptr %gep, i32 %in seq_cst
7109   ret i32 %result