[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memory-legalizer-global-agent.ll
blobba898f7375c4393d85bd257eec4cf295b38a6e95
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx600 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX6 %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX7 %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-WGP %s
5 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-CU %s
6 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx700 -amdgcn-skip-cache-invalidations -verify-machineinstrs < %s | FileCheck --check-prefixes=SKIP-CACHE-INV %s
7 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX90A-NOTTGSPLIT %s
8 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -mattr=+tgsplit -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX90A-TGSPLIT %s
9 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx940 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX940-NOTTGSPLIT %s
10 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx940 -mattr=+tgsplit -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX940-TGSPLIT %s
11 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11-WGP %s
12 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11-CU %s
14 define amdgpu_kernel void @global_agent_unordered_load(
15 ; GFX6-LABEL: global_agent_unordered_load:
16 ; GFX6:       ; %bb.0: ; %entry
17 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
18 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
19 ; GFX6-NEXT:    s_mov_b32 s6, -1
20 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
21 ; GFX6-NEXT:    s_mov_b32 s4, s0
22 ; GFX6-NEXT:    s_mov_b32 s5, s1
23 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0
24 ; GFX6-NEXT:    s_mov_b32 s4, s2
25 ; GFX6-NEXT:    s_mov_b32 s5, s3
26 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
27 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
28 ; GFX6-NEXT:    s_endpgm
30 ; GFX7-LABEL: global_agent_unordered_load:
31 ; GFX7:       ; %bb.0: ; %entry
32 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
33 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
34 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
35 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
36 ; GFX7-NEXT:    flat_load_dword v2, v[0:1]
37 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
38 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
39 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
40 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
41 ; GFX7-NEXT:    s_endpgm
43 ; GFX10-WGP-LABEL: global_agent_unordered_load:
44 ; GFX10-WGP:       ; %bb.0: ; %entry
45 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
46 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
47 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
48 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1]
49 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
50 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
51 ; GFX10-WGP-NEXT:    s_endpgm
53 ; GFX10-CU-LABEL: global_agent_unordered_load:
54 ; GFX10-CU:       ; %bb.0: ; %entry
55 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
56 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
57 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
58 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1]
59 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
60 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
61 ; GFX10-CU-NEXT:    s_endpgm
63 ; SKIP-CACHE-INV-LABEL: global_agent_unordered_load:
64 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
65 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
66 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
67 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
68 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
69 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
70 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
71 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0
72 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
73 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
74 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
75 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
76 ; SKIP-CACHE-INV-NEXT:    s_endpgm
78 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_unordered_load:
79 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
80 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
81 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
82 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
83 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
84 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
85 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
86 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
88 ; GFX90A-TGSPLIT-LABEL: global_agent_unordered_load:
89 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
90 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
91 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
92 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
93 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
94 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
95 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
96 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
98 ; GFX940-NOTTGSPLIT-LABEL: global_agent_unordered_load:
99 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
100 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
101 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
102 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
103 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
104 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
105 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
106 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
108 ; GFX940-TGSPLIT-LABEL: global_agent_unordered_load:
109 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
110 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
111 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
112 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
113 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
114 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
115 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
116 ; GFX940-TGSPLIT-NEXT:    s_endpgm
118 ; GFX11-WGP-LABEL: global_agent_unordered_load:
119 ; GFX11-WGP:       ; %bb.0: ; %entry
120 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
121 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
122 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
123 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1]
124 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
125 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
126 ; GFX11-WGP-NEXT:    s_nop 0
127 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
128 ; GFX11-WGP-NEXT:    s_endpgm
130 ; GFX11-CU-LABEL: global_agent_unordered_load:
131 ; GFX11-CU:       ; %bb.0: ; %entry
132 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
133 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
134 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
135 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1]
136 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
137 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
138 ; GFX11-CU-NEXT:    s_nop 0
139 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
140 ; GFX11-CU-NEXT:    s_endpgm
141     ptr addrspace(1) %in, ptr addrspace(1) %out) {
142 entry:
143   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent") unordered, align 4
144   store i32 %val, ptr addrspace(1) %out
145   ret void
148 define amdgpu_kernel void @global_agent_monotonic_load(
149 ; GFX6-LABEL: global_agent_monotonic_load:
150 ; GFX6:       ; %bb.0: ; %entry
151 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
152 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
153 ; GFX6-NEXT:    s_mov_b32 s6, -1
154 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
155 ; GFX6-NEXT:    s_mov_b32 s4, s0
156 ; GFX6-NEXT:    s_mov_b32 s5, s1
157 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
158 ; GFX6-NEXT:    s_mov_b32 s4, s2
159 ; GFX6-NEXT:    s_mov_b32 s5, s3
160 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
161 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
162 ; GFX6-NEXT:    s_endpgm
164 ; GFX7-LABEL: global_agent_monotonic_load:
165 ; GFX7:       ; %bb.0: ; %entry
166 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
167 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
168 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
169 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
170 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
171 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
172 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
173 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
174 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
175 ; GFX7-NEXT:    s_endpgm
177 ; GFX10-WGP-LABEL: global_agent_monotonic_load:
178 ; GFX10-WGP:       ; %bb.0: ; %entry
179 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
180 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
181 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
182 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
183 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
184 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
185 ; GFX10-WGP-NEXT:    s_endpgm
187 ; GFX10-CU-LABEL: global_agent_monotonic_load:
188 ; GFX10-CU:       ; %bb.0: ; %entry
189 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
190 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
191 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
192 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
193 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
194 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
195 ; GFX10-CU-NEXT:    s_endpgm
197 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_load:
198 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
199 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
200 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
201 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
202 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
203 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
204 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
205 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
206 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
207 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
208 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
209 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
210 ; SKIP-CACHE-INV-NEXT:    s_endpgm
212 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_load:
213 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
214 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
215 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
216 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
217 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
218 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
219 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
220 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
222 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_load:
223 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
224 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
225 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
226 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
227 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
228 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
229 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
230 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
232 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_load:
233 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
234 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
235 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
236 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
237 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
238 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
239 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
240 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
242 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_load:
243 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
244 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
245 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
246 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
247 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
248 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
249 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
250 ; GFX940-TGSPLIT-NEXT:    s_endpgm
252 ; GFX11-WGP-LABEL: global_agent_monotonic_load:
253 ; GFX11-WGP:       ; %bb.0: ; %entry
254 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
255 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
256 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
257 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
258 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
259 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
260 ; GFX11-WGP-NEXT:    s_nop 0
261 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
262 ; GFX11-WGP-NEXT:    s_endpgm
264 ; GFX11-CU-LABEL: global_agent_monotonic_load:
265 ; GFX11-CU:       ; %bb.0: ; %entry
266 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
267 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
268 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
269 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
270 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
271 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
272 ; GFX11-CU-NEXT:    s_nop 0
273 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
274 ; GFX11-CU-NEXT:    s_endpgm
275     ptr addrspace(1) %in, ptr addrspace(1) %out) {
276 entry:
277   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent") monotonic, align 4
278   store i32 %val, ptr addrspace(1) %out
279   ret void
282 define amdgpu_kernel void @global_agent_acquire_load(
283 ; GFX6-LABEL: global_agent_acquire_load:
284 ; GFX6:       ; %bb.0: ; %entry
285 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
286 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
287 ; GFX6-NEXT:    s_mov_b32 s6, -1
288 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
289 ; GFX6-NEXT:    s_mov_b32 s4, s0
290 ; GFX6-NEXT:    s_mov_b32 s5, s1
291 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
292 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
293 ; GFX6-NEXT:    buffer_wbinvl1
294 ; GFX6-NEXT:    s_mov_b32 s4, s2
295 ; GFX6-NEXT:    s_mov_b32 s5, s3
296 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
297 ; GFX6-NEXT:    s_endpgm
299 ; GFX7-LABEL: global_agent_acquire_load:
300 ; GFX7:       ; %bb.0: ; %entry
301 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
302 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
303 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
304 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
305 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
306 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
307 ; GFX7-NEXT:    buffer_wbinvl1_vol
308 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
309 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
310 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
311 ; GFX7-NEXT:    s_endpgm
313 ; GFX10-WGP-LABEL: global_agent_acquire_load:
314 ; GFX10-WGP:       ; %bb.0: ; %entry
315 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
316 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
317 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
318 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
319 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
320 ; GFX10-WGP-NEXT:    buffer_gl0_inv
321 ; GFX10-WGP-NEXT:    buffer_gl1_inv
322 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
323 ; GFX10-WGP-NEXT:    s_endpgm
325 ; GFX10-CU-LABEL: global_agent_acquire_load:
326 ; GFX10-CU:       ; %bb.0: ; %entry
327 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
328 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
329 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
330 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
331 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
332 ; GFX10-CU-NEXT:    buffer_gl0_inv
333 ; GFX10-CU-NEXT:    buffer_gl1_inv
334 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
335 ; GFX10-CU-NEXT:    s_endpgm
337 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_load:
338 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
339 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
340 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
341 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
342 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
343 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
344 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
345 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
346 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
347 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
348 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
349 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
350 ; SKIP-CACHE-INV-NEXT:    s_endpgm
352 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_load:
353 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
354 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
355 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
356 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
357 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
358 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
359 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
360 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
361 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
363 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_load:
364 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
365 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
366 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
367 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
368 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
369 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
370 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
371 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
372 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
374 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_load:
375 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
376 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
377 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
378 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
379 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
380 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
381 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
382 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
383 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
385 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_load:
386 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
387 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
388 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
389 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
390 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
391 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
392 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
393 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
394 ; GFX940-TGSPLIT-NEXT:    s_endpgm
396 ; GFX11-WGP-LABEL: global_agent_acquire_load:
397 ; GFX11-WGP:       ; %bb.0: ; %entry
398 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
399 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
400 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
401 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
402 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
403 ; GFX11-WGP-NEXT:    buffer_gl0_inv
404 ; GFX11-WGP-NEXT:    buffer_gl1_inv
405 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
406 ; GFX11-WGP-NEXT:    s_nop 0
407 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
408 ; GFX11-WGP-NEXT:    s_endpgm
410 ; GFX11-CU-LABEL: global_agent_acquire_load:
411 ; GFX11-CU:       ; %bb.0: ; %entry
412 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
413 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
414 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
415 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
416 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
417 ; GFX11-CU-NEXT:    buffer_gl0_inv
418 ; GFX11-CU-NEXT:    buffer_gl1_inv
419 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
420 ; GFX11-CU-NEXT:    s_nop 0
421 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
422 ; GFX11-CU-NEXT:    s_endpgm
423     ptr addrspace(1) %in, ptr addrspace(1) %out) {
424 entry:
425   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent") acquire, align 4
426   store i32 %val, ptr addrspace(1) %out
427   ret void
430 define amdgpu_kernel void @global_agent_seq_cst_load(
431 ; GFX6-LABEL: global_agent_seq_cst_load:
432 ; GFX6:       ; %bb.0: ; %entry
433 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
434 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
435 ; GFX6-NEXT:    s_mov_b32 s6, -1
436 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
437 ; GFX6-NEXT:    s_mov_b32 s4, s0
438 ; GFX6-NEXT:    s_mov_b32 s5, s1
439 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
440 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
441 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
442 ; GFX6-NEXT:    buffer_wbinvl1
443 ; GFX6-NEXT:    s_mov_b32 s4, s2
444 ; GFX6-NEXT:    s_mov_b32 s5, s3
445 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
446 ; GFX6-NEXT:    s_endpgm
448 ; GFX7-LABEL: global_agent_seq_cst_load:
449 ; GFX7:       ; %bb.0: ; %entry
450 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
451 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
452 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
453 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
454 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
455 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
456 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
457 ; GFX7-NEXT:    buffer_wbinvl1_vol
458 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
459 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
460 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
461 ; GFX7-NEXT:    s_endpgm
463 ; GFX10-WGP-LABEL: global_agent_seq_cst_load:
464 ; GFX10-WGP:       ; %bb.0: ; %entry
465 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
466 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
467 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
468 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
469 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
470 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
471 ; GFX10-WGP-NEXT:    buffer_gl0_inv
472 ; GFX10-WGP-NEXT:    buffer_gl1_inv
473 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
474 ; GFX10-WGP-NEXT:    s_endpgm
476 ; GFX10-CU-LABEL: global_agent_seq_cst_load:
477 ; GFX10-CU:       ; %bb.0: ; %entry
478 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
479 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
480 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
481 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
482 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
483 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
484 ; GFX10-CU-NEXT:    buffer_gl0_inv
485 ; GFX10-CU-NEXT:    buffer_gl1_inv
486 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
487 ; GFX10-CU-NEXT:    s_endpgm
489 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_load:
490 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
491 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
492 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
493 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
494 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
495 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
496 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
497 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
498 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
499 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
500 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
501 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
502 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
503 ; SKIP-CACHE-INV-NEXT:    s_endpgm
505 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_load:
506 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
507 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
508 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
509 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
510 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
511 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
512 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
513 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
514 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
516 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_load:
517 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
518 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
519 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
520 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
521 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
522 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
523 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
524 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
525 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
527 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_load:
528 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
529 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
530 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
531 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
532 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
533 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
534 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
535 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
536 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
538 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_load:
539 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
540 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
541 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
542 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
543 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
544 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
545 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
546 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
547 ; GFX940-TGSPLIT-NEXT:    s_endpgm
549 ; GFX11-WGP-LABEL: global_agent_seq_cst_load:
550 ; GFX11-WGP:       ; %bb.0: ; %entry
551 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
552 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
553 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
554 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
555 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
556 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
557 ; GFX11-WGP-NEXT:    buffer_gl0_inv
558 ; GFX11-WGP-NEXT:    buffer_gl1_inv
559 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
560 ; GFX11-WGP-NEXT:    s_nop 0
561 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
562 ; GFX11-WGP-NEXT:    s_endpgm
564 ; GFX11-CU-LABEL: global_agent_seq_cst_load:
565 ; GFX11-CU:       ; %bb.0: ; %entry
566 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
567 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
568 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
569 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
570 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
571 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
572 ; GFX11-CU-NEXT:    buffer_gl0_inv
573 ; GFX11-CU-NEXT:    buffer_gl1_inv
574 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
575 ; GFX11-CU-NEXT:    s_nop 0
576 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
577 ; GFX11-CU-NEXT:    s_endpgm
578     ptr addrspace(1) %in, ptr addrspace(1) %out) {
579 entry:
580   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent") seq_cst, align 4
581   store i32 %val, ptr addrspace(1) %out
582   ret void
585 define amdgpu_kernel void @global_agent_unordered_store(
586 ; GFX6-LABEL: global_agent_unordered_store:
587 ; GFX6:       ; %bb.0: ; %entry
588 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
589 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
590 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
591 ; GFX6-NEXT:    s_mov_b32 s2, -1
592 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
593 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
594 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
595 ; GFX6-NEXT:    s_endpgm
597 ; GFX7-LABEL: global_agent_unordered_store:
598 ; GFX7:       ; %bb.0: ; %entry
599 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
600 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
601 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
602 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
603 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
604 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
605 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
606 ; GFX7-NEXT:    s_endpgm
608 ; GFX10-WGP-LABEL: global_agent_unordered_store:
609 ; GFX10-WGP:       ; %bb.0: ; %entry
610 ; GFX10-WGP-NEXT:    s_clause 0x1
611 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
612 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
613 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
614 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
616 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
617 ; GFX10-WGP-NEXT:    s_endpgm
619 ; GFX10-CU-LABEL: global_agent_unordered_store:
620 ; GFX10-CU:       ; %bb.0: ; %entry
621 ; GFX10-CU-NEXT:    s_clause 0x1
622 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
623 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
624 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
625 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
626 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
627 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
628 ; GFX10-CU-NEXT:    s_endpgm
630 ; SKIP-CACHE-INV-LABEL: global_agent_unordered_store:
631 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
632 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
633 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
634 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
635 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
636 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
637 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
638 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
639 ; SKIP-CACHE-INV-NEXT:    s_endpgm
641 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_unordered_store:
642 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
643 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
644 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
645 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
646 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
647 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
648 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
649 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
651 ; GFX90A-TGSPLIT-LABEL: global_agent_unordered_store:
652 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
653 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
654 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
655 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
656 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
657 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
658 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
659 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
661 ; GFX940-NOTTGSPLIT-LABEL: global_agent_unordered_store:
662 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
663 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
664 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
665 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
666 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
667 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
668 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
669 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
671 ; GFX940-TGSPLIT-LABEL: global_agent_unordered_store:
672 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
673 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
674 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
675 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
676 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
677 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
678 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
679 ; GFX940-TGSPLIT-NEXT:    s_endpgm
681 ; GFX11-WGP-LABEL: global_agent_unordered_store:
682 ; GFX11-WGP:       ; %bb.0: ; %entry
683 ; GFX11-WGP-NEXT:    s_clause 0x1
684 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
685 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
686 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
687 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
688 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
689 ; GFX11-WGP-NEXT:    s_nop 0
690 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
691 ; GFX11-WGP-NEXT:    s_endpgm
693 ; GFX11-CU-LABEL: global_agent_unordered_store:
694 ; GFX11-CU:       ; %bb.0: ; %entry
695 ; GFX11-CU-NEXT:    s_clause 0x1
696 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
697 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
698 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
699 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
700 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
701 ; GFX11-CU-NEXT:    s_nop 0
702 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
703 ; GFX11-CU-NEXT:    s_endpgm
704     i32 %in, ptr addrspace(1) %out) {
705 entry:
706   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent") unordered, align 4
707   ret void
710 define amdgpu_kernel void @global_agent_monotonic_store(
711 ; GFX6-LABEL: global_agent_monotonic_store:
712 ; GFX6:       ; %bb.0: ; %entry
713 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
714 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
715 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
716 ; GFX6-NEXT:    s_mov_b32 s2, -1
717 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
718 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
719 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
720 ; GFX6-NEXT:    s_endpgm
722 ; GFX7-LABEL: global_agent_monotonic_store:
723 ; GFX7:       ; %bb.0: ; %entry
724 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
725 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
726 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
727 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
728 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
729 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
730 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
731 ; GFX7-NEXT:    s_endpgm
733 ; GFX10-WGP-LABEL: global_agent_monotonic_store:
734 ; GFX10-WGP:       ; %bb.0: ; %entry
735 ; GFX10-WGP-NEXT:    s_clause 0x1
736 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
737 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
738 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
739 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
740 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
741 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
742 ; GFX10-WGP-NEXT:    s_endpgm
744 ; GFX10-CU-LABEL: global_agent_monotonic_store:
745 ; GFX10-CU:       ; %bb.0: ; %entry
746 ; GFX10-CU-NEXT:    s_clause 0x1
747 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
748 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
749 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
750 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
751 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
752 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
753 ; GFX10-CU-NEXT:    s_endpgm
755 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_store:
756 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
757 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
758 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
759 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
760 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
761 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
762 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
763 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
764 ; SKIP-CACHE-INV-NEXT:    s_endpgm
766 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_store:
767 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
768 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
769 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
770 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
771 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
772 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
773 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
774 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
776 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_store:
777 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
778 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
779 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
780 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
781 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
782 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
783 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
784 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
786 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_store:
787 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
788 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
789 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
790 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
791 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
792 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
793 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
794 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
796 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_store:
797 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
798 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
799 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
800 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
801 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
802 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
803 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
804 ; GFX940-TGSPLIT-NEXT:    s_endpgm
806 ; GFX11-WGP-LABEL: global_agent_monotonic_store:
807 ; GFX11-WGP:       ; %bb.0: ; %entry
808 ; GFX11-WGP-NEXT:    s_clause 0x1
809 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
810 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
811 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
812 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
813 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
814 ; GFX11-WGP-NEXT:    s_nop 0
815 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
816 ; GFX11-WGP-NEXT:    s_endpgm
818 ; GFX11-CU-LABEL: global_agent_monotonic_store:
819 ; GFX11-CU:       ; %bb.0: ; %entry
820 ; GFX11-CU-NEXT:    s_clause 0x1
821 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
822 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
823 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
824 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
825 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
826 ; GFX11-CU-NEXT:    s_nop 0
827 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
828 ; GFX11-CU-NEXT:    s_endpgm
829     i32 %in, ptr addrspace(1) %out) {
830 entry:
831   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent") monotonic, align 4
832   ret void
835 define amdgpu_kernel void @global_agent_release_store(
836 ; GFX6-LABEL: global_agent_release_store:
837 ; GFX6:       ; %bb.0: ; %entry
838 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
839 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
840 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
841 ; GFX6-NEXT:    s_mov_b32 s2, -1
842 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
843 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
844 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
845 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
846 ; GFX6-NEXT:    s_endpgm
848 ; GFX7-LABEL: global_agent_release_store:
849 ; GFX7:       ; %bb.0: ; %entry
850 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
851 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
852 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
853 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
854 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
855 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
856 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
857 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
858 ; GFX7-NEXT:    s_endpgm
860 ; GFX10-WGP-LABEL: global_agent_release_store:
861 ; GFX10-WGP:       ; %bb.0: ; %entry
862 ; GFX10-WGP-NEXT:    s_clause 0x1
863 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
864 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
865 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
866 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
867 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
868 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
869 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
870 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
871 ; GFX10-WGP-NEXT:    s_endpgm
873 ; GFX10-CU-LABEL: global_agent_release_store:
874 ; GFX10-CU:       ; %bb.0: ; %entry
875 ; GFX10-CU-NEXT:    s_clause 0x1
876 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
877 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
878 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
879 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
880 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
881 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
882 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
883 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
884 ; GFX10-CU-NEXT:    s_endpgm
886 ; SKIP-CACHE-INV-LABEL: global_agent_release_store:
887 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
888 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
889 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
890 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
891 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
892 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
893 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
894 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
895 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
896 ; SKIP-CACHE-INV-NEXT:    s_endpgm
898 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_store:
899 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
900 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
901 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
902 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
903 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
904 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
905 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
906 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
907 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
909 ; GFX90A-TGSPLIT-LABEL: global_agent_release_store:
910 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
911 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
912 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
913 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
914 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
915 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
916 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
917 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
918 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
920 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_store:
921 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
922 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
923 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
924 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
925 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
926 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
927 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
928 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
929 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
930 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
932 ; GFX940-TGSPLIT-LABEL: global_agent_release_store:
933 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
934 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
935 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
936 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
937 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
938 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
939 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
940 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
941 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
942 ; GFX940-TGSPLIT-NEXT:    s_endpgm
944 ; GFX11-WGP-LABEL: global_agent_release_store:
945 ; GFX11-WGP:       ; %bb.0: ; %entry
946 ; GFX11-WGP-NEXT:    s_clause 0x1
947 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
948 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
949 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
950 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
951 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
952 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
953 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
954 ; GFX11-WGP-NEXT:    s_nop 0
955 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
956 ; GFX11-WGP-NEXT:    s_endpgm
958 ; GFX11-CU-LABEL: global_agent_release_store:
959 ; GFX11-CU:       ; %bb.0: ; %entry
960 ; GFX11-CU-NEXT:    s_clause 0x1
961 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
962 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
963 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
964 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
965 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
966 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
967 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
968 ; GFX11-CU-NEXT:    s_nop 0
969 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
970 ; GFX11-CU-NEXT:    s_endpgm
971     i32 %in, ptr addrspace(1) %out) {
972 entry:
973   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent") release, align 4
974   ret void
977 define amdgpu_kernel void @global_agent_seq_cst_store(
978 ; GFX6-LABEL: global_agent_seq_cst_store:
979 ; GFX6:       ; %bb.0: ; %entry
980 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
981 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
982 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
983 ; GFX6-NEXT:    s_mov_b32 s2, -1
984 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
985 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
986 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
987 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
988 ; GFX6-NEXT:    s_endpgm
990 ; GFX7-LABEL: global_agent_seq_cst_store:
991 ; GFX7:       ; %bb.0: ; %entry
992 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
993 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
994 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
995 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
996 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
997 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
998 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
999 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
1000 ; GFX7-NEXT:    s_endpgm
1002 ; GFX10-WGP-LABEL: global_agent_seq_cst_store:
1003 ; GFX10-WGP:       ; %bb.0: ; %entry
1004 ; GFX10-WGP-NEXT:    s_clause 0x1
1005 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
1006 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
1007 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1008 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1009 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1010 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1011 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1012 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
1013 ; GFX10-WGP-NEXT:    s_endpgm
1015 ; GFX10-CU-LABEL: global_agent_seq_cst_store:
1016 ; GFX10-CU:       ; %bb.0: ; %entry
1017 ; GFX10-CU-NEXT:    s_clause 0x1
1018 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
1019 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
1020 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1021 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1022 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1023 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1024 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1025 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
1026 ; GFX10-CU-NEXT:    s_endpgm
1028 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_store:
1029 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1030 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
1031 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
1032 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1033 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1034 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1035 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1036 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1037 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1038 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1040 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_store:
1041 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1042 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
1043 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
1044 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1045 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1046 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1047 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1048 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
1049 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1051 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_store:
1052 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1053 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
1054 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
1055 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1056 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1057 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1058 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1059 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
1060 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1062 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_store:
1063 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1064 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
1065 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
1066 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1067 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1068 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1069 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
1070 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1071 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
1072 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1074 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_store:
1075 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1076 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
1077 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
1078 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1079 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1080 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1081 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
1082 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1083 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
1084 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1086 ; GFX11-WGP-LABEL: global_agent_seq_cst_store:
1087 ; GFX11-WGP:       ; %bb.0: ; %entry
1088 ; GFX11-WGP-NEXT:    s_clause 0x1
1089 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
1090 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
1091 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1092 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1093 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1094 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1095 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
1096 ; GFX11-WGP-NEXT:    s_nop 0
1097 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1098 ; GFX11-WGP-NEXT:    s_endpgm
1100 ; GFX11-CU-LABEL: global_agent_seq_cst_store:
1101 ; GFX11-CU:       ; %bb.0: ; %entry
1102 ; GFX11-CU-NEXT:    s_clause 0x1
1103 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
1104 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
1105 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1106 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1107 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1108 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1109 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
1110 ; GFX11-CU-NEXT:    s_nop 0
1111 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1112 ; GFX11-CU-NEXT:    s_endpgm
1113     i32 %in, ptr addrspace(1) %out) {
1114 entry:
1115   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent") seq_cst, align 4
1116   ret void
1119 define amdgpu_kernel void @global_agent_monotonic_atomicrmw(
1120 ; GFX6-LABEL: global_agent_monotonic_atomicrmw:
1121 ; GFX6:       ; %bb.0: ; %entry
1122 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1123 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1124 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1125 ; GFX6-NEXT:    s_mov_b32 s2, -1
1126 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1127 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1128 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1129 ; GFX6-NEXT:    s_endpgm
1131 ; GFX7-LABEL: global_agent_monotonic_atomicrmw:
1132 ; GFX7:       ; %bb.0: ; %entry
1133 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1134 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1135 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1136 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1137 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1138 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1139 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
1140 ; GFX7-NEXT:    s_endpgm
1142 ; GFX10-WGP-LABEL: global_agent_monotonic_atomicrmw:
1143 ; GFX10-WGP:       ; %bb.0: ; %entry
1144 ; GFX10-WGP-NEXT:    s_clause 0x1
1145 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1146 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1147 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1148 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1149 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1150 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
1151 ; GFX10-WGP-NEXT:    s_endpgm
1153 ; GFX10-CU-LABEL: global_agent_monotonic_atomicrmw:
1154 ; GFX10-CU:       ; %bb.0: ; %entry
1155 ; GFX10-CU-NEXT:    s_clause 0x1
1156 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1157 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1158 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1159 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1160 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1161 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
1162 ; GFX10-CU-NEXT:    s_endpgm
1164 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_atomicrmw:
1165 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1166 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1167 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1168 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1169 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1170 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1171 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1172 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1173 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1175 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_atomicrmw:
1176 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1177 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1178 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1179 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1180 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1181 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1182 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1183 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1185 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_atomicrmw:
1186 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1187 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1188 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1189 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1190 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1191 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1192 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1193 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1195 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_atomicrmw:
1196 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1197 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1198 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1199 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1200 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1201 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1202 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1203 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1205 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_atomicrmw:
1206 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1207 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1208 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1209 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1210 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1211 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1212 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1213 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1215 ; GFX11-WGP-LABEL: global_agent_monotonic_atomicrmw:
1216 ; GFX11-WGP:       ; %bb.0: ; %entry
1217 ; GFX11-WGP-NEXT:    s_clause 0x1
1218 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1219 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1220 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1221 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1222 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1223 ; GFX11-WGP-NEXT:    s_nop 0
1224 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1225 ; GFX11-WGP-NEXT:    s_endpgm
1227 ; GFX11-CU-LABEL: global_agent_monotonic_atomicrmw:
1228 ; GFX11-CU:       ; %bb.0: ; %entry
1229 ; GFX11-CU-NEXT:    s_clause 0x1
1230 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
1231 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1232 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1233 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1234 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1235 ; GFX11-CU-NEXT:    s_nop 0
1236 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1237 ; GFX11-CU-NEXT:    s_endpgm
1238     ptr addrspace(1) %out, i32 %in) {
1239 entry:
1240   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") monotonic
1241   ret void
1244 define amdgpu_kernel void @global_agent_acquire_atomicrmw(
1245 ; GFX6-LABEL: global_agent_acquire_atomicrmw:
1246 ; GFX6:       ; %bb.0: ; %entry
1247 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1248 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1249 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1250 ; GFX6-NEXT:    s_mov_b32 s2, -1
1251 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1252 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1253 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1254 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1255 ; GFX6-NEXT:    buffer_wbinvl1
1256 ; GFX6-NEXT:    s_endpgm
1258 ; GFX7-LABEL: global_agent_acquire_atomicrmw:
1259 ; GFX7:       ; %bb.0: ; %entry
1260 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1261 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1262 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1263 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1264 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1265 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1266 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
1267 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1268 ; GFX7-NEXT:    buffer_wbinvl1_vol
1269 ; GFX7-NEXT:    s_endpgm
1271 ; GFX10-WGP-LABEL: global_agent_acquire_atomicrmw:
1272 ; GFX10-WGP:       ; %bb.0: ; %entry
1273 ; GFX10-WGP-NEXT:    s_clause 0x1
1274 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1275 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1276 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1277 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1278 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1279 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
1280 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1281 ; GFX10-WGP-NEXT:    buffer_gl0_inv
1282 ; GFX10-WGP-NEXT:    buffer_gl1_inv
1283 ; GFX10-WGP-NEXT:    s_endpgm
1285 ; GFX10-CU-LABEL: global_agent_acquire_atomicrmw:
1286 ; GFX10-CU:       ; %bb.0: ; %entry
1287 ; GFX10-CU-NEXT:    s_clause 0x1
1288 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1289 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1290 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1291 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1292 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1293 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
1294 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1295 ; GFX10-CU-NEXT:    buffer_gl0_inv
1296 ; GFX10-CU-NEXT:    buffer_gl1_inv
1297 ; GFX10-CU-NEXT:    s_endpgm
1299 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_atomicrmw:
1300 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1301 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1302 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1303 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1304 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1305 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1306 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1307 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1308 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
1309 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1311 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_atomicrmw:
1312 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1313 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1314 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1315 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1316 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1317 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1318 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1319 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1320 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
1321 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1323 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_atomicrmw:
1324 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1325 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1326 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1327 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1328 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1329 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1330 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1331 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1332 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
1333 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1335 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_atomicrmw:
1336 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1337 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1338 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1339 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1340 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1341 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1342 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1343 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1344 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
1345 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1347 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_atomicrmw:
1348 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1349 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1350 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1351 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1352 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1353 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1354 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1355 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1356 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
1357 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1359 ; GFX11-WGP-LABEL: global_agent_acquire_atomicrmw:
1360 ; GFX11-WGP:       ; %bb.0: ; %entry
1361 ; GFX11-WGP-NEXT:    s_clause 0x1
1362 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1363 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1364 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1365 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1366 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1367 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1368 ; GFX11-WGP-NEXT:    buffer_gl0_inv
1369 ; GFX11-WGP-NEXT:    buffer_gl1_inv
1370 ; GFX11-WGP-NEXT:    s_endpgm
1372 ; GFX11-CU-LABEL: global_agent_acquire_atomicrmw:
1373 ; GFX11-CU:       ; %bb.0: ; %entry
1374 ; GFX11-CU-NEXT:    s_clause 0x1
1375 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
1376 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1377 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1378 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1379 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1380 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1381 ; GFX11-CU-NEXT:    buffer_gl0_inv
1382 ; GFX11-CU-NEXT:    buffer_gl1_inv
1383 ; GFX11-CU-NEXT:    s_endpgm
1384     ptr addrspace(1) %out, i32 %in) {
1385 entry:
1386   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") acquire
1387   ret void
1390 define amdgpu_kernel void @global_agent_release_atomicrmw(
1391 ; GFX6-LABEL: global_agent_release_atomicrmw:
1392 ; GFX6:       ; %bb.0: ; %entry
1393 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1394 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1395 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1396 ; GFX6-NEXT:    s_mov_b32 s2, -1
1397 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1398 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1399 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1400 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1401 ; GFX6-NEXT:    s_endpgm
1403 ; GFX7-LABEL: global_agent_release_atomicrmw:
1404 ; GFX7:       ; %bb.0: ; %entry
1405 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1406 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1407 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1408 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1409 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1410 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1411 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1412 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
1413 ; GFX7-NEXT:    s_endpgm
1415 ; GFX10-WGP-LABEL: global_agent_release_atomicrmw:
1416 ; GFX10-WGP:       ; %bb.0: ; %entry
1417 ; GFX10-WGP-NEXT:    s_clause 0x1
1418 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1419 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1420 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1421 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1422 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1423 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1424 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1425 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
1426 ; GFX10-WGP-NEXT:    s_endpgm
1428 ; GFX10-CU-LABEL: global_agent_release_atomicrmw:
1429 ; GFX10-CU:       ; %bb.0: ; %entry
1430 ; GFX10-CU-NEXT:    s_clause 0x1
1431 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1432 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1433 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1434 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1435 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1436 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1437 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1438 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
1439 ; GFX10-CU-NEXT:    s_endpgm
1441 ; SKIP-CACHE-INV-LABEL: global_agent_release_atomicrmw:
1442 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1443 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1444 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1445 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1446 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1447 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1448 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1449 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1450 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1451 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1453 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_atomicrmw:
1454 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1455 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1456 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1457 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1458 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1459 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1460 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1461 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1462 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1464 ; GFX90A-TGSPLIT-LABEL: global_agent_release_atomicrmw:
1465 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1466 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1467 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1468 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1469 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1470 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1471 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1472 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1473 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1475 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_atomicrmw:
1476 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1477 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1478 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1479 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1480 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1481 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1482 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
1483 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1484 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1485 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1487 ; GFX940-TGSPLIT-LABEL: global_agent_release_atomicrmw:
1488 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1489 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1490 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1491 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1492 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1493 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1494 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
1495 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1496 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1497 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1499 ; GFX11-WGP-LABEL: global_agent_release_atomicrmw:
1500 ; GFX11-WGP:       ; %bb.0: ; %entry
1501 ; GFX11-WGP-NEXT:    s_clause 0x1
1502 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1503 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1504 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1505 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1506 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1507 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1508 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1509 ; GFX11-WGP-NEXT:    s_nop 0
1510 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1511 ; GFX11-WGP-NEXT:    s_endpgm
1513 ; GFX11-CU-LABEL: global_agent_release_atomicrmw:
1514 ; GFX11-CU:       ; %bb.0: ; %entry
1515 ; GFX11-CU-NEXT:    s_clause 0x1
1516 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
1517 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1518 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1519 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1520 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1521 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1522 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1523 ; GFX11-CU-NEXT:    s_nop 0
1524 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1525 ; GFX11-CU-NEXT:    s_endpgm
1526     ptr addrspace(1) %out, i32 %in) {
1527 entry:
1528   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") release
1529   ret void
1532 define amdgpu_kernel void @global_agent_acq_rel_atomicrmw(
1533 ; GFX6-LABEL: global_agent_acq_rel_atomicrmw:
1534 ; GFX6:       ; %bb.0: ; %entry
1535 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1536 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1537 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1538 ; GFX6-NEXT:    s_mov_b32 s2, -1
1539 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1540 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1541 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1542 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1543 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1544 ; GFX6-NEXT:    buffer_wbinvl1
1545 ; GFX6-NEXT:    s_endpgm
1547 ; GFX7-LABEL: global_agent_acq_rel_atomicrmw:
1548 ; GFX7:       ; %bb.0: ; %entry
1549 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1550 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1551 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1552 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1553 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1554 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1555 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1556 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
1557 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1558 ; GFX7-NEXT:    buffer_wbinvl1_vol
1559 ; GFX7-NEXT:    s_endpgm
1561 ; GFX10-WGP-LABEL: global_agent_acq_rel_atomicrmw:
1562 ; GFX10-WGP:       ; %bb.0: ; %entry
1563 ; GFX10-WGP-NEXT:    s_clause 0x1
1564 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1565 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1566 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1567 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1568 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1569 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1570 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1571 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
1572 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1573 ; GFX10-WGP-NEXT:    buffer_gl0_inv
1574 ; GFX10-WGP-NEXT:    buffer_gl1_inv
1575 ; GFX10-WGP-NEXT:    s_endpgm
1577 ; GFX10-CU-LABEL: global_agent_acq_rel_atomicrmw:
1578 ; GFX10-CU:       ; %bb.0: ; %entry
1579 ; GFX10-CU-NEXT:    s_clause 0x1
1580 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1581 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1582 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1583 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1584 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1585 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1586 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1587 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
1588 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1589 ; GFX10-CU-NEXT:    buffer_gl0_inv
1590 ; GFX10-CU-NEXT:    buffer_gl1_inv
1591 ; GFX10-CU-NEXT:    s_endpgm
1593 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_atomicrmw:
1594 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1595 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1596 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1597 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1598 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1599 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1600 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1601 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1602 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1603 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
1604 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1606 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_atomicrmw:
1607 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1608 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1609 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1610 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1611 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1612 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1613 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1614 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1615 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1616 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
1617 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1619 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_atomicrmw:
1620 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1621 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1622 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1623 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1624 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1625 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1626 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1627 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1628 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1629 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
1630 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1632 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_atomicrmw:
1633 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1634 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1635 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1636 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1637 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1638 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1639 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
1640 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1641 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1642 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1643 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
1644 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1646 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_atomicrmw:
1647 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1648 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1649 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1650 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1651 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1652 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1653 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
1654 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1655 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1656 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1657 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
1658 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1660 ; GFX11-WGP-LABEL: global_agent_acq_rel_atomicrmw:
1661 ; GFX11-WGP:       ; %bb.0: ; %entry
1662 ; GFX11-WGP-NEXT:    s_clause 0x1
1663 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1664 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1665 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1666 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1667 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1668 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1669 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1670 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1671 ; GFX11-WGP-NEXT:    buffer_gl0_inv
1672 ; GFX11-WGP-NEXT:    buffer_gl1_inv
1673 ; GFX11-WGP-NEXT:    s_endpgm
1675 ; GFX11-CU-LABEL: global_agent_acq_rel_atomicrmw:
1676 ; GFX11-CU:       ; %bb.0: ; %entry
1677 ; GFX11-CU-NEXT:    s_clause 0x1
1678 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
1679 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1680 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1681 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1682 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1683 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1684 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1685 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1686 ; GFX11-CU-NEXT:    buffer_gl0_inv
1687 ; GFX11-CU-NEXT:    buffer_gl1_inv
1688 ; GFX11-CU-NEXT:    s_endpgm
1689     ptr addrspace(1) %out, i32 %in) {
1690 entry:
1691   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") acq_rel
1692   ret void
1695 define amdgpu_kernel void @global_agent_seq_cst_atomicrmw(
1696 ; GFX6-LABEL: global_agent_seq_cst_atomicrmw:
1697 ; GFX6:       ; %bb.0: ; %entry
1698 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1699 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1700 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1701 ; GFX6-NEXT:    s_mov_b32 s2, -1
1702 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1703 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1704 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1705 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1706 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1707 ; GFX6-NEXT:    buffer_wbinvl1
1708 ; GFX6-NEXT:    s_endpgm
1710 ; GFX7-LABEL: global_agent_seq_cst_atomicrmw:
1711 ; GFX7:       ; %bb.0: ; %entry
1712 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1713 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1714 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1715 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1716 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1717 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1718 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1719 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
1720 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1721 ; GFX7-NEXT:    buffer_wbinvl1_vol
1722 ; GFX7-NEXT:    s_endpgm
1724 ; GFX10-WGP-LABEL: global_agent_seq_cst_atomicrmw:
1725 ; GFX10-WGP:       ; %bb.0: ; %entry
1726 ; GFX10-WGP-NEXT:    s_clause 0x1
1727 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1728 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1729 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1730 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1731 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1732 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1733 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1734 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
1735 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1736 ; GFX10-WGP-NEXT:    buffer_gl0_inv
1737 ; GFX10-WGP-NEXT:    buffer_gl1_inv
1738 ; GFX10-WGP-NEXT:    s_endpgm
1740 ; GFX10-CU-LABEL: global_agent_seq_cst_atomicrmw:
1741 ; GFX10-CU:       ; %bb.0: ; %entry
1742 ; GFX10-CU-NEXT:    s_clause 0x1
1743 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1744 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1745 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1746 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1747 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1748 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1749 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1750 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
1751 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1752 ; GFX10-CU-NEXT:    buffer_gl0_inv
1753 ; GFX10-CU-NEXT:    buffer_gl1_inv
1754 ; GFX10-CU-NEXT:    s_endpgm
1756 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_atomicrmw:
1757 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1758 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1759 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1760 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1761 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1762 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1763 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1764 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1765 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
1766 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
1767 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1769 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_atomicrmw:
1770 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1771 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1772 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1773 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1774 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1775 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1776 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1777 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1778 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1779 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
1780 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1782 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_atomicrmw:
1783 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1784 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1785 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1786 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1787 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1788 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1789 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1790 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
1791 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1792 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
1793 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1795 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_atomicrmw:
1796 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1797 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1798 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1799 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1800 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1801 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1802 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
1803 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1804 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1805 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1806 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
1807 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1809 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_atomicrmw:
1810 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1811 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1812 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1813 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1814 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1815 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1816 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
1817 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1818 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
1819 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1820 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
1821 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1823 ; GFX11-WGP-LABEL: global_agent_seq_cst_atomicrmw:
1824 ; GFX11-WGP:       ; %bb.0: ; %entry
1825 ; GFX11-WGP-NEXT:    s_clause 0x1
1826 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1827 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1828 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1829 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1830 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1831 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1832 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1833 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
1834 ; GFX11-WGP-NEXT:    buffer_gl0_inv
1835 ; GFX11-WGP-NEXT:    buffer_gl1_inv
1836 ; GFX11-WGP-NEXT:    s_endpgm
1838 ; GFX11-CU-LABEL: global_agent_seq_cst_atomicrmw:
1839 ; GFX11-CU:       ; %bb.0: ; %entry
1840 ; GFX11-CU-NEXT:    s_clause 0x1
1841 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
1842 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1843 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
1844 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1845 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1846 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1847 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
1848 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
1849 ; GFX11-CU-NEXT:    buffer_gl0_inv
1850 ; GFX11-CU-NEXT:    buffer_gl1_inv
1851 ; GFX11-CU-NEXT:    s_endpgm
1852     ptr addrspace(1) %out, i32 %in) {
1853 entry:
1854   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
1855   ret void
1858 define amdgpu_kernel void @global_agent_acquire_ret_atomicrmw(
1859 ; GFX6-LABEL: global_agent_acquire_ret_atomicrmw:
1860 ; GFX6:       ; %bb.0: ; %entry
1861 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
1862 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1863 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
1864 ; GFX6-NEXT:    s_mov_b32 s2, -1
1865 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1866 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
1867 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
1868 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
1869 ; GFX6-NEXT:    buffer_wbinvl1
1870 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1871 ; GFX6-NEXT:    s_endpgm
1873 ; GFX7-LABEL: global_agent_acquire_ret_atomicrmw:
1874 ; GFX7:       ; %bb.0: ; %entry
1875 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1876 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
1877 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1878 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1879 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1880 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
1881 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
1882 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1883 ; GFX7-NEXT:    buffer_wbinvl1_vol
1884 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
1885 ; GFX7-NEXT:    s_endpgm
1887 ; GFX10-WGP-LABEL: global_agent_acquire_ret_atomicrmw:
1888 ; GFX10-WGP:       ; %bb.0: ; %entry
1889 ; GFX10-WGP-NEXT:    s_clause 0x1
1890 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
1891 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1892 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
1893 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1894 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1895 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
1896 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
1897 ; GFX10-WGP-NEXT:    buffer_gl0_inv
1898 ; GFX10-WGP-NEXT:    buffer_gl1_inv
1899 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
1900 ; GFX10-WGP-NEXT:    s_endpgm
1902 ; GFX10-CU-LABEL: global_agent_acquire_ret_atomicrmw:
1903 ; GFX10-CU:       ; %bb.0: ; %entry
1904 ; GFX10-CU-NEXT:    s_clause 0x1
1905 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
1906 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1907 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
1908 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1909 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1910 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
1911 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
1912 ; GFX10-CU-NEXT:    buffer_gl0_inv
1913 ; GFX10-CU-NEXT:    buffer_gl1_inv
1914 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
1915 ; GFX10-CU-NEXT:    s_endpgm
1917 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_ret_atomicrmw:
1918 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1919 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
1920 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1921 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
1922 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
1923 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1924 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
1925 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
1926 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
1927 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1928 ; SKIP-CACHE-INV-NEXT:    s_endpgm
1930 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_ret_atomicrmw:
1931 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1932 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1933 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1934 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1935 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1936 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1937 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
1938 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1939 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
1940 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
1941 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1943 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_ret_atomicrmw:
1944 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1945 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
1946 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1947 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1948 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1949 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1950 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
1951 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1952 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
1953 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
1954 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
1956 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_ret_atomicrmw:
1957 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1958 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1959 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1960 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1961 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1962 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1963 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
1964 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1965 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
1966 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
1967 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1969 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_ret_atomicrmw:
1970 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1971 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
1972 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
1973 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
1974 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1975 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
1976 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
1977 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
1978 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
1979 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
1980 ; GFX940-TGSPLIT-NEXT:    s_endpgm
1982 ; GFX11-WGP-LABEL: global_agent_acquire_ret_atomicrmw:
1983 ; GFX11-WGP:       ; %bb.0: ; %entry
1984 ; GFX11-WGP-NEXT:    s_clause 0x1
1985 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
1986 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
1987 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1988 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
1989 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
1990 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
1991 ; GFX11-WGP-NEXT:    buffer_gl0_inv
1992 ; GFX11-WGP-NEXT:    buffer_gl1_inv
1993 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
1994 ; GFX11-WGP-NEXT:    s_nop 0
1995 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
1996 ; GFX11-WGP-NEXT:    s_endpgm
1998 ; GFX11-CU-LABEL: global_agent_acquire_ret_atomicrmw:
1999 ; GFX11-CU:       ; %bb.0: ; %entry
2000 ; GFX11-CU-NEXT:    s_clause 0x1
2001 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
2002 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
2003 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2004 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
2005 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
2006 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
2007 ; GFX11-CU-NEXT:    buffer_gl0_inv
2008 ; GFX11-CU-NEXT:    buffer_gl1_inv
2009 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
2010 ; GFX11-CU-NEXT:    s_nop 0
2011 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2012 ; GFX11-CU-NEXT:    s_endpgm
2013     ptr addrspace(1) %out, i32 %in) {
2014 entry:
2015   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") acquire
2016   store i32 %val, ptr addrspace(1) %out, align 4
2017   ret void
2020 define amdgpu_kernel void @global_agent_acq_rel_ret_atomicrmw(
2021 ; GFX6-LABEL: global_agent_acq_rel_ret_atomicrmw:
2022 ; GFX6:       ; %bb.0: ; %entry
2023 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
2024 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2025 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
2026 ; GFX6-NEXT:    s_mov_b32 s2, -1
2027 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2028 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
2029 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2030 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
2031 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2032 ; GFX6-NEXT:    buffer_wbinvl1
2033 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2034 ; GFX6-NEXT:    s_endpgm
2036 ; GFX7-LABEL: global_agent_acq_rel_ret_atomicrmw:
2037 ; GFX7:       ; %bb.0: ; %entry
2038 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2039 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
2040 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2041 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2042 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2043 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2044 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2045 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
2046 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2047 ; GFX7-NEXT:    buffer_wbinvl1_vol
2048 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
2049 ; GFX7-NEXT:    s_endpgm
2051 ; GFX10-WGP-LABEL: global_agent_acq_rel_ret_atomicrmw:
2052 ; GFX10-WGP:       ; %bb.0: ; %entry
2053 ; GFX10-WGP-NEXT:    s_clause 0x1
2054 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
2055 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2056 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
2057 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2058 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2059 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2060 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2061 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2062 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
2063 ; GFX10-WGP-NEXT:    buffer_gl0_inv
2064 ; GFX10-WGP-NEXT:    buffer_gl1_inv
2065 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
2066 ; GFX10-WGP-NEXT:    s_endpgm
2068 ; GFX10-CU-LABEL: global_agent_acq_rel_ret_atomicrmw:
2069 ; GFX10-CU:       ; %bb.0: ; %entry
2070 ; GFX10-CU-NEXT:    s_clause 0x1
2071 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
2072 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2073 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
2074 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2075 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2076 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2077 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2078 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2079 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
2080 ; GFX10-CU-NEXT:    buffer_gl0_inv
2081 ; GFX10-CU-NEXT:    buffer_gl1_inv
2082 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
2083 ; GFX10-CU-NEXT:    s_endpgm
2085 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_ret_atomicrmw:
2086 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2087 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
2088 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
2089 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
2090 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
2091 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2092 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
2093 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2094 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
2095 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
2096 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2097 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2099 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_ret_atomicrmw:
2100 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2101 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
2102 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2103 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2104 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2105 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2106 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2107 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2108 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2109 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
2110 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
2111 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2113 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_ret_atomicrmw:
2114 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2115 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
2116 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2117 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2118 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2119 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2120 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2121 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2122 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2123 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
2124 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
2125 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2127 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_ret_atomicrmw:
2128 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2129 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
2130 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
2131 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2132 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2133 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
2134 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
2135 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2136 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
2137 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2138 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
2139 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
2140 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2142 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_ret_atomicrmw:
2143 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2144 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
2145 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
2146 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2147 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2148 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
2149 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
2150 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2151 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
2152 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2153 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
2154 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
2155 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2157 ; GFX11-WGP-LABEL: global_agent_acq_rel_ret_atomicrmw:
2158 ; GFX11-WGP:       ; %bb.0: ; %entry
2159 ; GFX11-WGP-NEXT:    s_clause 0x1
2160 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
2161 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
2162 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2163 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
2164 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2165 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2166 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
2167 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
2168 ; GFX11-WGP-NEXT:    buffer_gl0_inv
2169 ; GFX11-WGP-NEXT:    buffer_gl1_inv
2170 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
2171 ; GFX11-WGP-NEXT:    s_nop 0
2172 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2173 ; GFX11-WGP-NEXT:    s_endpgm
2175 ; GFX11-CU-LABEL: global_agent_acq_rel_ret_atomicrmw:
2176 ; GFX11-CU:       ; %bb.0: ; %entry
2177 ; GFX11-CU-NEXT:    s_clause 0x1
2178 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
2179 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
2180 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2181 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
2182 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2183 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2184 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
2185 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
2186 ; GFX11-CU-NEXT:    buffer_gl0_inv
2187 ; GFX11-CU-NEXT:    buffer_gl1_inv
2188 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
2189 ; GFX11-CU-NEXT:    s_nop 0
2190 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2191 ; GFX11-CU-NEXT:    s_endpgm
2192     ptr addrspace(1) %out, i32 %in) {
2193 entry:
2194   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") acq_rel
2195   store i32 %val, ptr addrspace(1) %out, align 4
2196   ret void
2199 define amdgpu_kernel void @global_agent_seq_cst_ret_atomicrmw(
2200 ; GFX6-LABEL: global_agent_seq_cst_ret_atomicrmw:
2201 ; GFX6:       ; %bb.0: ; %entry
2202 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
2203 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2204 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
2205 ; GFX6-NEXT:    s_mov_b32 s2, -1
2206 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2207 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
2208 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2209 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
2210 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2211 ; GFX6-NEXT:    buffer_wbinvl1
2212 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2213 ; GFX6-NEXT:    s_endpgm
2215 ; GFX7-LABEL: global_agent_seq_cst_ret_atomicrmw:
2216 ; GFX7:       ; %bb.0: ; %entry
2217 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2218 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
2219 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2220 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2221 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2222 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2223 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2224 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
2225 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2226 ; GFX7-NEXT:    buffer_wbinvl1_vol
2227 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
2228 ; GFX7-NEXT:    s_endpgm
2230 ; GFX10-WGP-LABEL: global_agent_seq_cst_ret_atomicrmw:
2231 ; GFX10-WGP:       ; %bb.0: ; %entry
2232 ; GFX10-WGP-NEXT:    s_clause 0x1
2233 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
2234 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2235 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
2236 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2237 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2238 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2239 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2240 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2241 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
2242 ; GFX10-WGP-NEXT:    buffer_gl0_inv
2243 ; GFX10-WGP-NEXT:    buffer_gl1_inv
2244 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
2245 ; GFX10-WGP-NEXT:    s_endpgm
2247 ; GFX10-CU-LABEL: global_agent_seq_cst_ret_atomicrmw:
2248 ; GFX10-CU:       ; %bb.0: ; %entry
2249 ; GFX10-CU-NEXT:    s_clause 0x1
2250 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
2251 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2252 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
2253 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2254 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2255 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2256 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2257 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2258 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
2259 ; GFX10-CU-NEXT:    buffer_gl0_inv
2260 ; GFX10-CU-NEXT:    buffer_gl1_inv
2261 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
2262 ; GFX10-CU-NEXT:    s_endpgm
2264 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_ret_atomicrmw:
2265 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2266 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
2267 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
2268 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
2269 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
2270 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2271 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
2272 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2273 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
2274 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
2275 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2276 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2278 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_ret_atomicrmw:
2279 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2280 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
2281 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2282 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2283 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2284 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2285 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2286 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2287 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2288 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
2289 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
2290 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2292 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_ret_atomicrmw:
2293 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2294 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
2295 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
2296 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2297 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2298 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2299 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2300 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
2301 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2302 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
2303 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
2304 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2306 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_ret_atomicrmw:
2307 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2308 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
2309 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
2310 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2311 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2312 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
2313 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
2314 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2315 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
2316 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2317 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
2318 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
2319 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2321 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_ret_atomicrmw:
2322 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2323 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
2324 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
2325 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
2326 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2327 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
2328 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
2329 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2330 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
2331 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2332 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
2333 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
2334 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2336 ; GFX11-WGP-LABEL: global_agent_seq_cst_ret_atomicrmw:
2337 ; GFX11-WGP:       ; %bb.0: ; %entry
2338 ; GFX11-WGP-NEXT:    s_clause 0x1
2339 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
2340 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
2341 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2342 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
2343 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2344 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2345 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
2346 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
2347 ; GFX11-WGP-NEXT:    buffer_gl0_inv
2348 ; GFX11-WGP-NEXT:    buffer_gl1_inv
2349 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
2350 ; GFX11-WGP-NEXT:    s_nop 0
2351 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2352 ; GFX11-WGP-NEXT:    s_endpgm
2354 ; GFX11-CU-LABEL: global_agent_seq_cst_ret_atomicrmw:
2355 ; GFX11-CU:       ; %bb.0: ; %entry
2356 ; GFX11-CU-NEXT:    s_clause 0x1
2357 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
2358 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
2359 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2360 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
2361 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2362 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2363 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
2364 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
2365 ; GFX11-CU-NEXT:    buffer_gl0_inv
2366 ; GFX11-CU-NEXT:    buffer_gl1_inv
2367 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
2368 ; GFX11-CU-NEXT:    s_nop 0
2369 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2370 ; GFX11-CU-NEXT:    s_endpgm
2371     ptr addrspace(1) %out, i32 %in) {
2372 entry:
2373   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent") seq_cst
2374   store i32 %val, ptr addrspace(1) %out, align 4
2375   ret void
2378 define amdgpu_kernel void @global_agent_monotonic_monotonic_cmpxchg(
2379 ; GFX6-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2380 ; GFX6:       ; %bb.0: ; %entry
2381 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2382 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
2383 ; GFX6-NEXT:    s_mov_b32 s6, -1
2384 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2385 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2386 ; GFX6-NEXT:    s_mov_b32 s4, s0
2387 ; GFX6-NEXT:    s_mov_b32 s5, s1
2388 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
2389 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2390 ; GFX6-NEXT:    s_endpgm
2392 ; GFX7-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2393 ; GFX7:       ; %bb.0: ; %entry
2394 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2395 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2396 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
2397 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
2398 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2399 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2400 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2401 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
2402 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
2403 ; GFX7-NEXT:    s_endpgm
2405 ; GFX10-WGP-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2406 ; GFX10-WGP:       ; %bb.0: ; %entry
2407 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2408 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
2409 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2410 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
2411 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
2412 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2413 ; GFX10-WGP-NEXT:    s_endpgm
2415 ; GFX10-CU-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2416 ; GFX10-CU:       ; %bb.0: ; %entry
2417 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2418 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
2419 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2420 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
2421 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
2422 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2423 ; GFX10-CU-NEXT:    s_endpgm
2425 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2426 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2427 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2428 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
2429 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
2430 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2431 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
2432 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
2433 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
2434 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
2435 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2436 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2438 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2439 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2440 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2441 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2442 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2443 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2444 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2445 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2447 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2448 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2449 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2450 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2451 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2452 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2453 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2454 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2456 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2457 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2458 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2459 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2460 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2461 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2462 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2463 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2465 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2466 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2467 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2468 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2469 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2470 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2471 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2472 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2474 ; GFX11-WGP-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2475 ; GFX11-WGP:       ; %bb.0: ; %entry
2476 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2477 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
2478 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2479 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2480 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2481 ; GFX11-WGP-NEXT:    s_nop 0
2482 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2483 ; GFX11-WGP-NEXT:    s_endpgm
2485 ; GFX11-CU-LABEL: global_agent_monotonic_monotonic_cmpxchg:
2486 ; GFX11-CU:       ; %bb.0: ; %entry
2487 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2488 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
2489 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2490 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2491 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2492 ; GFX11-CU-NEXT:    s_nop 0
2493 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2494 ; GFX11-CU-NEXT:    s_endpgm
2495     ptr addrspace(1) %out, i32 %in, i32 %old) {
2496 entry:
2497   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
2498   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic monotonic
2499   ret void
2502 define amdgpu_kernel void @global_agent_acquire_monotonic_cmpxchg(
2503 ; GFX6-LABEL: global_agent_acquire_monotonic_cmpxchg:
2504 ; GFX6:       ; %bb.0: ; %entry
2505 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2506 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
2507 ; GFX6-NEXT:    s_mov_b32 s6, -1
2508 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2509 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2510 ; GFX6-NEXT:    s_mov_b32 s4, s0
2511 ; GFX6-NEXT:    s_mov_b32 s5, s1
2512 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
2513 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2514 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2515 ; GFX6-NEXT:    buffer_wbinvl1
2516 ; GFX6-NEXT:    s_endpgm
2518 ; GFX7-LABEL: global_agent_acquire_monotonic_cmpxchg:
2519 ; GFX7:       ; %bb.0: ; %entry
2520 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2521 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2522 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
2523 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
2524 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2525 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2526 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2527 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
2528 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
2529 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2530 ; GFX7-NEXT:    buffer_wbinvl1_vol
2531 ; GFX7-NEXT:    s_endpgm
2533 ; GFX10-WGP-LABEL: global_agent_acquire_monotonic_cmpxchg:
2534 ; GFX10-WGP:       ; %bb.0: ; %entry
2535 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2536 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
2537 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2538 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
2539 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
2540 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2541 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2542 ; GFX10-WGP-NEXT:    buffer_gl0_inv
2543 ; GFX10-WGP-NEXT:    buffer_gl1_inv
2544 ; GFX10-WGP-NEXT:    s_endpgm
2546 ; GFX10-CU-LABEL: global_agent_acquire_monotonic_cmpxchg:
2547 ; GFX10-CU:       ; %bb.0: ; %entry
2548 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2549 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
2550 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2551 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
2552 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
2553 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2554 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2555 ; GFX10-CU-NEXT:    buffer_gl0_inv
2556 ; GFX10-CU-NEXT:    buffer_gl1_inv
2557 ; GFX10-CU-NEXT:    s_endpgm
2559 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_monotonic_cmpxchg:
2560 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2561 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2562 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
2563 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
2564 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2565 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
2566 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
2567 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
2568 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
2569 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2570 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
2571 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2573 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_monotonic_cmpxchg:
2574 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2575 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2576 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2577 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2578 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2579 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2580 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2581 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
2582 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2584 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_monotonic_cmpxchg:
2585 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2586 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2587 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2588 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2589 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2590 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2591 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2592 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
2593 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2595 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_monotonic_cmpxchg:
2596 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2597 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2598 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2599 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2600 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2601 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2602 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2603 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
2604 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2606 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_monotonic_cmpxchg:
2607 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2608 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2609 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2610 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2611 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2612 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2613 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2614 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
2615 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2617 ; GFX11-WGP-LABEL: global_agent_acquire_monotonic_cmpxchg:
2618 ; GFX11-WGP:       ; %bb.0: ; %entry
2619 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2620 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
2621 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2622 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2623 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2624 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2625 ; GFX11-WGP-NEXT:    buffer_gl0_inv
2626 ; GFX11-WGP-NEXT:    buffer_gl1_inv
2627 ; GFX11-WGP-NEXT:    s_endpgm
2629 ; GFX11-CU-LABEL: global_agent_acquire_monotonic_cmpxchg:
2630 ; GFX11-CU:       ; %bb.0: ; %entry
2631 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2632 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
2633 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2634 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2635 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2636 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2637 ; GFX11-CU-NEXT:    buffer_gl0_inv
2638 ; GFX11-CU-NEXT:    buffer_gl1_inv
2639 ; GFX11-CU-NEXT:    s_endpgm
2640     ptr addrspace(1) %out, i32 %in, i32 %old) {
2641 entry:
2642   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
2643   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire monotonic
2644   ret void
2647 define amdgpu_kernel void @global_agent_release_monotonic_cmpxchg(
2648 ; GFX6-LABEL: global_agent_release_monotonic_cmpxchg:
2649 ; GFX6:       ; %bb.0: ; %entry
2650 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2651 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
2652 ; GFX6-NEXT:    s_mov_b32 s6, -1
2653 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2654 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2655 ; GFX6-NEXT:    s_mov_b32 s4, s0
2656 ; GFX6-NEXT:    s_mov_b32 s5, s1
2657 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
2658 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2659 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2660 ; GFX6-NEXT:    s_endpgm
2662 ; GFX7-LABEL: global_agent_release_monotonic_cmpxchg:
2663 ; GFX7:       ; %bb.0: ; %entry
2664 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2665 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2666 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
2667 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
2668 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2669 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2670 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2671 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
2672 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2673 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
2674 ; GFX7-NEXT:    s_endpgm
2676 ; GFX10-WGP-LABEL: global_agent_release_monotonic_cmpxchg:
2677 ; GFX10-WGP:       ; %bb.0: ; %entry
2678 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2679 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
2680 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2681 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
2682 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
2683 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2684 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2685 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2686 ; GFX10-WGP-NEXT:    s_endpgm
2688 ; GFX10-CU-LABEL: global_agent_release_monotonic_cmpxchg:
2689 ; GFX10-CU:       ; %bb.0: ; %entry
2690 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2691 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
2692 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2693 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
2694 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
2695 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2696 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2697 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2698 ; GFX10-CU-NEXT:    s_endpgm
2700 ; SKIP-CACHE-INV-LABEL: global_agent_release_monotonic_cmpxchg:
2701 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2702 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2703 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
2704 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
2705 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2706 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
2707 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
2708 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
2709 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
2710 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2711 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2712 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2714 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_monotonic_cmpxchg:
2715 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2716 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2717 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2718 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2719 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2720 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2721 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2722 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2724 ; GFX90A-TGSPLIT-LABEL: global_agent_release_monotonic_cmpxchg:
2725 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2726 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2727 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2728 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2729 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2730 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2731 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2732 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2734 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_monotonic_cmpxchg:
2735 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2736 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2737 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2738 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2739 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2740 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
2741 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2742 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2743 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2745 ; GFX940-TGSPLIT-LABEL: global_agent_release_monotonic_cmpxchg:
2746 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2747 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2748 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2749 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2750 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2751 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
2752 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2753 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2754 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2756 ; GFX11-WGP-LABEL: global_agent_release_monotonic_cmpxchg:
2757 ; GFX11-WGP:       ; %bb.0: ; %entry
2758 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2759 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
2760 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2761 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2762 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2763 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2764 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2765 ; GFX11-WGP-NEXT:    s_nop 0
2766 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2767 ; GFX11-WGP-NEXT:    s_endpgm
2769 ; GFX11-CU-LABEL: global_agent_release_monotonic_cmpxchg:
2770 ; GFX11-CU:       ; %bb.0: ; %entry
2771 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2772 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
2773 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2774 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2775 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2776 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2777 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2778 ; GFX11-CU-NEXT:    s_nop 0
2779 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
2780 ; GFX11-CU-NEXT:    s_endpgm
2781     ptr addrspace(1) %out, i32 %in, i32 %old) {
2782 entry:
2783   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
2784   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release monotonic
2785   ret void
2788 define amdgpu_kernel void @global_agent_acq_rel_monotonic_cmpxchg(
2789 ; GFX6-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2790 ; GFX6:       ; %bb.0: ; %entry
2791 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2792 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
2793 ; GFX6-NEXT:    s_mov_b32 s6, -1
2794 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2795 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2796 ; GFX6-NEXT:    s_mov_b32 s4, s0
2797 ; GFX6-NEXT:    s_mov_b32 s5, s1
2798 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
2799 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2800 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2801 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2802 ; GFX6-NEXT:    buffer_wbinvl1
2803 ; GFX6-NEXT:    s_endpgm
2805 ; GFX7-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2806 ; GFX7:       ; %bb.0: ; %entry
2807 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2808 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2809 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
2810 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
2811 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2812 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2813 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2814 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
2815 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2816 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
2817 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2818 ; GFX7-NEXT:    buffer_wbinvl1_vol
2819 ; GFX7-NEXT:    s_endpgm
2821 ; GFX10-WGP-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2822 ; GFX10-WGP:       ; %bb.0: ; %entry
2823 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2824 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
2825 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2826 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
2827 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
2828 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2829 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2830 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2831 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2832 ; GFX10-WGP-NEXT:    buffer_gl0_inv
2833 ; GFX10-WGP-NEXT:    buffer_gl1_inv
2834 ; GFX10-WGP-NEXT:    s_endpgm
2836 ; GFX10-CU-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2837 ; GFX10-CU:       ; %bb.0: ; %entry
2838 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2839 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
2840 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2841 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
2842 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
2843 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2844 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2845 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2846 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2847 ; GFX10-CU-NEXT:    buffer_gl0_inv
2848 ; GFX10-CU-NEXT:    buffer_gl1_inv
2849 ; GFX10-CU-NEXT:    s_endpgm
2851 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2852 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2853 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2854 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
2855 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
2856 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2857 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
2858 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
2859 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
2860 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
2861 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2862 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2863 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
2864 ; SKIP-CACHE-INV-NEXT:    s_endpgm
2866 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2867 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2868 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2869 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2870 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2871 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2872 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2873 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2874 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2875 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
2876 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2878 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2879 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2880 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2881 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2882 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2883 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
2884 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2885 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2886 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2887 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
2888 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
2890 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2891 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2892 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2893 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2894 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2895 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2896 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
2897 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2898 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2899 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2900 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
2901 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2903 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2904 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2905 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2906 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
2907 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2908 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
2909 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
2910 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2911 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2912 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
2913 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
2914 ; GFX940-TGSPLIT-NEXT:    s_endpgm
2916 ; GFX11-WGP-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2917 ; GFX11-WGP:       ; %bb.0: ; %entry
2918 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2919 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
2920 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2921 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2922 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2923 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2924 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2925 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2926 ; GFX11-WGP-NEXT:    buffer_gl0_inv
2927 ; GFX11-WGP-NEXT:    buffer_gl1_inv
2928 ; GFX11-WGP-NEXT:    s_endpgm
2930 ; GFX11-CU-LABEL: global_agent_acq_rel_monotonic_cmpxchg:
2931 ; GFX11-CU:       ; %bb.0: ; %entry
2932 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
2933 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
2934 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
2935 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
2936 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2937 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2938 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
2939 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
2940 ; GFX11-CU-NEXT:    buffer_gl0_inv
2941 ; GFX11-CU-NEXT:    buffer_gl1_inv
2942 ; GFX11-CU-NEXT:    s_endpgm
2943     ptr addrspace(1) %out, i32 %in, i32 %old) {
2944 entry:
2945   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
2946   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel monotonic
2947   ret void
2950 define amdgpu_kernel void @global_agent_seq_cst_monotonic_cmpxchg(
2951 ; GFX6-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
2952 ; GFX6:       ; %bb.0: ; %entry
2953 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2954 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
2955 ; GFX6-NEXT:    s_mov_b32 s6, -1
2956 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2957 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2958 ; GFX6-NEXT:    s_mov_b32 s4, s0
2959 ; GFX6-NEXT:    s_mov_b32 s5, s1
2960 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
2961 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2962 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
2963 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
2964 ; GFX6-NEXT:    buffer_wbinvl1
2965 ; GFX6-NEXT:    s_endpgm
2967 ; GFX7-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
2968 ; GFX7:       ; %bb.0: ; %entry
2969 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2970 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2971 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
2972 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
2973 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2974 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
2975 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
2976 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
2977 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2978 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
2979 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2980 ; GFX7-NEXT:    buffer_wbinvl1_vol
2981 ; GFX7-NEXT:    s_endpgm
2983 ; GFX10-WGP-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
2984 ; GFX10-WGP:       ; %bb.0: ; %entry
2985 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2986 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
2987 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2988 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
2989 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
2990 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
2991 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2992 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
2993 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
2994 ; GFX10-WGP-NEXT:    buffer_gl0_inv
2995 ; GFX10-WGP-NEXT:    buffer_gl1_inv
2996 ; GFX10-WGP-NEXT:    s_endpgm
2998 ; GFX10-CU-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
2999 ; GFX10-CU:       ; %bb.0: ; %entry
3000 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3001 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3002 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3003 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3004 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3005 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3006 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3007 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3008 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3009 ; GFX10-CU-NEXT:    buffer_gl0_inv
3010 ; GFX10-CU-NEXT:    buffer_gl1_inv
3011 ; GFX10-CU-NEXT:    s_endpgm
3013 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3014 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3015 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3016 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3017 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3018 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3019 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3020 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3021 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3022 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3023 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3024 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3025 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3026 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3028 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3029 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3030 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3031 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3032 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3033 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3034 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3035 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3036 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3037 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3038 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3040 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3041 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3042 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3043 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3044 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3045 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3046 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3047 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3048 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3049 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3050 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3052 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3053 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3054 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3055 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3056 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3057 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3058 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
3059 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3060 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3061 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3062 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3063 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3065 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3066 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3067 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3068 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3069 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3070 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3071 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
3072 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3073 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3074 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3075 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3076 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3078 ; GFX11-WGP-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3079 ; GFX11-WGP:       ; %bb.0: ; %entry
3080 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3081 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3082 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3083 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3084 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3085 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3086 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3087 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3088 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3089 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3090 ; GFX11-WGP-NEXT:    s_endpgm
3092 ; GFX11-CU-LABEL: global_agent_seq_cst_monotonic_cmpxchg:
3093 ; GFX11-CU:       ; %bb.0: ; %entry
3094 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3095 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3096 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3097 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3098 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3099 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3100 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3101 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3102 ; GFX11-CU-NEXT:    buffer_gl0_inv
3103 ; GFX11-CU-NEXT:    buffer_gl1_inv
3104 ; GFX11-CU-NEXT:    s_endpgm
3105     ptr addrspace(1) %out, i32 %in, i32 %old) {
3106 entry:
3107   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3108   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst monotonic
3109   ret void
3112 define amdgpu_kernel void @global_agent_monotonic_acquire_cmpxchg(
3113 ; GFX6-LABEL: global_agent_monotonic_acquire_cmpxchg:
3114 ; GFX6:       ; %bb.0: ; %entry
3115 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3116 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3117 ; GFX6-NEXT:    s_mov_b32 s6, -1
3118 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3119 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3120 ; GFX6-NEXT:    s_mov_b32 s4, s0
3121 ; GFX6-NEXT:    s_mov_b32 s5, s1
3122 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3123 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3124 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3125 ; GFX6-NEXT:    buffer_wbinvl1
3126 ; GFX6-NEXT:    s_endpgm
3128 ; GFX7-LABEL: global_agent_monotonic_acquire_cmpxchg:
3129 ; GFX7:       ; %bb.0: ; %entry
3130 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3131 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3132 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3133 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3134 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3135 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3136 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3137 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3138 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3139 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3140 ; GFX7-NEXT:    buffer_wbinvl1_vol
3141 ; GFX7-NEXT:    s_endpgm
3143 ; GFX10-WGP-LABEL: global_agent_monotonic_acquire_cmpxchg:
3144 ; GFX10-WGP:       ; %bb.0: ; %entry
3145 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3146 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3147 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3148 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3149 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3150 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3151 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3152 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3153 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3154 ; GFX10-WGP-NEXT:    s_endpgm
3156 ; GFX10-CU-LABEL: global_agent_monotonic_acquire_cmpxchg:
3157 ; GFX10-CU:       ; %bb.0: ; %entry
3158 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3159 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3160 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3161 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3162 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3163 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3164 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3165 ; GFX10-CU-NEXT:    buffer_gl0_inv
3166 ; GFX10-CU-NEXT:    buffer_gl1_inv
3167 ; GFX10-CU-NEXT:    s_endpgm
3169 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_acquire_cmpxchg:
3170 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3171 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3172 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3173 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3174 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3175 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3176 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3177 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3178 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3179 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3180 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3181 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3183 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_acquire_cmpxchg:
3184 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3185 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3186 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3187 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3188 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3189 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3190 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3191 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3192 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3194 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_acquire_cmpxchg:
3195 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3196 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3197 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3198 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3199 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3200 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3201 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3202 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3203 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3205 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_acquire_cmpxchg:
3206 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3207 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3208 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3209 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3210 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3211 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3212 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3213 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3214 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3216 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_acquire_cmpxchg:
3217 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3218 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3219 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3220 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3221 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3222 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3223 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3224 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3225 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3227 ; GFX11-WGP-LABEL: global_agent_monotonic_acquire_cmpxchg:
3228 ; GFX11-WGP:       ; %bb.0: ; %entry
3229 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3230 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3231 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3232 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3233 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3234 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3235 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3236 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3237 ; GFX11-WGP-NEXT:    s_endpgm
3239 ; GFX11-CU-LABEL: global_agent_monotonic_acquire_cmpxchg:
3240 ; GFX11-CU:       ; %bb.0: ; %entry
3241 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3242 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3243 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3244 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3245 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3246 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3247 ; GFX11-CU-NEXT:    buffer_gl0_inv
3248 ; GFX11-CU-NEXT:    buffer_gl1_inv
3249 ; GFX11-CU-NEXT:    s_endpgm
3250     ptr addrspace(1) %out, i32 %in, i32 %old) {
3251 entry:
3252   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3253   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic acquire
3254   ret void
3257 define amdgpu_kernel void @global_agent_acquire_acquire_cmpxchg(
3258 ; GFX6-LABEL: global_agent_acquire_acquire_cmpxchg:
3259 ; GFX6:       ; %bb.0: ; %entry
3260 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3261 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3262 ; GFX6-NEXT:    s_mov_b32 s6, -1
3263 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3264 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3265 ; GFX6-NEXT:    s_mov_b32 s4, s0
3266 ; GFX6-NEXT:    s_mov_b32 s5, s1
3267 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3268 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3269 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3270 ; GFX6-NEXT:    buffer_wbinvl1
3271 ; GFX6-NEXT:    s_endpgm
3273 ; GFX7-LABEL: global_agent_acquire_acquire_cmpxchg:
3274 ; GFX7:       ; %bb.0: ; %entry
3275 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3276 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3277 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3278 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3279 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3280 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3281 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3282 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3283 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3284 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3285 ; GFX7-NEXT:    buffer_wbinvl1_vol
3286 ; GFX7-NEXT:    s_endpgm
3288 ; GFX10-WGP-LABEL: global_agent_acquire_acquire_cmpxchg:
3289 ; GFX10-WGP:       ; %bb.0: ; %entry
3290 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3291 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3292 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3293 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3294 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3295 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3296 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3297 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3298 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3299 ; GFX10-WGP-NEXT:    s_endpgm
3301 ; GFX10-CU-LABEL: global_agent_acquire_acquire_cmpxchg:
3302 ; GFX10-CU:       ; %bb.0: ; %entry
3303 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3304 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3305 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3306 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3307 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3308 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3309 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3310 ; GFX10-CU-NEXT:    buffer_gl0_inv
3311 ; GFX10-CU-NEXT:    buffer_gl1_inv
3312 ; GFX10-CU-NEXT:    s_endpgm
3314 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_acquire_cmpxchg:
3315 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3316 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3317 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3318 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3319 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3320 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3321 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3322 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3323 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3324 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3325 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3326 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3328 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_acquire_cmpxchg:
3329 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3330 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3331 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3332 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3333 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3334 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3335 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3336 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3337 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3339 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_acquire_cmpxchg:
3340 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3341 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3342 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3343 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3344 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3345 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3346 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3347 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3348 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3350 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_acquire_cmpxchg:
3351 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3352 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3353 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3354 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3355 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3356 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3357 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3358 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3359 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3361 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_acquire_cmpxchg:
3362 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3363 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3364 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3365 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3366 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3367 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3368 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3369 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3370 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3372 ; GFX11-WGP-LABEL: global_agent_acquire_acquire_cmpxchg:
3373 ; GFX11-WGP:       ; %bb.0: ; %entry
3374 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3375 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3376 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3377 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3378 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3379 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3380 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3381 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3382 ; GFX11-WGP-NEXT:    s_endpgm
3384 ; GFX11-CU-LABEL: global_agent_acquire_acquire_cmpxchg:
3385 ; GFX11-CU:       ; %bb.0: ; %entry
3386 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3387 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3388 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3389 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3390 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3391 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3392 ; GFX11-CU-NEXT:    buffer_gl0_inv
3393 ; GFX11-CU-NEXT:    buffer_gl1_inv
3394 ; GFX11-CU-NEXT:    s_endpgm
3395     ptr addrspace(1) %out, i32 %in, i32 %old) {
3396 entry:
3397   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3398   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire acquire
3399   ret void
3402 define amdgpu_kernel void @global_agent_release_acquire_cmpxchg(
3403 ; GFX6-LABEL: global_agent_release_acquire_cmpxchg:
3404 ; GFX6:       ; %bb.0: ; %entry
3405 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3406 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3407 ; GFX6-NEXT:    s_mov_b32 s6, -1
3408 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3409 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3410 ; GFX6-NEXT:    s_mov_b32 s4, s0
3411 ; GFX6-NEXT:    s_mov_b32 s5, s1
3412 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3413 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3414 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3415 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3416 ; GFX6-NEXT:    buffer_wbinvl1
3417 ; GFX6-NEXT:    s_endpgm
3419 ; GFX7-LABEL: global_agent_release_acquire_cmpxchg:
3420 ; GFX7:       ; %bb.0: ; %entry
3421 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3422 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3423 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3424 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3425 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3426 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3427 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3428 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3429 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3430 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3431 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3432 ; GFX7-NEXT:    buffer_wbinvl1_vol
3433 ; GFX7-NEXT:    s_endpgm
3435 ; GFX10-WGP-LABEL: global_agent_release_acquire_cmpxchg:
3436 ; GFX10-WGP:       ; %bb.0: ; %entry
3437 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3438 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3439 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3440 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3441 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3442 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3443 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3444 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3445 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3446 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3447 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3448 ; GFX10-WGP-NEXT:    s_endpgm
3450 ; GFX10-CU-LABEL: global_agent_release_acquire_cmpxchg:
3451 ; GFX10-CU:       ; %bb.0: ; %entry
3452 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3453 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3454 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3455 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3456 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3457 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3458 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3459 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3460 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3461 ; GFX10-CU-NEXT:    buffer_gl0_inv
3462 ; GFX10-CU-NEXT:    buffer_gl1_inv
3463 ; GFX10-CU-NEXT:    s_endpgm
3465 ; SKIP-CACHE-INV-LABEL: global_agent_release_acquire_cmpxchg:
3466 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3467 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3468 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3469 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3470 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3471 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3472 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3473 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3474 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3475 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3476 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3477 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3478 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3480 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_acquire_cmpxchg:
3481 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3482 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3483 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3484 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3485 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3486 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3487 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3488 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3489 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3490 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3492 ; GFX90A-TGSPLIT-LABEL: global_agent_release_acquire_cmpxchg:
3493 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3494 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3495 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3496 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3497 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3498 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3499 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3500 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3501 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3502 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3504 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_acquire_cmpxchg:
3505 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3506 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3507 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3508 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3509 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3510 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
3511 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3512 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3513 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3514 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3515 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3517 ; GFX940-TGSPLIT-LABEL: global_agent_release_acquire_cmpxchg:
3518 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3519 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3520 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3521 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3522 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3523 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
3524 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3525 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3526 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3527 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3528 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3530 ; GFX11-WGP-LABEL: global_agent_release_acquire_cmpxchg:
3531 ; GFX11-WGP:       ; %bb.0: ; %entry
3532 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3533 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3534 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3535 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3536 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3537 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3538 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3539 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3540 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3541 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3542 ; GFX11-WGP-NEXT:    s_endpgm
3544 ; GFX11-CU-LABEL: global_agent_release_acquire_cmpxchg:
3545 ; GFX11-CU:       ; %bb.0: ; %entry
3546 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3547 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3548 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3549 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3550 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3551 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3552 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3553 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3554 ; GFX11-CU-NEXT:    buffer_gl0_inv
3555 ; GFX11-CU-NEXT:    buffer_gl1_inv
3556 ; GFX11-CU-NEXT:    s_endpgm
3557     ptr addrspace(1) %out, i32 %in, i32 %old) {
3558 entry:
3559   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3560   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release acquire
3561   ret void
3564 define amdgpu_kernel void @global_agent_acq_rel_acquire_cmpxchg(
3565 ; GFX6-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3566 ; GFX6:       ; %bb.0: ; %entry
3567 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3568 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3569 ; GFX6-NEXT:    s_mov_b32 s6, -1
3570 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3571 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3572 ; GFX6-NEXT:    s_mov_b32 s4, s0
3573 ; GFX6-NEXT:    s_mov_b32 s5, s1
3574 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3575 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3576 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3577 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3578 ; GFX6-NEXT:    buffer_wbinvl1
3579 ; GFX6-NEXT:    s_endpgm
3581 ; GFX7-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3582 ; GFX7:       ; %bb.0: ; %entry
3583 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3584 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3585 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3586 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3587 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3588 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3589 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3590 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3591 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3592 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3593 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3594 ; GFX7-NEXT:    buffer_wbinvl1_vol
3595 ; GFX7-NEXT:    s_endpgm
3597 ; GFX10-WGP-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3598 ; GFX10-WGP:       ; %bb.0: ; %entry
3599 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3600 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3601 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3602 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3603 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3604 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3605 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3606 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3607 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3608 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3609 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3610 ; GFX10-WGP-NEXT:    s_endpgm
3612 ; GFX10-CU-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3613 ; GFX10-CU:       ; %bb.0: ; %entry
3614 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3615 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3616 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3617 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3618 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3619 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3620 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3621 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3622 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3623 ; GFX10-CU-NEXT:    buffer_gl0_inv
3624 ; GFX10-CU-NEXT:    buffer_gl1_inv
3625 ; GFX10-CU-NEXT:    s_endpgm
3627 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3628 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3629 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3630 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3631 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3632 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3633 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3634 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3635 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3636 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3637 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3638 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3639 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3640 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3642 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3643 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3644 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3645 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3646 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3647 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3648 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3649 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3650 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3651 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3652 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3654 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3655 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3656 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3657 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3658 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3659 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3660 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3661 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3662 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3663 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3664 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3666 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3667 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3668 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3669 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3670 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3671 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3672 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
3673 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3674 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3675 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3676 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3677 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3679 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3680 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3681 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3682 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3683 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3684 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3685 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
3686 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3687 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3688 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3689 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3690 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3692 ; GFX11-WGP-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3693 ; GFX11-WGP:       ; %bb.0: ; %entry
3694 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3695 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3696 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3697 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3698 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3699 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3700 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3701 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3702 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3703 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3704 ; GFX11-WGP-NEXT:    s_endpgm
3706 ; GFX11-CU-LABEL: global_agent_acq_rel_acquire_cmpxchg:
3707 ; GFX11-CU:       ; %bb.0: ; %entry
3708 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3709 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3710 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3711 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3712 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3713 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3714 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3715 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3716 ; GFX11-CU-NEXT:    buffer_gl0_inv
3717 ; GFX11-CU-NEXT:    buffer_gl1_inv
3718 ; GFX11-CU-NEXT:    s_endpgm
3719     ptr addrspace(1) %out, i32 %in, i32 %old) {
3720 entry:
3721   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3722   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel acquire
3723   ret void
3726 define amdgpu_kernel void @global_agent_seq_cst_acquire_cmpxchg(
3727 ; GFX6-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3728 ; GFX6:       ; %bb.0: ; %entry
3729 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3730 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3731 ; GFX6-NEXT:    s_mov_b32 s6, -1
3732 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3733 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3734 ; GFX6-NEXT:    s_mov_b32 s4, s0
3735 ; GFX6-NEXT:    s_mov_b32 s5, s1
3736 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3737 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3738 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3739 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3740 ; GFX6-NEXT:    buffer_wbinvl1
3741 ; GFX6-NEXT:    s_endpgm
3743 ; GFX7-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3744 ; GFX7:       ; %bb.0: ; %entry
3745 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3746 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3747 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3748 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3749 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3750 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3751 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3752 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3753 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3754 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3755 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3756 ; GFX7-NEXT:    buffer_wbinvl1_vol
3757 ; GFX7-NEXT:    s_endpgm
3759 ; GFX10-WGP-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3760 ; GFX10-WGP:       ; %bb.0: ; %entry
3761 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3762 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3763 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3764 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3765 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3766 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3767 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3768 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3769 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3770 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3771 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3772 ; GFX10-WGP-NEXT:    s_endpgm
3774 ; GFX10-CU-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3775 ; GFX10-CU:       ; %bb.0: ; %entry
3776 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3777 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3778 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3779 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3780 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3781 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3782 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3783 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3784 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3785 ; GFX10-CU-NEXT:    buffer_gl0_inv
3786 ; GFX10-CU-NEXT:    buffer_gl1_inv
3787 ; GFX10-CU-NEXT:    s_endpgm
3789 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3790 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3791 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3792 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3793 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3794 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3795 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3796 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3797 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3798 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3799 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3800 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3801 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3802 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3804 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3805 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3806 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3807 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3808 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3809 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3810 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3811 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3812 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3813 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3814 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3816 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3817 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3818 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3819 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3820 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3821 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3822 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3823 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3824 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3825 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3826 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3828 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3829 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3830 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3831 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3832 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3833 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3834 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
3835 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3836 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3837 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3838 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
3839 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3841 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3842 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3843 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3844 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3845 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3846 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3847 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
3848 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3849 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3850 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3851 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
3852 ; GFX940-TGSPLIT-NEXT:    s_endpgm
3854 ; GFX11-WGP-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3855 ; GFX11-WGP:       ; %bb.0: ; %entry
3856 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3857 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
3858 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3859 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3860 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3861 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3862 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3863 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3864 ; GFX11-WGP-NEXT:    buffer_gl0_inv
3865 ; GFX11-WGP-NEXT:    buffer_gl1_inv
3866 ; GFX11-WGP-NEXT:    s_endpgm
3868 ; GFX11-CU-LABEL: global_agent_seq_cst_acquire_cmpxchg:
3869 ; GFX11-CU:       ; %bb.0: ; %entry
3870 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
3871 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
3872 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
3873 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
3874 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3875 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3876 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
3877 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3878 ; GFX11-CU-NEXT:    buffer_gl0_inv
3879 ; GFX11-CU-NEXT:    buffer_gl1_inv
3880 ; GFX11-CU-NEXT:    s_endpgm
3881     ptr addrspace(1) %out, i32 %in, i32 %old) {
3882 entry:
3883   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
3884   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst acquire
3885   ret void
3888 define amdgpu_kernel void @global_agent_monotonic_seq_cst_cmpxchg(
3889 ; GFX6-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3890 ; GFX6:       ; %bb.0: ; %entry
3891 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3892 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
3893 ; GFX6-NEXT:    s_mov_b32 s6, -1
3894 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3895 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3896 ; GFX6-NEXT:    s_mov_b32 s4, s0
3897 ; GFX6-NEXT:    s_mov_b32 s5, s1
3898 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
3899 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3900 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3901 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
3902 ; GFX6-NEXT:    buffer_wbinvl1
3903 ; GFX6-NEXT:    s_endpgm
3905 ; GFX7-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3906 ; GFX7:       ; %bb.0: ; %entry
3907 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3908 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3909 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
3910 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
3911 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3912 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
3913 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
3914 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
3915 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3916 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
3917 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
3918 ; GFX7-NEXT:    buffer_wbinvl1_vol
3919 ; GFX7-NEXT:    s_endpgm
3921 ; GFX10-WGP-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3922 ; GFX10-WGP:       ; %bb.0: ; %entry
3923 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3924 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
3925 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3926 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
3927 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
3928 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3929 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3930 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3931 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
3932 ; GFX10-WGP-NEXT:    buffer_gl0_inv
3933 ; GFX10-WGP-NEXT:    buffer_gl1_inv
3934 ; GFX10-WGP-NEXT:    s_endpgm
3936 ; GFX10-CU-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3937 ; GFX10-CU:       ; %bb.0: ; %entry
3938 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3939 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
3940 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3941 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
3942 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
3943 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3944 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3945 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3946 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
3947 ; GFX10-CU-NEXT:    buffer_gl0_inv
3948 ; GFX10-CU-NEXT:    buffer_gl1_inv
3949 ; GFX10-CU-NEXT:    s_endpgm
3951 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3952 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3953 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3954 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
3955 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
3956 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3957 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
3958 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
3959 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
3960 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
3961 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3962 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
3963 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
3964 ; SKIP-CACHE-INV-NEXT:    s_endpgm
3966 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3967 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3968 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3969 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3970 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3971 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3972 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3973 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3974 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3975 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
3976 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3978 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3979 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3980 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3981 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3982 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3983 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
3984 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3985 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3986 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
3987 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
3988 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
3990 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
3991 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3992 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3993 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
3994 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3995 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
3996 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
3997 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
3998 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
3999 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4000 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4001 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4003 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
4004 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4005 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4006 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4007 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4008 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4009 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
4010 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4011 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4012 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4013 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4014 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4016 ; GFX11-WGP-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
4017 ; GFX11-WGP:       ; %bb.0: ; %entry
4018 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4019 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4020 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4021 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4022 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4023 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4024 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4025 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4026 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4027 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4028 ; GFX11-WGP-NEXT:    s_endpgm
4030 ; GFX11-CU-LABEL: global_agent_monotonic_seq_cst_cmpxchg:
4031 ; GFX11-CU:       ; %bb.0: ; %entry
4032 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4033 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4034 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4035 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4036 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4037 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4038 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4039 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4040 ; GFX11-CU-NEXT:    buffer_gl0_inv
4041 ; GFX11-CU-NEXT:    buffer_gl1_inv
4042 ; GFX11-CU-NEXT:    s_endpgm
4043     ptr addrspace(1) %out, i32 %in, i32 %old) {
4044 entry:
4045   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4046   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic seq_cst
4047   ret void
4050 define amdgpu_kernel void @global_agent_acquire_seq_cst_cmpxchg(
4051 ; GFX6-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4052 ; GFX6:       ; %bb.0: ; %entry
4053 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4054 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4055 ; GFX6-NEXT:    s_mov_b32 s6, -1
4056 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4057 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4058 ; GFX6-NEXT:    s_mov_b32 s4, s0
4059 ; GFX6-NEXT:    s_mov_b32 s5, s1
4060 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4061 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4062 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4063 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4064 ; GFX6-NEXT:    buffer_wbinvl1
4065 ; GFX6-NEXT:    s_endpgm
4067 ; GFX7-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4068 ; GFX7:       ; %bb.0: ; %entry
4069 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4070 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4071 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
4072 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
4073 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4074 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4075 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4076 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4077 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4078 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
4079 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4080 ; GFX7-NEXT:    buffer_wbinvl1_vol
4081 ; GFX7-NEXT:    s_endpgm
4083 ; GFX10-WGP-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4084 ; GFX10-WGP:       ; %bb.0: ; %entry
4085 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4086 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4087 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4088 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4089 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4090 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4091 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4092 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4093 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4094 ; GFX10-WGP-NEXT:    buffer_gl0_inv
4095 ; GFX10-WGP-NEXT:    buffer_gl1_inv
4096 ; GFX10-WGP-NEXT:    s_endpgm
4098 ; GFX10-CU-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4099 ; GFX10-CU:       ; %bb.0: ; %entry
4100 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4101 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4102 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4103 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4104 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4105 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4106 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4107 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4108 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4109 ; GFX10-CU-NEXT:    buffer_gl0_inv
4110 ; GFX10-CU-NEXT:    buffer_gl1_inv
4111 ; GFX10-CU-NEXT:    s_endpgm
4113 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4114 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4115 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4116 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4117 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4118 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4119 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4120 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4121 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4122 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4123 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4124 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4125 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4126 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4128 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4129 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4130 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4131 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4132 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4133 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4134 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4135 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4136 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4137 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
4138 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4140 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4141 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4142 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4143 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4144 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4145 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4146 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4147 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4148 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4149 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
4150 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4152 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4153 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4154 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4155 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4156 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4157 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4158 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
4159 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4160 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4161 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4162 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4163 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4165 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4166 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4167 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4168 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4169 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4170 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4171 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
4172 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4173 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4174 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4175 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4176 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4178 ; GFX11-WGP-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4179 ; GFX11-WGP:       ; %bb.0: ; %entry
4180 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4181 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4182 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4183 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4184 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4185 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4186 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4187 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4188 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4189 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4190 ; GFX11-WGP-NEXT:    s_endpgm
4192 ; GFX11-CU-LABEL: global_agent_acquire_seq_cst_cmpxchg:
4193 ; GFX11-CU:       ; %bb.0: ; %entry
4194 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4195 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4196 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4197 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4198 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4199 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4200 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4201 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4202 ; GFX11-CU-NEXT:    buffer_gl0_inv
4203 ; GFX11-CU-NEXT:    buffer_gl1_inv
4204 ; GFX11-CU-NEXT:    s_endpgm
4205     ptr addrspace(1) %out, i32 %in, i32 %old) {
4206 entry:
4207   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4208   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire seq_cst
4209   ret void
4212 define amdgpu_kernel void @global_agent_release_seq_cst_cmpxchg(
4213 ; GFX6-LABEL: global_agent_release_seq_cst_cmpxchg:
4214 ; GFX6:       ; %bb.0: ; %entry
4215 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4216 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4217 ; GFX6-NEXT:    s_mov_b32 s6, -1
4218 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4219 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4220 ; GFX6-NEXT:    s_mov_b32 s4, s0
4221 ; GFX6-NEXT:    s_mov_b32 s5, s1
4222 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4223 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4224 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4225 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4226 ; GFX6-NEXT:    buffer_wbinvl1
4227 ; GFX6-NEXT:    s_endpgm
4229 ; GFX7-LABEL: global_agent_release_seq_cst_cmpxchg:
4230 ; GFX7:       ; %bb.0: ; %entry
4231 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4232 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4233 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
4234 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
4235 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4236 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4237 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4238 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4239 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4240 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
4241 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4242 ; GFX7-NEXT:    buffer_wbinvl1_vol
4243 ; GFX7-NEXT:    s_endpgm
4245 ; GFX10-WGP-LABEL: global_agent_release_seq_cst_cmpxchg:
4246 ; GFX10-WGP:       ; %bb.0: ; %entry
4247 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4248 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4249 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4250 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4251 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4252 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4253 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4254 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4255 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4256 ; GFX10-WGP-NEXT:    buffer_gl0_inv
4257 ; GFX10-WGP-NEXT:    buffer_gl1_inv
4258 ; GFX10-WGP-NEXT:    s_endpgm
4260 ; GFX10-CU-LABEL: global_agent_release_seq_cst_cmpxchg:
4261 ; GFX10-CU:       ; %bb.0: ; %entry
4262 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4263 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4264 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4265 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4266 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4267 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4268 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4269 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4270 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4271 ; GFX10-CU-NEXT:    buffer_gl0_inv
4272 ; GFX10-CU-NEXT:    buffer_gl1_inv
4273 ; GFX10-CU-NEXT:    s_endpgm
4275 ; SKIP-CACHE-INV-LABEL: global_agent_release_seq_cst_cmpxchg:
4276 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4277 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4278 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4279 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4280 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4281 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4282 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4283 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4284 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4285 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4286 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4287 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4288 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4290 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_seq_cst_cmpxchg:
4291 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4292 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4293 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4294 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4295 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4296 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4297 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4298 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4299 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
4300 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4302 ; GFX90A-TGSPLIT-LABEL: global_agent_release_seq_cst_cmpxchg:
4303 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4304 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4305 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4306 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4307 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4308 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4309 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4310 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4311 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
4312 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4314 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_seq_cst_cmpxchg:
4315 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4316 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4317 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4318 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4319 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4320 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
4321 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4322 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4323 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4324 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4325 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4327 ; GFX940-TGSPLIT-LABEL: global_agent_release_seq_cst_cmpxchg:
4328 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4329 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4330 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4331 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4332 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4333 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
4334 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4335 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4336 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4337 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4338 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4340 ; GFX11-WGP-LABEL: global_agent_release_seq_cst_cmpxchg:
4341 ; GFX11-WGP:       ; %bb.0: ; %entry
4342 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4343 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4344 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4345 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4346 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4347 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4348 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4349 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4350 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4351 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4352 ; GFX11-WGP-NEXT:    s_endpgm
4354 ; GFX11-CU-LABEL: global_agent_release_seq_cst_cmpxchg:
4355 ; GFX11-CU:       ; %bb.0: ; %entry
4356 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4357 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4358 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4359 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4360 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4361 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4362 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4363 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4364 ; GFX11-CU-NEXT:    buffer_gl0_inv
4365 ; GFX11-CU-NEXT:    buffer_gl1_inv
4366 ; GFX11-CU-NEXT:    s_endpgm
4367     ptr addrspace(1) %out, i32 %in, i32 %old) {
4368 entry:
4369   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4370   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release seq_cst
4371   ret void
4374 define amdgpu_kernel void @global_agent_acq_rel_seq_cst_cmpxchg(
4375 ; GFX6-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4376 ; GFX6:       ; %bb.0: ; %entry
4377 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4378 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4379 ; GFX6-NEXT:    s_mov_b32 s6, -1
4380 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4381 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4382 ; GFX6-NEXT:    s_mov_b32 s4, s0
4383 ; GFX6-NEXT:    s_mov_b32 s5, s1
4384 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4385 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4386 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4387 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4388 ; GFX6-NEXT:    buffer_wbinvl1
4389 ; GFX6-NEXT:    s_endpgm
4391 ; GFX7-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4392 ; GFX7:       ; %bb.0: ; %entry
4393 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4394 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4395 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
4396 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
4397 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4398 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4399 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4400 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4401 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4402 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
4403 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4404 ; GFX7-NEXT:    buffer_wbinvl1_vol
4405 ; GFX7-NEXT:    s_endpgm
4407 ; GFX10-WGP-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4408 ; GFX10-WGP:       ; %bb.0: ; %entry
4409 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4410 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4411 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4412 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4413 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4414 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4415 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4416 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4417 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4418 ; GFX10-WGP-NEXT:    buffer_gl0_inv
4419 ; GFX10-WGP-NEXT:    buffer_gl1_inv
4420 ; GFX10-WGP-NEXT:    s_endpgm
4422 ; GFX10-CU-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4423 ; GFX10-CU:       ; %bb.0: ; %entry
4424 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4425 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4426 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4427 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4428 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4429 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4430 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4431 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4432 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4433 ; GFX10-CU-NEXT:    buffer_gl0_inv
4434 ; GFX10-CU-NEXT:    buffer_gl1_inv
4435 ; GFX10-CU-NEXT:    s_endpgm
4437 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4438 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4439 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4440 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4441 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4442 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4443 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4444 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4445 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4446 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4447 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4448 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4449 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4450 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4452 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4453 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4454 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4455 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4456 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4457 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4458 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4459 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4460 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4461 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
4462 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4464 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4465 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4466 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4467 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4468 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4469 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4470 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4471 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4472 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4473 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
4474 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4476 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4477 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4478 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4479 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4480 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4481 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4482 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
4483 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4484 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4485 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4486 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4487 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4489 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4490 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4491 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4492 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4493 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4494 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4495 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
4496 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4497 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4498 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4499 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4500 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4502 ; GFX11-WGP-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4503 ; GFX11-WGP:       ; %bb.0: ; %entry
4504 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4505 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4506 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4507 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4508 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4509 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4510 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4511 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4512 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4513 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4514 ; GFX11-WGP-NEXT:    s_endpgm
4516 ; GFX11-CU-LABEL: global_agent_acq_rel_seq_cst_cmpxchg:
4517 ; GFX11-CU:       ; %bb.0: ; %entry
4518 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4519 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4520 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4521 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4522 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4523 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4524 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4525 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4526 ; GFX11-CU-NEXT:    buffer_gl0_inv
4527 ; GFX11-CU-NEXT:    buffer_gl1_inv
4528 ; GFX11-CU-NEXT:    s_endpgm
4529     ptr addrspace(1) %out, i32 %in, i32 %old) {
4530 entry:
4531   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4532   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel seq_cst
4533   ret void
4536 define amdgpu_kernel void @global_agent_seq_cst_seq_cst_cmpxchg(
4537 ; GFX6-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4538 ; GFX6:       ; %bb.0: ; %entry
4539 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4540 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4541 ; GFX6-NEXT:    s_mov_b32 s6, -1
4542 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4543 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4544 ; GFX6-NEXT:    s_mov_b32 s4, s0
4545 ; GFX6-NEXT:    s_mov_b32 s5, s1
4546 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4547 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4548 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4549 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4550 ; GFX6-NEXT:    buffer_wbinvl1
4551 ; GFX6-NEXT:    s_endpgm
4553 ; GFX7-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4554 ; GFX7:       ; %bb.0: ; %entry
4555 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4556 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4557 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
4558 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
4559 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4560 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4561 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4562 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4563 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4564 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
4565 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4566 ; GFX7-NEXT:    buffer_wbinvl1_vol
4567 ; GFX7-NEXT:    s_endpgm
4569 ; GFX10-WGP-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4570 ; GFX10-WGP:       ; %bb.0: ; %entry
4571 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4572 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4573 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4574 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4575 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4576 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4577 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4578 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4579 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4580 ; GFX10-WGP-NEXT:    buffer_gl0_inv
4581 ; GFX10-WGP-NEXT:    buffer_gl1_inv
4582 ; GFX10-WGP-NEXT:    s_endpgm
4584 ; GFX10-CU-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4585 ; GFX10-CU:       ; %bb.0: ; %entry
4586 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4587 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4588 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4589 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4590 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4591 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4592 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4593 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4594 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4595 ; GFX10-CU-NEXT:    buffer_gl0_inv
4596 ; GFX10-CU-NEXT:    buffer_gl1_inv
4597 ; GFX10-CU-NEXT:    s_endpgm
4599 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4600 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4601 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4602 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4603 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4604 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4605 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4606 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4607 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4608 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4609 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4610 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
4611 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4612 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4614 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4615 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4616 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4617 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4618 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4619 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4620 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4621 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4622 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4623 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
4624 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4626 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4627 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4628 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4629 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4630 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4631 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4632 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4633 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4634 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4635 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
4636 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4638 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4639 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4640 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4641 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4642 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4643 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4644 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
4645 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4646 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4647 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4648 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4649 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4651 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4652 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4653 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4654 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4655 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4656 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4657 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
4658 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4659 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
4660 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4661 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4662 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4664 ; GFX11-WGP-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4665 ; GFX11-WGP:       ; %bb.0: ; %entry
4666 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4667 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4668 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4669 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4670 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4671 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4672 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4673 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
4674 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4675 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4676 ; GFX11-WGP-NEXT:    s_endpgm
4678 ; GFX11-CU-LABEL: global_agent_seq_cst_seq_cst_cmpxchg:
4679 ; GFX11-CU:       ; %bb.0: ; %entry
4680 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4681 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4682 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4683 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4684 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
4685 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4686 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
4687 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
4688 ; GFX11-CU-NEXT:    buffer_gl0_inv
4689 ; GFX11-CU-NEXT:    buffer_gl1_inv
4690 ; GFX11-CU-NEXT:    s_endpgm
4691     ptr addrspace(1) %out, i32 %in, i32 %old) {
4692 entry:
4693   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4694   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
4695   ret void
4698 define amdgpu_kernel void @global_agent_monotonic_monotonic_ret_cmpxchg(
4699 ; GFX6-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4700 ; GFX6:       ; %bb.0: ; %entry
4701 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4702 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4703 ; GFX6-NEXT:    s_mov_b32 s6, -1
4704 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4705 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4706 ; GFX6-NEXT:    s_mov_b32 s4, s0
4707 ; GFX6-NEXT:    s_mov_b32 s5, s1
4708 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4709 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4710 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4711 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
4712 ; GFX6-NEXT:    s_endpgm
4714 ; GFX7-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4715 ; GFX7:       ; %bb.0: ; %entry
4716 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4717 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4718 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
4719 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
4720 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
4721 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4722 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
4723 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4724 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
4725 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4726 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4727 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4728 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
4729 ; GFX7-NEXT:    s_endpgm
4731 ; GFX10-WGP-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4732 ; GFX10-WGP:       ; %bb.0: ; %entry
4733 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4734 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4735 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4736 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4737 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4738 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4739 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
4740 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
4741 ; GFX10-WGP-NEXT:    s_endpgm
4743 ; GFX10-CU-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4744 ; GFX10-CU:       ; %bb.0: ; %entry
4745 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4746 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4747 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4748 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4749 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4750 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4751 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
4752 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
4753 ; GFX10-CU-NEXT:    s_endpgm
4755 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4756 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4757 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4758 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4759 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4760 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4761 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4762 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4763 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4764 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4765 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4766 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4767 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
4768 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4770 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4771 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4772 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4773 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4774 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4775 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4776 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4777 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4778 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
4779 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4781 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4782 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4783 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4784 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4785 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4786 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4787 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4788 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4789 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
4790 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4792 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4793 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4794 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4795 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4796 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4797 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4798 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
4799 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4800 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
4801 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4803 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4804 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4805 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4806 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4807 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4808 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4809 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
4810 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4811 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
4812 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4814 ; GFX11-WGP-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4815 ; GFX11-WGP:       ; %bb.0: ; %entry
4816 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4817 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4818 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4819 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4820 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
4821 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
4822 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
4823 ; GFX11-WGP-NEXT:    s_nop 0
4824 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4825 ; GFX11-WGP-NEXT:    s_endpgm
4827 ; GFX11-CU-LABEL: global_agent_monotonic_monotonic_ret_cmpxchg:
4828 ; GFX11-CU:       ; %bb.0: ; %entry
4829 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4830 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4831 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4832 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4833 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
4834 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
4835 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
4836 ; GFX11-CU-NEXT:    s_nop 0
4837 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4838 ; GFX11-CU-NEXT:    s_endpgm
4839     ptr addrspace(1) %out, i32 %in, i32 %old) {
4840 entry:
4841   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
4842   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic monotonic
4843   %val0 = extractvalue { i32, i1 } %val, 0
4844   store i32 %val0, ptr addrspace(1) %out, align 4
4845   ret void
4848 define amdgpu_kernel void @global_agent_acquire_monotonic_ret_cmpxchg(
4849 ; GFX6-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4850 ; GFX6:       ; %bb.0: ; %entry
4851 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4852 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
4853 ; GFX6-NEXT:    s_mov_b32 s6, -1
4854 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4855 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4856 ; GFX6-NEXT:    s_mov_b32 s4, s0
4857 ; GFX6-NEXT:    s_mov_b32 s5, s1
4858 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
4859 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4860 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
4861 ; GFX6-NEXT:    buffer_wbinvl1
4862 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
4863 ; GFX6-NEXT:    s_endpgm
4865 ; GFX7-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4866 ; GFX7:       ; %bb.0: ; %entry
4867 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4868 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4869 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
4870 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
4871 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
4872 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
4873 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
4874 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
4875 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
4876 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
4877 ; GFX7-NEXT:    buffer_wbinvl1_vol
4878 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4879 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4880 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
4881 ; GFX7-NEXT:    s_endpgm
4883 ; GFX10-WGP-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4884 ; GFX10-WGP:       ; %bb.0: ; %entry
4885 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4886 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
4887 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4888 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
4889 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
4890 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4891 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
4892 ; GFX10-WGP-NEXT:    buffer_gl0_inv
4893 ; GFX10-WGP-NEXT:    buffer_gl1_inv
4894 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
4895 ; GFX10-WGP-NEXT:    s_endpgm
4897 ; GFX10-CU-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4898 ; GFX10-CU:       ; %bb.0: ; %entry
4899 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4900 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
4901 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4902 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
4903 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
4904 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4905 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
4906 ; GFX10-CU-NEXT:    buffer_gl0_inv
4907 ; GFX10-CU-NEXT:    buffer_gl1_inv
4908 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
4909 ; GFX10-CU-NEXT:    s_endpgm
4911 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4912 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4913 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4914 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
4915 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
4916 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4917 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
4918 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
4919 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
4920 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
4921 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
4922 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
4923 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
4924 ; SKIP-CACHE-INV-NEXT:    s_endpgm
4926 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4927 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4928 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4929 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4930 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4931 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4932 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4933 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4934 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
4935 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
4936 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4938 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4939 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4940 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4941 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4942 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4943 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
4944 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
4945 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4946 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
4947 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
4948 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
4950 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4951 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4952 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4953 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4954 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4955 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4956 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
4957 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4958 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
4959 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
4960 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4962 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4963 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4964 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4965 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
4966 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4967 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
4968 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
4969 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
4970 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
4971 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
4972 ; GFX940-TGSPLIT-NEXT:    s_endpgm
4974 ; GFX11-WGP-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4975 ; GFX11-WGP:       ; %bb.0: ; %entry
4976 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4977 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
4978 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4979 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4980 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
4981 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
4982 ; GFX11-WGP-NEXT:    buffer_gl0_inv
4983 ; GFX11-WGP-NEXT:    buffer_gl1_inv
4984 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
4985 ; GFX11-WGP-NEXT:    s_nop 0
4986 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
4987 ; GFX11-WGP-NEXT:    s_endpgm
4989 ; GFX11-CU-LABEL: global_agent_acquire_monotonic_ret_cmpxchg:
4990 ; GFX11-CU:       ; %bb.0: ; %entry
4991 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
4992 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
4993 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
4994 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
4995 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
4996 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
4997 ; GFX11-CU-NEXT:    buffer_gl0_inv
4998 ; GFX11-CU-NEXT:    buffer_gl1_inv
4999 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5000 ; GFX11-CU-NEXT:    s_nop 0
5001 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5002 ; GFX11-CU-NEXT:    s_endpgm
5003     ptr addrspace(1) %out, i32 %in, i32 %old) {
5004 entry:
5005   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5006   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire monotonic
5007   %val0 = extractvalue { i32, i1 } %val, 0
5008   store i32 %val0, ptr addrspace(1) %out, align 4
5009   ret void
5012 define amdgpu_kernel void @global_agent_release_monotonic_ret_cmpxchg(
5013 ; GFX6-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5014 ; GFX6:       ; %bb.0: ; %entry
5015 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5016 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5017 ; GFX6-NEXT:    s_mov_b32 s6, -1
5018 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5019 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5020 ; GFX6-NEXT:    s_mov_b32 s4, s0
5021 ; GFX6-NEXT:    s_mov_b32 s5, s1
5022 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5023 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5024 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5025 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5026 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5027 ; GFX6-NEXT:    s_endpgm
5029 ; GFX7-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5030 ; GFX7:       ; %bb.0: ; %entry
5031 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5032 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5033 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5034 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5035 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5036 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5037 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5038 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5039 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5040 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5041 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5042 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5043 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5044 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5045 ; GFX7-NEXT:    s_endpgm
5047 ; GFX10-WGP-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5048 ; GFX10-WGP:       ; %bb.0: ; %entry
5049 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5050 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5051 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5052 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5053 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5054 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5055 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5056 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5057 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5058 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5059 ; GFX10-WGP-NEXT:    s_endpgm
5061 ; GFX10-CU-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5062 ; GFX10-CU:       ; %bb.0: ; %entry
5063 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5064 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5065 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5066 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5067 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5068 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5069 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5070 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5071 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5072 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5073 ; GFX10-CU-NEXT:    s_endpgm
5075 ; SKIP-CACHE-INV-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5076 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5077 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5078 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5079 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5080 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5081 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5082 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5083 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5084 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5085 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5086 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5087 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5088 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5089 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5091 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5092 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5093 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5094 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5095 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5096 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5097 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5098 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5099 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5100 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5101 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5103 ; GFX90A-TGSPLIT-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5104 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5105 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5106 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5107 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5108 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5109 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5110 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5111 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5112 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5113 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5115 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5116 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5117 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5118 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5119 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5120 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5121 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
5122 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5123 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5124 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5125 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5126 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5128 ; GFX940-TGSPLIT-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5129 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5130 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5131 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5132 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5133 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5134 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
5135 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5136 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5137 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5138 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5139 ; GFX940-TGSPLIT-NEXT:    s_endpgm
5141 ; GFX11-WGP-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5142 ; GFX11-WGP:       ; %bb.0: ; %entry
5143 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5144 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
5145 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5146 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5147 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5148 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5149 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5150 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
5151 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
5152 ; GFX11-WGP-NEXT:    s_nop 0
5153 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5154 ; GFX11-WGP-NEXT:    s_endpgm
5156 ; GFX11-CU-LABEL: global_agent_release_monotonic_ret_cmpxchg:
5157 ; GFX11-CU:       ; %bb.0: ; %entry
5158 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5159 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
5160 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
5161 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5162 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5163 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5164 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5165 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
5166 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5167 ; GFX11-CU-NEXT:    s_nop 0
5168 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5169 ; GFX11-CU-NEXT:    s_endpgm
5170     ptr addrspace(1) %out, i32 %in, i32 %old) {
5171 entry:
5172   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5173   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release monotonic
5174   %val0 = extractvalue { i32, i1 } %val, 0
5175   store i32 %val0, ptr addrspace(1) %out, align 4
5176   ret void
5179 define amdgpu_kernel void @global_agent_acq_rel_monotonic_ret_cmpxchg(
5180 ; GFX6-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5181 ; GFX6:       ; %bb.0: ; %entry
5182 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5183 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5184 ; GFX6-NEXT:    s_mov_b32 s6, -1
5185 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5186 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5187 ; GFX6-NEXT:    s_mov_b32 s4, s0
5188 ; GFX6-NEXT:    s_mov_b32 s5, s1
5189 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5190 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5191 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5192 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5193 ; GFX6-NEXT:    buffer_wbinvl1
5194 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5195 ; GFX6-NEXT:    s_endpgm
5197 ; GFX7-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5198 ; GFX7:       ; %bb.0: ; %entry
5199 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5200 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5201 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5202 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5203 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5204 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5205 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5206 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5207 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5208 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5209 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5210 ; GFX7-NEXT:    buffer_wbinvl1_vol
5211 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5212 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5213 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5214 ; GFX7-NEXT:    s_endpgm
5216 ; GFX10-WGP-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5217 ; GFX10-WGP:       ; %bb.0: ; %entry
5218 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5219 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5220 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5221 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5222 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5223 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5224 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5225 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5226 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5227 ; GFX10-WGP-NEXT:    buffer_gl0_inv
5228 ; GFX10-WGP-NEXT:    buffer_gl1_inv
5229 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5230 ; GFX10-WGP-NEXT:    s_endpgm
5232 ; GFX10-CU-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5233 ; GFX10-CU:       ; %bb.0: ; %entry
5234 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5235 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5236 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5237 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5238 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5239 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5240 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5241 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5242 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5243 ; GFX10-CU-NEXT:    buffer_gl0_inv
5244 ; GFX10-CU-NEXT:    buffer_gl1_inv
5245 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5246 ; GFX10-CU-NEXT:    s_endpgm
5248 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5249 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5250 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5251 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5252 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5253 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5254 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5255 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5256 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5257 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5258 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5259 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5260 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5261 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5262 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5264 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5265 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5266 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5267 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5268 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5269 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5270 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5271 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5272 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5273 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
5274 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5275 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5277 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5278 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5279 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5280 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5281 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5282 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5283 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5284 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5285 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5286 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
5287 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5288 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5290 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5291 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5292 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5293 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5294 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5295 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5296 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
5297 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5298 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5299 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5300 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
5301 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5302 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5304 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5305 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5306 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5307 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5308 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5309 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5310 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
5311 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5312 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5313 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5314 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
5315 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5316 ; GFX940-TGSPLIT-NEXT:    s_endpgm
5318 ; GFX11-WGP-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5319 ; GFX11-WGP:       ; %bb.0: ; %entry
5320 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5321 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
5322 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5323 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5324 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5325 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5326 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5327 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
5328 ; GFX11-WGP-NEXT:    buffer_gl0_inv
5329 ; GFX11-WGP-NEXT:    buffer_gl1_inv
5330 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
5331 ; GFX11-WGP-NEXT:    s_nop 0
5332 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5333 ; GFX11-WGP-NEXT:    s_endpgm
5335 ; GFX11-CU-LABEL: global_agent_acq_rel_monotonic_ret_cmpxchg:
5336 ; GFX11-CU:       ; %bb.0: ; %entry
5337 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5338 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
5339 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
5340 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5341 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5342 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5343 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5344 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
5345 ; GFX11-CU-NEXT:    buffer_gl0_inv
5346 ; GFX11-CU-NEXT:    buffer_gl1_inv
5347 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5348 ; GFX11-CU-NEXT:    s_nop 0
5349 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5350 ; GFX11-CU-NEXT:    s_endpgm
5351     ptr addrspace(1) %out, i32 %in, i32 %old) {
5352 entry:
5353   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5354   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel monotonic
5355   %val0 = extractvalue { i32, i1 } %val, 0
5356   store i32 %val0, ptr addrspace(1) %out, align 4
5357   ret void
5360 define amdgpu_kernel void @global_agent_seq_cst_monotonic_ret_cmpxchg(
5361 ; GFX6-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5362 ; GFX6:       ; %bb.0: ; %entry
5363 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5364 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5365 ; GFX6-NEXT:    s_mov_b32 s6, -1
5366 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5367 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5368 ; GFX6-NEXT:    s_mov_b32 s4, s0
5369 ; GFX6-NEXT:    s_mov_b32 s5, s1
5370 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5371 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5372 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5373 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5374 ; GFX6-NEXT:    buffer_wbinvl1
5375 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5376 ; GFX6-NEXT:    s_endpgm
5378 ; GFX7-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5379 ; GFX7:       ; %bb.0: ; %entry
5380 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5381 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5382 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5383 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5384 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5385 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5386 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5387 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5388 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5389 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5390 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5391 ; GFX7-NEXT:    buffer_wbinvl1_vol
5392 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5393 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5394 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5395 ; GFX7-NEXT:    s_endpgm
5397 ; GFX10-WGP-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5398 ; GFX10-WGP:       ; %bb.0: ; %entry
5399 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5400 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5401 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5402 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5403 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5404 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5405 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5406 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5407 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5408 ; GFX10-WGP-NEXT:    buffer_gl0_inv
5409 ; GFX10-WGP-NEXT:    buffer_gl1_inv
5410 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5411 ; GFX10-WGP-NEXT:    s_endpgm
5413 ; GFX10-CU-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5414 ; GFX10-CU:       ; %bb.0: ; %entry
5415 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5416 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5417 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5418 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5419 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5420 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5421 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5422 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5423 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5424 ; GFX10-CU-NEXT:    buffer_gl0_inv
5425 ; GFX10-CU-NEXT:    buffer_gl1_inv
5426 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5427 ; GFX10-CU-NEXT:    s_endpgm
5429 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5430 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5431 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5432 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5433 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5434 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5435 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5436 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5437 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5438 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5439 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5440 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5441 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5442 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5443 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5445 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5446 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5447 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5448 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5449 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5450 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5451 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5452 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5453 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5454 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
5455 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5456 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5458 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5459 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5460 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5461 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5462 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5463 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5464 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5465 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5466 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5467 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
5468 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5469 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5471 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5472 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5473 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5474 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5475 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5476 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5477 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
5478 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5479 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5480 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5481 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
5482 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5483 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5485 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5486 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5487 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5488 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5489 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5490 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5491 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
5492 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5493 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5494 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5495 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
5496 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5497 ; GFX940-TGSPLIT-NEXT:    s_endpgm
5499 ; GFX11-WGP-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5500 ; GFX11-WGP:       ; %bb.0: ; %entry
5501 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5502 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
5503 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5504 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5505 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5506 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5507 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5508 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
5509 ; GFX11-WGP-NEXT:    buffer_gl0_inv
5510 ; GFX11-WGP-NEXT:    buffer_gl1_inv
5511 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
5512 ; GFX11-WGP-NEXT:    s_nop 0
5513 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5514 ; GFX11-WGP-NEXT:    s_endpgm
5516 ; GFX11-CU-LABEL: global_agent_seq_cst_monotonic_ret_cmpxchg:
5517 ; GFX11-CU:       ; %bb.0: ; %entry
5518 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5519 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
5520 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
5521 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5522 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5523 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5524 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5525 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
5526 ; GFX11-CU-NEXT:    buffer_gl0_inv
5527 ; GFX11-CU-NEXT:    buffer_gl1_inv
5528 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5529 ; GFX11-CU-NEXT:    s_nop 0
5530 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5531 ; GFX11-CU-NEXT:    s_endpgm
5532     ptr addrspace(1) %out, i32 %in, i32 %old) {
5533 entry:
5534   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5535   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst monotonic
5536   %val0 = extractvalue { i32, i1 } %val, 0
5537   store i32 %val0, ptr addrspace(1) %out, align 4
5538   ret void
5541 define amdgpu_kernel void @global_agent_monotonic_acquire_ret_cmpxchg(
5542 ; GFX6-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5543 ; GFX6:       ; %bb.0: ; %entry
5544 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5545 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5546 ; GFX6-NEXT:    s_mov_b32 s6, -1
5547 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5548 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5549 ; GFX6-NEXT:    s_mov_b32 s4, s0
5550 ; GFX6-NEXT:    s_mov_b32 s5, s1
5551 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5552 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5553 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5554 ; GFX6-NEXT:    buffer_wbinvl1
5555 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5556 ; GFX6-NEXT:    s_endpgm
5558 ; GFX7-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5559 ; GFX7:       ; %bb.0: ; %entry
5560 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5561 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5562 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5563 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5564 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5565 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5566 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5567 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5568 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5569 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5570 ; GFX7-NEXT:    buffer_wbinvl1_vol
5571 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5572 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5573 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5574 ; GFX7-NEXT:    s_endpgm
5576 ; GFX10-WGP-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5577 ; GFX10-WGP:       ; %bb.0: ; %entry
5578 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5579 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5580 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5581 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5582 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5583 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5584 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5585 ; GFX10-WGP-NEXT:    buffer_gl0_inv
5586 ; GFX10-WGP-NEXT:    buffer_gl1_inv
5587 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5588 ; GFX10-WGP-NEXT:    s_endpgm
5590 ; GFX10-CU-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5591 ; GFX10-CU:       ; %bb.0: ; %entry
5592 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5593 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5594 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5595 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5596 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5597 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5598 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5599 ; GFX10-CU-NEXT:    buffer_gl0_inv
5600 ; GFX10-CU-NEXT:    buffer_gl1_inv
5601 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5602 ; GFX10-CU-NEXT:    s_endpgm
5604 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5605 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5606 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5607 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5608 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5609 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5610 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5611 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5612 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5613 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5614 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5615 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5616 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5617 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5619 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5620 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5621 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5622 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5623 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5624 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5625 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5626 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5627 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
5628 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5629 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5631 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5632 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5633 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5634 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5635 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5636 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5637 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5638 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5639 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
5640 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5641 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5643 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5644 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5645 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5646 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5647 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5648 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5649 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5650 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5651 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
5652 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5653 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5655 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5656 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5657 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5658 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5659 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5660 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5661 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5662 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5663 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
5664 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5665 ; GFX940-TGSPLIT-NEXT:    s_endpgm
5667 ; GFX11-WGP-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5668 ; GFX11-WGP:       ; %bb.0: ; %entry
5669 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5670 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
5671 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5672 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5673 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5674 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
5675 ; GFX11-WGP-NEXT:    buffer_gl0_inv
5676 ; GFX11-WGP-NEXT:    buffer_gl1_inv
5677 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
5678 ; GFX11-WGP-NEXT:    s_nop 0
5679 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5680 ; GFX11-WGP-NEXT:    s_endpgm
5682 ; GFX11-CU-LABEL: global_agent_monotonic_acquire_ret_cmpxchg:
5683 ; GFX11-CU:       ; %bb.0: ; %entry
5684 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5685 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
5686 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
5687 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5688 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5689 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
5690 ; GFX11-CU-NEXT:    buffer_gl0_inv
5691 ; GFX11-CU-NEXT:    buffer_gl1_inv
5692 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5693 ; GFX11-CU-NEXT:    s_nop 0
5694 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5695 ; GFX11-CU-NEXT:    s_endpgm
5696     ptr addrspace(1) %out, i32 %in, i32 %old) {
5697 entry:
5698   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5699   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic acquire
5700   %val0 = extractvalue { i32, i1 } %val, 0
5701   store i32 %val0, ptr addrspace(1) %out, align 4
5702   ret void
5705 define amdgpu_kernel void @global_agent_acquire_acquire_ret_cmpxchg(
5706 ; GFX6-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5707 ; GFX6:       ; %bb.0: ; %entry
5708 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5709 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5710 ; GFX6-NEXT:    s_mov_b32 s6, -1
5711 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5712 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5713 ; GFX6-NEXT:    s_mov_b32 s4, s0
5714 ; GFX6-NEXT:    s_mov_b32 s5, s1
5715 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5716 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5717 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5718 ; GFX6-NEXT:    buffer_wbinvl1
5719 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5720 ; GFX6-NEXT:    s_endpgm
5722 ; GFX7-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5723 ; GFX7:       ; %bb.0: ; %entry
5724 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5725 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5726 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5727 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5728 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5729 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5730 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5731 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5732 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5733 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5734 ; GFX7-NEXT:    buffer_wbinvl1_vol
5735 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5736 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5737 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5738 ; GFX7-NEXT:    s_endpgm
5740 ; GFX10-WGP-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5741 ; GFX10-WGP:       ; %bb.0: ; %entry
5742 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5743 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5744 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5745 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5746 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5747 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5748 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5749 ; GFX10-WGP-NEXT:    buffer_gl0_inv
5750 ; GFX10-WGP-NEXT:    buffer_gl1_inv
5751 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5752 ; GFX10-WGP-NEXT:    s_endpgm
5754 ; GFX10-CU-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5755 ; GFX10-CU:       ; %bb.0: ; %entry
5756 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5757 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5758 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5759 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5760 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5761 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5762 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5763 ; GFX10-CU-NEXT:    buffer_gl0_inv
5764 ; GFX10-CU-NEXT:    buffer_gl1_inv
5765 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5766 ; GFX10-CU-NEXT:    s_endpgm
5768 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5769 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5770 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5771 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5772 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5773 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5774 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5775 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5776 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5777 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5778 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5779 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5780 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5781 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5783 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5784 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5785 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5786 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5787 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5788 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5789 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5790 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5791 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
5792 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5793 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5795 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5796 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5797 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5798 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5799 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5800 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5801 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5802 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5803 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
5804 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5805 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5807 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5808 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5809 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5810 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5811 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5812 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5813 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5814 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5815 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
5816 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5817 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5819 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5820 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5821 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5822 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5823 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5824 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5825 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5826 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5827 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
5828 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5829 ; GFX940-TGSPLIT-NEXT:    s_endpgm
5831 ; GFX11-WGP-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5832 ; GFX11-WGP:       ; %bb.0: ; %entry
5833 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5834 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
5835 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5836 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5837 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5838 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
5839 ; GFX11-WGP-NEXT:    buffer_gl0_inv
5840 ; GFX11-WGP-NEXT:    buffer_gl1_inv
5841 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
5842 ; GFX11-WGP-NEXT:    s_nop 0
5843 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5844 ; GFX11-WGP-NEXT:    s_endpgm
5846 ; GFX11-CU-LABEL: global_agent_acquire_acquire_ret_cmpxchg:
5847 ; GFX11-CU:       ; %bb.0: ; %entry
5848 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
5849 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
5850 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
5851 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
5852 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
5853 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
5854 ; GFX11-CU-NEXT:    buffer_gl0_inv
5855 ; GFX11-CU-NEXT:    buffer_gl1_inv
5856 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
5857 ; GFX11-CU-NEXT:    s_nop 0
5858 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
5859 ; GFX11-CU-NEXT:    s_endpgm
5860     ptr addrspace(1) %out, i32 %in, i32 %old) {
5861 entry:
5862   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
5863   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire acquire
5864   %val0 = extractvalue { i32, i1 } %val, 0
5865   store i32 %val0, ptr addrspace(1) %out, align 4
5866   ret void
5869 define amdgpu_kernel void @global_agent_release_acquire_ret_cmpxchg(
5870 ; GFX6-LABEL: global_agent_release_acquire_ret_cmpxchg:
5871 ; GFX6:       ; %bb.0: ; %entry
5872 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5873 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
5874 ; GFX6-NEXT:    s_mov_b32 s6, -1
5875 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5876 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
5877 ; GFX6-NEXT:    s_mov_b32 s4, s0
5878 ; GFX6-NEXT:    s_mov_b32 s5, s1
5879 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
5880 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5881 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5882 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
5883 ; GFX6-NEXT:    buffer_wbinvl1
5884 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5885 ; GFX6-NEXT:    s_endpgm
5887 ; GFX7-LABEL: global_agent_release_acquire_ret_cmpxchg:
5888 ; GFX7:       ; %bb.0: ; %entry
5889 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5890 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5891 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
5892 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
5893 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
5894 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
5895 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
5896 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
5897 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5898 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
5899 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
5900 ; GFX7-NEXT:    buffer_wbinvl1_vol
5901 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5902 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5903 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
5904 ; GFX7-NEXT:    s_endpgm
5906 ; GFX10-WGP-LABEL: global_agent_release_acquire_ret_cmpxchg:
5907 ; GFX10-WGP:       ; %bb.0: ; %entry
5908 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5909 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
5910 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5911 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
5912 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
5913 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5914 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
5915 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5916 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
5917 ; GFX10-WGP-NEXT:    buffer_gl0_inv
5918 ; GFX10-WGP-NEXT:    buffer_gl1_inv
5919 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
5920 ; GFX10-WGP-NEXT:    s_endpgm
5922 ; GFX10-CU-LABEL: global_agent_release_acquire_ret_cmpxchg:
5923 ; GFX10-CU:       ; %bb.0: ; %entry
5924 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5925 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
5926 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5927 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
5928 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
5929 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5930 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
5931 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5932 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
5933 ; GFX10-CU-NEXT:    buffer_gl0_inv
5934 ; GFX10-CU-NEXT:    buffer_gl1_inv
5935 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
5936 ; GFX10-CU-NEXT:    s_endpgm
5938 ; SKIP-CACHE-INV-LABEL: global_agent_release_acquire_ret_cmpxchg:
5939 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5940 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5941 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
5942 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
5943 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5944 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
5945 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
5946 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
5947 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
5948 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5949 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
5950 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
5951 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
5952 ; SKIP-CACHE-INV-NEXT:    s_endpgm
5954 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_acquire_ret_cmpxchg:
5955 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5956 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5957 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5958 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5959 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5960 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5961 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5962 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5963 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
5964 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5965 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5967 ; GFX90A-TGSPLIT-LABEL: global_agent_release_acquire_ret_cmpxchg:
5968 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5969 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
5970 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5971 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5972 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
5973 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5974 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
5975 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5976 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
5977 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
5978 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
5980 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_acquire_ret_cmpxchg:
5981 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5982 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5983 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5984 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5985 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
5986 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
5987 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
5988 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
5989 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
5990 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
5991 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
5992 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5994 ; GFX940-TGSPLIT-LABEL: global_agent_release_acquire_ret_cmpxchg:
5995 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5996 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
5997 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
5998 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5999 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6000 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6001 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6002 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6003 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6004 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6005 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6006 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6008 ; GFX11-WGP-LABEL: global_agent_release_acquire_ret_cmpxchg:
6009 ; GFX11-WGP:       ; %bb.0: ; %entry
6010 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6011 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6012 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6013 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6014 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6015 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6016 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6017 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6018 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6019 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6020 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6021 ; GFX11-WGP-NEXT:    s_nop 0
6022 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6023 ; GFX11-WGP-NEXT:    s_endpgm
6025 ; GFX11-CU-LABEL: global_agent_release_acquire_ret_cmpxchg:
6026 ; GFX11-CU:       ; %bb.0: ; %entry
6027 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6028 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6029 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6030 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6031 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6032 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6033 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6034 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6035 ; GFX11-CU-NEXT:    buffer_gl0_inv
6036 ; GFX11-CU-NEXT:    buffer_gl1_inv
6037 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6038 ; GFX11-CU-NEXT:    s_nop 0
6039 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6040 ; GFX11-CU-NEXT:    s_endpgm
6041     ptr addrspace(1) %out, i32 %in, i32 %old) {
6042 entry:
6043   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6044   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release acquire
6045   %val0 = extractvalue { i32, i1 } %val, 0
6046   store i32 %val0, ptr addrspace(1) %out, align 4
6047   ret void
6050 define amdgpu_kernel void @global_agent_acq_rel_acquire_ret_cmpxchg(
6051 ; GFX6-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6052 ; GFX6:       ; %bb.0: ; %entry
6053 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6054 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6055 ; GFX6-NEXT:    s_mov_b32 s6, -1
6056 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6057 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6058 ; GFX6-NEXT:    s_mov_b32 s4, s0
6059 ; GFX6-NEXT:    s_mov_b32 s5, s1
6060 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6061 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6062 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6063 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6064 ; GFX6-NEXT:    buffer_wbinvl1
6065 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6066 ; GFX6-NEXT:    s_endpgm
6068 ; GFX7-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6069 ; GFX7:       ; %bb.0: ; %entry
6070 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6071 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6072 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6073 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6074 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6075 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6076 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6077 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6078 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6079 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6080 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6081 ; GFX7-NEXT:    buffer_wbinvl1_vol
6082 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6083 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6084 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6085 ; GFX7-NEXT:    s_endpgm
6087 ; GFX10-WGP-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6088 ; GFX10-WGP:       ; %bb.0: ; %entry
6089 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6090 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6091 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6092 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6093 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6094 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6095 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6096 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6097 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
6098 ; GFX10-WGP-NEXT:    buffer_gl0_inv
6099 ; GFX10-WGP-NEXT:    buffer_gl1_inv
6100 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
6101 ; GFX10-WGP-NEXT:    s_endpgm
6103 ; GFX10-CU-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6104 ; GFX10-CU:       ; %bb.0: ; %entry
6105 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6106 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
6107 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6108 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
6109 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
6110 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6111 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6112 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6113 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
6114 ; GFX10-CU-NEXT:    buffer_gl0_inv
6115 ; GFX10-CU-NEXT:    buffer_gl1_inv
6116 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
6117 ; GFX10-CU-NEXT:    s_endpgm
6119 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6120 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6121 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6122 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
6123 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
6124 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6125 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
6126 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
6127 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
6128 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
6129 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6130 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6131 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
6132 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6133 ; SKIP-CACHE-INV-NEXT:    s_endpgm
6135 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6136 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6137 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6138 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6139 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6140 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6141 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6142 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6143 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6144 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
6145 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6146 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6148 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6149 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6150 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6151 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6152 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6153 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6154 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6155 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6156 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6157 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
6158 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6159 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
6161 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6162 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6163 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6164 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6165 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6166 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6167 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
6168 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6169 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6170 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6171 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
6172 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6173 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6175 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6176 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6177 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6178 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6179 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6180 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6181 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6182 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6183 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6184 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6185 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6186 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6187 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6189 ; GFX11-WGP-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6190 ; GFX11-WGP:       ; %bb.0: ; %entry
6191 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6192 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6193 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6194 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6195 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6196 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6197 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6198 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6199 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6200 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6201 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6202 ; GFX11-WGP-NEXT:    s_nop 0
6203 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6204 ; GFX11-WGP-NEXT:    s_endpgm
6206 ; GFX11-CU-LABEL: global_agent_acq_rel_acquire_ret_cmpxchg:
6207 ; GFX11-CU:       ; %bb.0: ; %entry
6208 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6209 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6210 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6211 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6212 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6213 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6214 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6215 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6216 ; GFX11-CU-NEXT:    buffer_gl0_inv
6217 ; GFX11-CU-NEXT:    buffer_gl1_inv
6218 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6219 ; GFX11-CU-NEXT:    s_nop 0
6220 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6221 ; GFX11-CU-NEXT:    s_endpgm
6222     ptr addrspace(1) %out, i32 %in, i32 %old) {
6223 entry:
6224   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6225   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel acquire
6226   %val0 = extractvalue { i32, i1 } %val, 0
6227   store i32 %val0, ptr addrspace(1) %out, align 4
6228   ret void
6231 define amdgpu_kernel void @global_agent_seq_cst_acquire_ret_cmpxchg(
6232 ; GFX6-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6233 ; GFX6:       ; %bb.0: ; %entry
6234 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6235 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6236 ; GFX6-NEXT:    s_mov_b32 s6, -1
6237 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6238 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6239 ; GFX6-NEXT:    s_mov_b32 s4, s0
6240 ; GFX6-NEXT:    s_mov_b32 s5, s1
6241 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6242 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6243 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6244 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6245 ; GFX6-NEXT:    buffer_wbinvl1
6246 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6247 ; GFX6-NEXT:    s_endpgm
6249 ; GFX7-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6250 ; GFX7:       ; %bb.0: ; %entry
6251 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6252 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6253 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6254 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6255 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6256 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6257 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6258 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6259 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6260 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6261 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6262 ; GFX7-NEXT:    buffer_wbinvl1_vol
6263 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6264 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6265 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6266 ; GFX7-NEXT:    s_endpgm
6268 ; GFX10-WGP-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6269 ; GFX10-WGP:       ; %bb.0: ; %entry
6270 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6271 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6272 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6273 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6274 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6275 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6276 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6277 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6278 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
6279 ; GFX10-WGP-NEXT:    buffer_gl0_inv
6280 ; GFX10-WGP-NEXT:    buffer_gl1_inv
6281 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
6282 ; GFX10-WGP-NEXT:    s_endpgm
6284 ; GFX10-CU-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6285 ; GFX10-CU:       ; %bb.0: ; %entry
6286 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6287 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
6288 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6289 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
6290 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
6291 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6292 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6293 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6294 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
6295 ; GFX10-CU-NEXT:    buffer_gl0_inv
6296 ; GFX10-CU-NEXT:    buffer_gl1_inv
6297 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
6298 ; GFX10-CU-NEXT:    s_endpgm
6300 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6301 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6302 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6303 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
6304 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
6305 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6306 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
6307 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
6308 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
6309 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
6310 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6311 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6312 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
6313 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6314 ; SKIP-CACHE-INV-NEXT:    s_endpgm
6316 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6317 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6318 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6319 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6320 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6321 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6322 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6323 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6324 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6325 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
6326 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6327 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6329 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6330 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6331 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6332 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6333 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6334 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6335 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6336 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6337 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6338 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
6339 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6340 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
6342 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6343 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6344 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6345 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6346 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6347 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6348 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
6349 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6350 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6351 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6352 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
6353 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6354 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6356 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6357 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6358 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6359 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6360 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6361 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6362 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6363 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6364 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6365 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6366 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6367 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6368 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6370 ; GFX11-WGP-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6371 ; GFX11-WGP:       ; %bb.0: ; %entry
6372 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6373 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6374 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6375 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6376 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6377 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6378 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6379 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6380 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6381 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6382 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6383 ; GFX11-WGP-NEXT:    s_nop 0
6384 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6385 ; GFX11-WGP-NEXT:    s_endpgm
6387 ; GFX11-CU-LABEL: global_agent_seq_cst_acquire_ret_cmpxchg:
6388 ; GFX11-CU:       ; %bb.0: ; %entry
6389 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6390 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6391 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6392 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6393 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6394 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6395 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6396 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6397 ; GFX11-CU-NEXT:    buffer_gl0_inv
6398 ; GFX11-CU-NEXT:    buffer_gl1_inv
6399 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6400 ; GFX11-CU-NEXT:    s_nop 0
6401 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6402 ; GFX11-CU-NEXT:    s_endpgm
6403     ptr addrspace(1) %out, i32 %in, i32 %old) {
6404 entry:
6405   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6406   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst acquire
6407   %val0 = extractvalue { i32, i1 } %val, 0
6408   store i32 %val0, ptr addrspace(1) %out, align 4
6409   ret void
6412 define amdgpu_kernel void @global_agent_monotonic_seq_cst_ret_cmpxchg(
6413 ; GFX6-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6414 ; GFX6:       ; %bb.0: ; %entry
6415 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6416 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6417 ; GFX6-NEXT:    s_mov_b32 s6, -1
6418 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6419 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6420 ; GFX6-NEXT:    s_mov_b32 s4, s0
6421 ; GFX6-NEXT:    s_mov_b32 s5, s1
6422 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6423 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6424 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6425 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6426 ; GFX6-NEXT:    buffer_wbinvl1
6427 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6428 ; GFX6-NEXT:    s_endpgm
6430 ; GFX7-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6431 ; GFX7:       ; %bb.0: ; %entry
6432 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6433 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6434 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6435 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6436 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6437 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6438 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6439 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6440 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6441 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6442 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6443 ; GFX7-NEXT:    buffer_wbinvl1_vol
6444 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6445 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6446 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6447 ; GFX7-NEXT:    s_endpgm
6449 ; GFX10-WGP-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6450 ; GFX10-WGP:       ; %bb.0: ; %entry
6451 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6452 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6453 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6454 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6455 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6456 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6457 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6458 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6459 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
6460 ; GFX10-WGP-NEXT:    buffer_gl0_inv
6461 ; GFX10-WGP-NEXT:    buffer_gl1_inv
6462 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
6463 ; GFX10-WGP-NEXT:    s_endpgm
6465 ; GFX10-CU-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6466 ; GFX10-CU:       ; %bb.0: ; %entry
6467 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6468 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
6469 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6470 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
6471 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
6472 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6473 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6474 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6475 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
6476 ; GFX10-CU-NEXT:    buffer_gl0_inv
6477 ; GFX10-CU-NEXT:    buffer_gl1_inv
6478 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
6479 ; GFX10-CU-NEXT:    s_endpgm
6481 ; SKIP-CACHE-INV-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6482 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6483 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6484 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
6485 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
6486 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6487 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
6488 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
6489 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
6490 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
6491 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6492 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6493 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
6494 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6495 ; SKIP-CACHE-INV-NEXT:    s_endpgm
6497 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6498 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6499 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6500 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6501 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6502 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6503 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6504 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6505 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6506 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
6507 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6508 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6510 ; GFX90A-TGSPLIT-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6511 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6512 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6513 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6514 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6515 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6516 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6517 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6518 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6519 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
6520 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6521 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
6523 ; GFX940-NOTTGSPLIT-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6524 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6525 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6526 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6527 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6528 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6529 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
6530 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6531 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6532 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6533 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
6534 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6535 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6537 ; GFX940-TGSPLIT-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6538 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6539 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6540 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6541 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6542 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6543 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6544 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6545 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6546 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6547 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6548 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6549 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6551 ; GFX11-WGP-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6552 ; GFX11-WGP:       ; %bb.0: ; %entry
6553 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6554 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6555 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6556 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6557 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6558 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6559 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6560 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6561 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6562 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6563 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6564 ; GFX11-WGP-NEXT:    s_nop 0
6565 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6566 ; GFX11-WGP-NEXT:    s_endpgm
6568 ; GFX11-CU-LABEL: global_agent_monotonic_seq_cst_ret_cmpxchg:
6569 ; GFX11-CU:       ; %bb.0: ; %entry
6570 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6571 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6572 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6573 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6574 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6575 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6576 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6577 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6578 ; GFX11-CU-NEXT:    buffer_gl0_inv
6579 ; GFX11-CU-NEXT:    buffer_gl1_inv
6580 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6581 ; GFX11-CU-NEXT:    s_nop 0
6582 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6583 ; GFX11-CU-NEXT:    s_endpgm
6584     ptr addrspace(1) %out, i32 %in, i32 %old) {
6585 entry:
6586   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6587   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") monotonic seq_cst
6588   %val0 = extractvalue { i32, i1 } %val, 0
6589   store i32 %val0, ptr addrspace(1) %out, align 4
6590   ret void
6593 define amdgpu_kernel void @global_agent_acquire_seq_cst_ret_cmpxchg(
6594 ; GFX6-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6595 ; GFX6:       ; %bb.0: ; %entry
6596 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6597 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6598 ; GFX6-NEXT:    s_mov_b32 s6, -1
6599 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6600 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6601 ; GFX6-NEXT:    s_mov_b32 s4, s0
6602 ; GFX6-NEXT:    s_mov_b32 s5, s1
6603 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6604 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6605 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6606 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6607 ; GFX6-NEXT:    buffer_wbinvl1
6608 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6609 ; GFX6-NEXT:    s_endpgm
6611 ; GFX7-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6612 ; GFX7:       ; %bb.0: ; %entry
6613 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6614 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6615 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6616 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6617 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6618 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6619 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6620 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6621 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6622 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6623 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6624 ; GFX7-NEXT:    buffer_wbinvl1_vol
6625 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6626 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6627 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6628 ; GFX7-NEXT:    s_endpgm
6630 ; GFX10-WGP-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6631 ; GFX10-WGP:       ; %bb.0: ; %entry
6632 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6633 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6634 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6635 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6636 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6637 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6638 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6639 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6640 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
6641 ; GFX10-WGP-NEXT:    buffer_gl0_inv
6642 ; GFX10-WGP-NEXT:    buffer_gl1_inv
6643 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
6644 ; GFX10-WGP-NEXT:    s_endpgm
6646 ; GFX10-CU-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6647 ; GFX10-CU:       ; %bb.0: ; %entry
6648 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6649 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
6650 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6651 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
6652 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
6653 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6654 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6655 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6656 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
6657 ; GFX10-CU-NEXT:    buffer_gl0_inv
6658 ; GFX10-CU-NEXT:    buffer_gl1_inv
6659 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
6660 ; GFX10-CU-NEXT:    s_endpgm
6662 ; SKIP-CACHE-INV-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6663 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6664 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6665 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
6666 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
6667 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6668 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
6669 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
6670 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
6671 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
6672 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6673 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6674 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
6675 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6676 ; SKIP-CACHE-INV-NEXT:    s_endpgm
6678 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6679 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6680 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6681 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6682 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6683 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6684 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6685 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6686 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6687 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
6688 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6689 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6691 ; GFX90A-TGSPLIT-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6692 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6693 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6694 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6695 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6696 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6697 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6698 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6699 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6700 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
6701 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6702 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
6704 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6705 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6706 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6707 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6708 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6709 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6710 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
6711 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6712 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6713 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6714 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
6715 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6716 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6718 ; GFX940-TGSPLIT-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6719 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6720 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6721 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6722 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6723 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6724 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6725 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6726 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6727 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6728 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6729 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6730 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6732 ; GFX11-WGP-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6733 ; GFX11-WGP:       ; %bb.0: ; %entry
6734 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6735 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6736 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6737 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6738 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6739 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6740 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6741 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6742 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6743 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6744 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6745 ; GFX11-WGP-NEXT:    s_nop 0
6746 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6747 ; GFX11-WGP-NEXT:    s_endpgm
6749 ; GFX11-CU-LABEL: global_agent_acquire_seq_cst_ret_cmpxchg:
6750 ; GFX11-CU:       ; %bb.0: ; %entry
6751 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6752 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6753 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6754 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6755 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6756 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6757 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6758 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6759 ; GFX11-CU-NEXT:    buffer_gl0_inv
6760 ; GFX11-CU-NEXT:    buffer_gl1_inv
6761 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6762 ; GFX11-CU-NEXT:    s_nop 0
6763 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6764 ; GFX11-CU-NEXT:    s_endpgm
6765     ptr addrspace(1) %out, i32 %in, i32 %old) {
6766 entry:
6767   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6768   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acquire seq_cst
6769   %val0 = extractvalue { i32, i1 } %val, 0
6770   store i32 %val0, ptr addrspace(1) %out, align 4
6771   ret void
6774 define amdgpu_kernel void @global_agent_release_seq_cst_ret_cmpxchg(
6775 ; GFX6-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6776 ; GFX6:       ; %bb.0: ; %entry
6777 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6778 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6779 ; GFX6-NEXT:    s_mov_b32 s6, -1
6780 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6781 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6782 ; GFX6-NEXT:    s_mov_b32 s4, s0
6783 ; GFX6-NEXT:    s_mov_b32 s5, s1
6784 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6785 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6786 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6787 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6788 ; GFX6-NEXT:    buffer_wbinvl1
6789 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6790 ; GFX6-NEXT:    s_endpgm
6792 ; GFX7-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6793 ; GFX7:       ; %bb.0: ; %entry
6794 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6795 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6796 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6797 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6798 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6799 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6800 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6801 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6802 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6803 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6804 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6805 ; GFX7-NEXT:    buffer_wbinvl1_vol
6806 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6807 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6808 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6809 ; GFX7-NEXT:    s_endpgm
6811 ; GFX10-WGP-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6812 ; GFX10-WGP:       ; %bb.0: ; %entry
6813 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6814 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6815 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6816 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6817 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6818 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6819 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6820 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6821 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
6822 ; GFX10-WGP-NEXT:    buffer_gl0_inv
6823 ; GFX10-WGP-NEXT:    buffer_gl1_inv
6824 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
6825 ; GFX10-WGP-NEXT:    s_endpgm
6827 ; GFX10-CU-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6828 ; GFX10-CU:       ; %bb.0: ; %entry
6829 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6830 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
6831 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6832 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
6833 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
6834 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6835 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6836 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6837 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
6838 ; GFX10-CU-NEXT:    buffer_gl0_inv
6839 ; GFX10-CU-NEXT:    buffer_gl1_inv
6840 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
6841 ; GFX10-CU-NEXT:    s_endpgm
6843 ; SKIP-CACHE-INV-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6844 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6845 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6846 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
6847 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
6848 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6849 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
6850 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
6851 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
6852 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
6853 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6854 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6855 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
6856 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6857 ; SKIP-CACHE-INV-NEXT:    s_endpgm
6859 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6860 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6861 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6862 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6863 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6864 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6865 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6866 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6867 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6868 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
6869 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6870 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6872 ; GFX90A-TGSPLIT-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6873 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6874 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6875 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6876 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6877 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
6878 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6879 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
6880 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6881 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
6882 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
6883 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
6885 ; GFX940-NOTTGSPLIT-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6886 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6887 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6888 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6889 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6890 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6891 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
6892 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6893 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6894 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6895 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
6896 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6897 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6899 ; GFX940-TGSPLIT-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6900 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6901 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6902 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
6903 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6904 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
6905 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
6906 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6907 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
6908 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
6909 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
6910 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
6911 ; GFX940-TGSPLIT-NEXT:    s_endpgm
6913 ; GFX11-WGP-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6914 ; GFX11-WGP:       ; %bb.0: ; %entry
6915 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6916 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
6917 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6918 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6919 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6920 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
6921 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6922 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
6923 ; GFX11-WGP-NEXT:    buffer_gl0_inv
6924 ; GFX11-WGP-NEXT:    buffer_gl1_inv
6925 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
6926 ; GFX11-WGP-NEXT:    s_nop 0
6927 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6928 ; GFX11-WGP-NEXT:    s_endpgm
6930 ; GFX11-CU-LABEL: global_agent_release_seq_cst_ret_cmpxchg:
6931 ; GFX11-CU:       ; %bb.0: ; %entry
6932 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
6933 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
6934 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
6935 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
6936 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6937 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
6938 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
6939 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
6940 ; GFX11-CU-NEXT:    buffer_gl0_inv
6941 ; GFX11-CU-NEXT:    buffer_gl1_inv
6942 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
6943 ; GFX11-CU-NEXT:    s_nop 0
6944 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
6945 ; GFX11-CU-NEXT:    s_endpgm
6946     ptr addrspace(1) %out, i32 %in, i32 %old) {
6947 entry:
6948   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
6949   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") release seq_cst
6950   %val0 = extractvalue { i32, i1 } %val, 0
6951   store i32 %val0, ptr addrspace(1) %out, align 4
6952   ret void
6955 define amdgpu_kernel void @global_agent_acq_rel_seq_cst_ret_cmpxchg(
6956 ; GFX6-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
6957 ; GFX6:       ; %bb.0: ; %entry
6958 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6959 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
6960 ; GFX6-NEXT:    s_mov_b32 s6, -1
6961 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6962 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6963 ; GFX6-NEXT:    s_mov_b32 s4, s0
6964 ; GFX6-NEXT:    s_mov_b32 s5, s1
6965 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
6966 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6967 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
6968 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
6969 ; GFX6-NEXT:    buffer_wbinvl1
6970 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
6971 ; GFX6-NEXT:    s_endpgm
6973 ; GFX7-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
6974 ; GFX7:       ; %bb.0: ; %entry
6975 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6976 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6977 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
6978 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
6979 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
6980 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
6981 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
6982 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
6983 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
6984 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
6985 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
6986 ; GFX7-NEXT:    buffer_wbinvl1_vol
6987 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6988 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6989 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
6990 ; GFX7-NEXT:    s_endpgm
6992 ; GFX10-WGP-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
6993 ; GFX10-WGP:       ; %bb.0: ; %entry
6994 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6995 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
6996 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6997 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
6998 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
6999 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7000 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7001 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7002 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7003 ; GFX10-WGP-NEXT:    buffer_gl0_inv
7004 ; GFX10-WGP-NEXT:    buffer_gl1_inv
7005 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
7006 ; GFX10-WGP-NEXT:    s_endpgm
7008 ; GFX10-CU-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7009 ; GFX10-CU:       ; %bb.0: ; %entry
7010 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7011 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
7012 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7013 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
7014 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
7015 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7016 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7017 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7018 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7019 ; GFX10-CU-NEXT:    buffer_gl0_inv
7020 ; GFX10-CU-NEXT:    buffer_gl1_inv
7021 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
7022 ; GFX10-CU-NEXT:    s_endpgm
7024 ; SKIP-CACHE-INV-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7025 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7026 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7027 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7028 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7029 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7030 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
7031 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7032 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7033 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
7034 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7035 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
7036 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7037 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7038 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7040 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7041 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7042 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7043 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7044 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7045 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
7046 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7047 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7048 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7049 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
7050 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
7051 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7053 ; GFX90A-TGSPLIT-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7054 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7055 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7056 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7057 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7058 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
7059 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7060 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7061 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7062 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
7063 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
7064 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7066 ; GFX940-NOTTGSPLIT-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7067 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7068 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7069 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7070 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7071 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
7072 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
7073 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7074 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
7075 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7076 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
7077 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
7078 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7080 ; GFX940-TGSPLIT-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7081 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7082 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7083 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7084 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7085 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
7086 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
7087 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7088 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
7089 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7090 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
7091 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
7092 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7094 ; GFX11-WGP-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7095 ; GFX11-WGP:       ; %bb.0: ; %entry
7096 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7097 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
7098 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7099 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
7100 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7101 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7102 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
7103 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7104 ; GFX11-WGP-NEXT:    buffer_gl0_inv
7105 ; GFX11-WGP-NEXT:    buffer_gl1_inv
7106 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
7107 ; GFX11-WGP-NEXT:    s_nop 0
7108 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7109 ; GFX11-WGP-NEXT:    s_endpgm
7111 ; GFX11-CU-LABEL: global_agent_acq_rel_seq_cst_ret_cmpxchg:
7112 ; GFX11-CU:       ; %bb.0: ; %entry
7113 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7114 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
7115 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
7116 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
7117 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7118 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7119 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
7120 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7121 ; GFX11-CU-NEXT:    buffer_gl0_inv
7122 ; GFX11-CU-NEXT:    buffer_gl1_inv
7123 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
7124 ; GFX11-CU-NEXT:    s_nop 0
7125 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7126 ; GFX11-CU-NEXT:    s_endpgm
7127     ptr addrspace(1) %out, i32 %in, i32 %old) {
7128 entry:
7129   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
7130   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") acq_rel seq_cst
7131   %val0 = extractvalue { i32, i1 } %val, 0
7132   store i32 %val0, ptr addrspace(1) %out, align 4
7133   ret void
7136 define amdgpu_kernel void @global_agent_seq_cst_seq_cst_ret_cmpxchg(
7137 ; GFX6-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7138 ; GFX6:       ; %bb.0: ; %entry
7139 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7140 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
7141 ; GFX6-NEXT:    s_mov_b32 s6, -1
7142 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7143 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7144 ; GFX6-NEXT:    s_mov_b32 s4, s0
7145 ; GFX6-NEXT:    s_mov_b32 s5, s1
7146 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
7147 ; GFX6-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7148 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
7149 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7150 ; GFX6-NEXT:    buffer_wbinvl1
7151 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7152 ; GFX6-NEXT:    s_endpgm
7154 ; GFX7-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7155 ; GFX7:       ; %bb.0: ; %entry
7156 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7157 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7158 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
7159 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
7160 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
7161 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
7162 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
7163 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
7164 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7165 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
7166 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7167 ; GFX7-NEXT:    buffer_wbinvl1_vol
7168 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7169 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7170 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7171 ; GFX7-NEXT:    s_endpgm
7173 ; GFX10-WGP-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7174 ; GFX10-WGP:       ; %bb.0: ; %entry
7175 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7176 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
7177 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7178 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
7179 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
7180 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7181 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7182 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7183 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7184 ; GFX10-WGP-NEXT:    buffer_gl0_inv
7185 ; GFX10-WGP-NEXT:    buffer_gl1_inv
7186 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
7187 ; GFX10-WGP-NEXT:    s_endpgm
7189 ; GFX10-CU-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7190 ; GFX10-CU:       ; %bb.0: ; %entry
7191 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7192 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
7193 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7194 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
7195 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
7196 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7197 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7198 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7199 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7200 ; GFX10-CU-NEXT:    buffer_gl0_inv
7201 ; GFX10-CU-NEXT:    buffer_gl1_inv
7202 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
7203 ; GFX10-CU-NEXT:    s_endpgm
7205 ; SKIP-CACHE-INV-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7206 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7207 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7208 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7209 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7210 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7211 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
7212 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7213 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7214 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
7215 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7216 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
7217 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7218 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7219 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7221 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7222 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7223 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7224 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7225 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7226 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
7227 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7228 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7229 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7230 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
7231 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
7232 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7234 ; GFX90A-TGSPLIT-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7235 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7236 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7237 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7238 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7239 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
7240 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7241 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
7242 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7243 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
7244 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
7245 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7247 ; GFX940-NOTTGSPLIT-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7248 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7249 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7250 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7251 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7252 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
7253 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
7254 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7255 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
7256 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7257 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
7258 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
7259 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7261 ; GFX940-TGSPLIT-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7262 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7263 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7264 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
7265 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7266 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
7267 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
7268 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7269 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
7270 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7271 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
7272 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
7273 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7275 ; GFX11-WGP-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7276 ; GFX11-WGP:       ; %bb.0: ; %entry
7277 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7278 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
7279 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7280 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
7281 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7282 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7283 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
7284 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7285 ; GFX11-WGP-NEXT:    buffer_gl0_inv
7286 ; GFX11-WGP-NEXT:    buffer_gl1_inv
7287 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
7288 ; GFX11-WGP-NEXT:    s_nop 0
7289 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7290 ; GFX11-WGP-NEXT:    s_endpgm
7292 ; GFX11-CU-LABEL: global_agent_seq_cst_seq_cst_ret_cmpxchg:
7293 ; GFX11-CU:       ; %bb.0: ; %entry
7294 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7295 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
7296 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
7297 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
7298 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7299 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7300 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
7301 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7302 ; GFX11-CU-NEXT:    buffer_gl0_inv
7303 ; GFX11-CU-NEXT:    buffer_gl1_inv
7304 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
7305 ; GFX11-CU-NEXT:    s_nop 0
7306 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7307 ; GFX11-CU-NEXT:    s_endpgm
7308     ptr addrspace(1) %out, i32 %in, i32 %old) {
7309 entry:
7310   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
7311   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent") seq_cst seq_cst
7312   %val0 = extractvalue { i32, i1 } %val, 0
7313   store i32 %val0, ptr addrspace(1) %out, align 4
7314   ret void
7317 define amdgpu_kernel void @global_agent_one_as_unordered_load(
7318 ; GFX6-LABEL: global_agent_one_as_unordered_load:
7319 ; GFX6:       ; %bb.0: ; %entry
7320 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7321 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
7322 ; GFX6-NEXT:    s_mov_b32 s6, -1
7323 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7324 ; GFX6-NEXT:    s_mov_b32 s4, s0
7325 ; GFX6-NEXT:    s_mov_b32 s5, s1
7326 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0
7327 ; GFX6-NEXT:    s_mov_b32 s4, s2
7328 ; GFX6-NEXT:    s_mov_b32 s5, s3
7329 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7330 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7331 ; GFX6-NEXT:    s_endpgm
7333 ; GFX7-LABEL: global_agent_one_as_unordered_load:
7334 ; GFX7:       ; %bb.0: ; %entry
7335 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7336 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7337 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7338 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7339 ; GFX7-NEXT:    flat_load_dword v2, v[0:1]
7340 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
7341 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
7342 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7343 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7344 ; GFX7-NEXT:    s_endpgm
7346 ; GFX10-WGP-LABEL: global_agent_one_as_unordered_load:
7347 ; GFX10-WGP:       ; %bb.0: ; %entry
7348 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7349 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
7350 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7351 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1]
7352 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7353 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
7354 ; GFX10-WGP-NEXT:    s_endpgm
7356 ; GFX10-CU-LABEL: global_agent_one_as_unordered_load:
7357 ; GFX10-CU:       ; %bb.0: ; %entry
7358 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7359 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
7360 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7361 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1]
7362 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7363 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
7364 ; GFX10-CU-NEXT:    s_endpgm
7366 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_unordered_load:
7367 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7368 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7369 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7370 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7371 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7372 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7373 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7374 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0
7375 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
7376 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
7377 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7378 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7379 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7381 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_unordered_load:
7382 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7383 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7384 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7385 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7386 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
7387 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7388 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7389 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7391 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_unordered_load:
7392 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7393 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7394 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7395 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7396 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
7397 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7398 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7399 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7401 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_unordered_load:
7402 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7403 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7404 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7405 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7406 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
7407 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7408 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7409 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7411 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_unordered_load:
7412 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7413 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7414 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7415 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7416 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1]
7417 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7418 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7419 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7421 ; GFX11-WGP-LABEL: global_agent_one_as_unordered_load:
7422 ; GFX11-WGP:       ; %bb.0: ; %entry
7423 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7424 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
7425 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7426 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1]
7427 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7428 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
7429 ; GFX11-WGP-NEXT:    s_nop 0
7430 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7431 ; GFX11-WGP-NEXT:    s_endpgm
7433 ; GFX11-CU-LABEL: global_agent_one_as_unordered_load:
7434 ; GFX11-CU:       ; %bb.0: ; %entry
7435 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7436 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
7437 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
7438 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1]
7439 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7440 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
7441 ; GFX11-CU-NEXT:    s_nop 0
7442 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7443 ; GFX11-CU-NEXT:    s_endpgm
7444     ptr addrspace(1) %in, ptr addrspace(1) %out) {
7445 entry:
7446   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent-one-as") unordered, align 4
7447   store i32 %val, ptr addrspace(1) %out
7448   ret void
7451 define amdgpu_kernel void @global_agent_one_as_monotonic_load(
7452 ; GFX6-LABEL: global_agent_one_as_monotonic_load:
7453 ; GFX6:       ; %bb.0: ; %entry
7454 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7455 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
7456 ; GFX6-NEXT:    s_mov_b32 s6, -1
7457 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7458 ; GFX6-NEXT:    s_mov_b32 s4, s0
7459 ; GFX6-NEXT:    s_mov_b32 s5, s1
7460 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7461 ; GFX6-NEXT:    s_mov_b32 s4, s2
7462 ; GFX6-NEXT:    s_mov_b32 s5, s3
7463 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7464 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7465 ; GFX6-NEXT:    s_endpgm
7467 ; GFX7-LABEL: global_agent_one_as_monotonic_load:
7468 ; GFX7:       ; %bb.0: ; %entry
7469 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7470 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7471 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7472 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7473 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
7474 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
7475 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
7476 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7477 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7478 ; GFX7-NEXT:    s_endpgm
7480 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_load:
7481 ; GFX10-WGP:       ; %bb.0: ; %entry
7482 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7483 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
7484 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7485 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7486 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7487 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
7488 ; GFX10-WGP-NEXT:    s_endpgm
7490 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_load:
7491 ; GFX10-CU:       ; %bb.0: ; %entry
7492 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7493 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
7494 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7495 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7496 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7497 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
7498 ; GFX10-CU-NEXT:    s_endpgm
7500 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_load:
7501 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7502 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7503 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7504 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7505 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7506 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7507 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7508 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7509 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
7510 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
7511 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7512 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7513 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7515 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_load:
7516 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7517 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7518 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7519 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7520 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7521 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7522 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7523 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7525 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_load:
7526 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7527 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7528 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7529 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7530 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7531 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7532 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7533 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7535 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_load:
7536 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7537 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7538 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7539 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7540 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7541 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7542 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7543 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7545 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_load:
7546 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7547 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7548 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7549 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7550 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7551 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7552 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7553 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7555 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_load:
7556 ; GFX11-WGP:       ; %bb.0: ; %entry
7557 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7558 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
7559 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7560 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7561 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7562 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
7563 ; GFX11-WGP-NEXT:    s_nop 0
7564 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7565 ; GFX11-WGP-NEXT:    s_endpgm
7567 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_load:
7568 ; GFX11-CU:       ; %bb.0: ; %entry
7569 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7570 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
7571 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
7572 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7573 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7574 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
7575 ; GFX11-CU-NEXT:    s_nop 0
7576 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7577 ; GFX11-CU-NEXT:    s_endpgm
7578     ptr addrspace(1) %in, ptr addrspace(1) %out) {
7579 entry:
7580   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent-one-as") monotonic, align 4
7581   store i32 %val, ptr addrspace(1) %out
7582   ret void
7585 define amdgpu_kernel void @global_agent_one_as_acquire_load(
7586 ; GFX6-LABEL: global_agent_one_as_acquire_load:
7587 ; GFX6:       ; %bb.0: ; %entry
7588 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7589 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
7590 ; GFX6-NEXT:    s_mov_b32 s6, -1
7591 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7592 ; GFX6-NEXT:    s_mov_b32 s4, s0
7593 ; GFX6-NEXT:    s_mov_b32 s5, s1
7594 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7595 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7596 ; GFX6-NEXT:    buffer_wbinvl1
7597 ; GFX6-NEXT:    s_mov_b32 s4, s2
7598 ; GFX6-NEXT:    s_mov_b32 s5, s3
7599 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7600 ; GFX6-NEXT:    s_endpgm
7602 ; GFX7-LABEL: global_agent_one_as_acquire_load:
7603 ; GFX7:       ; %bb.0: ; %entry
7604 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7605 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7606 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7607 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7608 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
7609 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7610 ; GFX7-NEXT:    buffer_wbinvl1_vol
7611 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
7612 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
7613 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7614 ; GFX7-NEXT:    s_endpgm
7616 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_load:
7617 ; GFX10-WGP:       ; %bb.0: ; %entry
7618 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7619 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
7620 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7621 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7622 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7623 ; GFX10-WGP-NEXT:    buffer_gl0_inv
7624 ; GFX10-WGP-NEXT:    buffer_gl1_inv
7625 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
7626 ; GFX10-WGP-NEXT:    s_endpgm
7628 ; GFX10-CU-LABEL: global_agent_one_as_acquire_load:
7629 ; GFX10-CU:       ; %bb.0: ; %entry
7630 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7631 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
7632 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7633 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7634 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7635 ; GFX10-CU-NEXT:    buffer_gl0_inv
7636 ; GFX10-CU-NEXT:    buffer_gl1_inv
7637 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
7638 ; GFX10-CU-NEXT:    s_endpgm
7640 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_load:
7641 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7642 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7643 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7644 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7645 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7646 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7647 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7648 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7649 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7650 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
7651 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
7652 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7653 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7655 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_load:
7656 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7657 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7658 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7659 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7660 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7661 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7662 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
7663 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7664 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7666 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_load:
7667 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7668 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7669 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7670 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7671 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7672 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7673 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
7674 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7675 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7677 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_load:
7678 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7679 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7680 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7681 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7682 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7683 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7684 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
7685 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7686 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7688 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_load:
7689 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7690 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7691 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7692 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7693 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7694 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7695 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
7696 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7697 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7699 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_load:
7700 ; GFX11-WGP:       ; %bb.0: ; %entry
7701 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7702 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
7703 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7704 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7705 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7706 ; GFX11-WGP-NEXT:    buffer_gl0_inv
7707 ; GFX11-WGP-NEXT:    buffer_gl1_inv
7708 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
7709 ; GFX11-WGP-NEXT:    s_nop 0
7710 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7711 ; GFX11-WGP-NEXT:    s_endpgm
7713 ; GFX11-CU-LABEL: global_agent_one_as_acquire_load:
7714 ; GFX11-CU:       ; %bb.0: ; %entry
7715 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7716 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
7717 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
7718 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7719 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7720 ; GFX11-CU-NEXT:    buffer_gl0_inv
7721 ; GFX11-CU-NEXT:    buffer_gl1_inv
7722 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
7723 ; GFX11-CU-NEXT:    s_nop 0
7724 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7725 ; GFX11-CU-NEXT:    s_endpgm
7726     ptr addrspace(1) %in, ptr addrspace(1) %out) {
7727 entry:
7728   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent-one-as") acquire, align 4
7729   store i32 %val, ptr addrspace(1) %out
7730   ret void
7733 define amdgpu_kernel void @global_agent_one_as_seq_cst_load(
7734 ; GFX6-LABEL: global_agent_one_as_seq_cst_load:
7735 ; GFX6:       ; %bb.0: ; %entry
7736 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7737 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
7738 ; GFX6-NEXT:    s_mov_b32 s6, -1
7739 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7740 ; GFX6-NEXT:    s_mov_b32 s4, s0
7741 ; GFX6-NEXT:    s_mov_b32 s5, s1
7742 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7743 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7744 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
7745 ; GFX6-NEXT:    buffer_wbinvl1
7746 ; GFX6-NEXT:    s_mov_b32 s4, s2
7747 ; GFX6-NEXT:    s_mov_b32 s5, s3
7748 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7749 ; GFX6-NEXT:    s_endpgm
7751 ; GFX7-LABEL: global_agent_one_as_seq_cst_load:
7752 ; GFX7:       ; %bb.0: ; %entry
7753 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7754 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7755 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7756 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7757 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7758 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
7759 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
7760 ; GFX7-NEXT:    buffer_wbinvl1_vol
7761 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
7762 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
7763 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7764 ; GFX7-NEXT:    s_endpgm
7766 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_load:
7767 ; GFX10-WGP:       ; %bb.0: ; %entry
7768 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7769 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
7770 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7771 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7772 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7773 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
7774 ; GFX10-WGP-NEXT:    buffer_gl0_inv
7775 ; GFX10-WGP-NEXT:    buffer_gl1_inv
7776 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
7777 ; GFX10-WGP-NEXT:    s_endpgm
7779 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_load:
7780 ; GFX10-CU:       ; %bb.0: ; %entry
7781 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7782 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
7783 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7784 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7785 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
7786 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
7787 ; GFX10-CU-NEXT:    buffer_gl0_inv
7788 ; GFX10-CU-NEXT:    buffer_gl1_inv
7789 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
7790 ; GFX10-CU-NEXT:    s_endpgm
7792 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_load:
7793 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7794 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7795 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
7796 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
7797 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7798 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
7799 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
7800 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7801 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
7802 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
7803 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
7804 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
7805 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
7806 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7808 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_load:
7809 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7810 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7811 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7812 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7813 ; GFX90A-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7814 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7815 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
7816 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7817 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7819 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_load:
7820 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7821 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7822 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7823 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7824 ; GFX90A-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] glc
7825 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7826 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
7827 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3]
7828 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7830 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_load:
7831 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7832 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7833 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7834 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7835 ; GFX940-NOTTGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7836 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7837 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
7838 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7839 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7841 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_load:
7842 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7843 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7844 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7845 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7846 ; GFX940-TGSPLIT-NEXT:    global_load_dword v1, v0, s[0:1] sc1
7847 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
7848 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
7849 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7850 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7852 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_load:
7853 ; GFX11-WGP:       ; %bb.0: ; %entry
7854 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7855 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
7856 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7857 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
7858 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7859 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
7860 ; GFX11-WGP-NEXT:    buffer_gl0_inv
7861 ; GFX11-WGP-NEXT:    buffer_gl1_inv
7862 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
7863 ; GFX11-WGP-NEXT:    s_nop 0
7864 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7865 ; GFX11-WGP-NEXT:    s_endpgm
7867 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_load:
7868 ; GFX11-CU:       ; %bb.0: ; %entry
7869 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
7870 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
7871 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
7872 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
7873 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc
7874 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
7875 ; GFX11-CU-NEXT:    buffer_gl0_inv
7876 ; GFX11-CU-NEXT:    buffer_gl1_inv
7877 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
7878 ; GFX11-CU-NEXT:    s_nop 0
7879 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7880 ; GFX11-CU-NEXT:    s_endpgm
7881     ptr addrspace(1) %in, ptr addrspace(1) %out) {
7882 entry:
7883   %val = load atomic i32, ptr addrspace(1) %in syncscope("agent-one-as") seq_cst, align 4
7884   store i32 %val, ptr addrspace(1) %out
7885   ret void
7888 define amdgpu_kernel void @global_agent_one_as_unordered_store(
7889 ; GFX6-LABEL: global_agent_one_as_unordered_store:
7890 ; GFX6:       ; %bb.0: ; %entry
7891 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
7892 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
7893 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
7894 ; GFX6-NEXT:    s_mov_b32 s2, -1
7895 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7896 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
7897 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
7898 ; GFX6-NEXT:    s_endpgm
7900 ; GFX7-LABEL: global_agent_one_as_unordered_store:
7901 ; GFX7:       ; %bb.0: ; %entry
7902 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
7903 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
7904 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7905 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7906 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
7907 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
7908 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
7909 ; GFX7-NEXT:    s_endpgm
7911 ; GFX10-WGP-LABEL: global_agent_one_as_unordered_store:
7912 ; GFX10-WGP:       ; %bb.0: ; %entry
7913 ; GFX10-WGP-NEXT:    s_clause 0x1
7914 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
7915 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
7916 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
7917 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7918 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7919 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
7920 ; GFX10-WGP-NEXT:    s_endpgm
7922 ; GFX10-CU-LABEL: global_agent_one_as_unordered_store:
7923 ; GFX10-CU:       ; %bb.0: ; %entry
7924 ; GFX10-CU-NEXT:    s_clause 0x1
7925 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
7926 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
7927 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
7928 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7929 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7930 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
7931 ; GFX10-CU-NEXT:    s_endpgm
7933 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_unordered_store:
7934 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7935 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
7936 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
7937 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
7938 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
7939 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7940 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
7941 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
7942 ; SKIP-CACHE-INV-NEXT:    s_endpgm
7944 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_unordered_store:
7945 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7946 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
7947 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
7948 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7949 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7950 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7951 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
7952 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7954 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_unordered_store:
7955 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7956 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
7957 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
7958 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7959 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7960 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7961 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
7962 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
7964 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_unordered_store:
7965 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7966 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
7967 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
7968 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7969 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7970 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
7971 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7972 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7974 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_unordered_store:
7975 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7976 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
7977 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
7978 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
7979 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7980 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
7981 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
7982 ; GFX940-TGSPLIT-NEXT:    s_endpgm
7984 ; GFX11-WGP-LABEL: global_agent_one_as_unordered_store:
7985 ; GFX11-WGP:       ; %bb.0: ; %entry
7986 ; GFX11-WGP-NEXT:    s_clause 0x1
7987 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
7988 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
7989 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7990 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
7991 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
7992 ; GFX11-WGP-NEXT:    s_nop 0
7993 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
7994 ; GFX11-WGP-NEXT:    s_endpgm
7996 ; GFX11-CU-LABEL: global_agent_one_as_unordered_store:
7997 ; GFX11-CU:       ; %bb.0: ; %entry
7998 ; GFX11-CU-NEXT:    s_clause 0x1
7999 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
8000 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8001 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8002 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8003 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
8004 ; GFX11-CU-NEXT:    s_nop 0
8005 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8006 ; GFX11-CU-NEXT:    s_endpgm
8007     i32 %in, ptr addrspace(1) %out) {
8008 entry:
8009   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent-one-as") unordered, align 4
8010   ret void
8013 define amdgpu_kernel void @global_agent_one_as_monotonic_store(
8014 ; GFX6-LABEL: global_agent_one_as_monotonic_store:
8015 ; GFX6:       ; %bb.0: ; %entry
8016 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
8017 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8018 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8019 ; GFX6-NEXT:    s_mov_b32 s2, -1
8020 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8021 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8022 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8023 ; GFX6-NEXT:    s_endpgm
8025 ; GFX7-LABEL: global_agent_one_as_monotonic_store:
8026 ; GFX7:       ; %bb.0: ; %entry
8027 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8028 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
8029 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8030 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8031 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8032 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8033 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
8034 ; GFX7-NEXT:    s_endpgm
8036 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_store:
8037 ; GFX10-WGP:       ; %bb.0: ; %entry
8038 ; GFX10-WGP-NEXT:    s_clause 0x1
8039 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
8040 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8041 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8042 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8043 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8044 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
8045 ; GFX10-WGP-NEXT:    s_endpgm
8047 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_store:
8048 ; GFX10-CU:       ; %bb.0: ; %entry
8049 ; GFX10-CU-NEXT:    s_clause 0x1
8050 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
8051 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8052 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8053 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8054 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8055 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
8056 ; GFX10-CU-NEXT:    s_endpgm
8058 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_store:
8059 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8060 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
8061 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
8062 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8063 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8064 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8065 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8066 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8067 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8069 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_store:
8070 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8071 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8072 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8073 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8074 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8075 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8076 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8077 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8079 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_store:
8080 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8081 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8082 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8083 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8084 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8085 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8086 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8087 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8089 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_store:
8090 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8091 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8092 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8093 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8094 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8095 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8096 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8097 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8099 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_store:
8100 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8101 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8102 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8103 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8104 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8105 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8106 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8107 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8109 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_store:
8110 ; GFX11-WGP:       ; %bb.0: ; %entry
8111 ; GFX11-WGP-NEXT:    s_clause 0x1
8112 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
8113 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8114 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8115 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8116 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
8117 ; GFX11-WGP-NEXT:    s_nop 0
8118 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8119 ; GFX11-WGP-NEXT:    s_endpgm
8121 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_store:
8122 ; GFX11-CU:       ; %bb.0: ; %entry
8123 ; GFX11-CU-NEXT:    s_clause 0x1
8124 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
8125 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8126 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8127 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8128 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
8129 ; GFX11-CU-NEXT:    s_nop 0
8130 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8131 ; GFX11-CU-NEXT:    s_endpgm
8132     i32 %in, ptr addrspace(1) %out) {
8133 entry:
8134   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent-one-as") monotonic, align 4
8135   ret void
8138 define amdgpu_kernel void @global_agent_one_as_release_store(
8139 ; GFX6-LABEL: global_agent_one_as_release_store:
8140 ; GFX6:       ; %bb.0: ; %entry
8141 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
8142 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8143 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8144 ; GFX6-NEXT:    s_mov_b32 s2, -1
8145 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8146 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8147 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8148 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8149 ; GFX6-NEXT:    s_endpgm
8151 ; GFX7-LABEL: global_agent_one_as_release_store:
8152 ; GFX7:       ; %bb.0: ; %entry
8153 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8154 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
8155 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8156 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8157 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8158 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8159 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8160 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
8161 ; GFX7-NEXT:    s_endpgm
8163 ; GFX10-WGP-LABEL: global_agent_one_as_release_store:
8164 ; GFX10-WGP:       ; %bb.0: ; %entry
8165 ; GFX10-WGP-NEXT:    s_clause 0x1
8166 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
8167 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8168 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8169 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8170 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8171 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
8172 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8173 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
8174 ; GFX10-WGP-NEXT:    s_endpgm
8176 ; GFX10-CU-LABEL: global_agent_one_as_release_store:
8177 ; GFX10-CU:       ; %bb.0: ; %entry
8178 ; GFX10-CU-NEXT:    s_clause 0x1
8179 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
8180 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8181 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8182 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8183 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8184 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
8185 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8186 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
8187 ; GFX10-CU-NEXT:    s_endpgm
8189 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_store:
8190 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8191 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
8192 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
8193 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8194 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8195 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8196 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8197 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8198 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8199 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8201 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_store:
8202 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8203 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8204 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8205 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8206 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8207 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8208 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8209 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8210 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8212 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_store:
8213 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8214 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8215 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8216 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8217 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8218 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8219 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8220 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8221 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8223 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_store:
8224 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8225 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8226 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8227 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8228 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8229 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8230 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
8231 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8232 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8233 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8235 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_store:
8236 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8237 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8238 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8239 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8240 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8241 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8242 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
8243 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8244 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8245 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8247 ; GFX11-WGP-LABEL: global_agent_one_as_release_store:
8248 ; GFX11-WGP:       ; %bb.0: ; %entry
8249 ; GFX11-WGP-NEXT:    s_clause 0x1
8250 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
8251 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8252 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8253 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8254 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
8255 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8256 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
8257 ; GFX11-WGP-NEXT:    s_nop 0
8258 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8259 ; GFX11-WGP-NEXT:    s_endpgm
8261 ; GFX11-CU-LABEL: global_agent_one_as_release_store:
8262 ; GFX11-CU:       ; %bb.0: ; %entry
8263 ; GFX11-CU-NEXT:    s_clause 0x1
8264 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
8265 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8266 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8267 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8268 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
8269 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8270 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
8271 ; GFX11-CU-NEXT:    s_nop 0
8272 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8273 ; GFX11-CU-NEXT:    s_endpgm
8274     i32 %in, ptr addrspace(1) %out) {
8275 entry:
8276   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent-one-as") release, align 4
8277   ret void
8280 define amdgpu_kernel void @global_agent_one_as_seq_cst_store(
8281 ; GFX6-LABEL: global_agent_one_as_seq_cst_store:
8282 ; GFX6:       ; %bb.0: ; %entry
8283 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x0
8284 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8285 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8286 ; GFX6-NEXT:    s_mov_b32 s2, -1
8287 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8288 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8289 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8290 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8291 ; GFX6-NEXT:    s_endpgm
8293 ; GFX7-LABEL: global_agent_one_as_seq_cst_store:
8294 ; GFX7:       ; %bb.0: ; %entry
8295 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
8296 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
8297 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8298 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8299 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8300 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8301 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8302 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
8303 ; GFX7-NEXT:    s_endpgm
8305 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_store:
8306 ; GFX10-WGP:       ; %bb.0: ; %entry
8307 ; GFX10-WGP-NEXT:    s_clause 0x1
8308 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
8309 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8310 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8311 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8312 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8313 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
8314 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8315 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
8316 ; GFX10-WGP-NEXT:    s_endpgm
8318 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_store:
8319 ; GFX10-CU:       ; %bb.0: ; %entry
8320 ; GFX10-CU-NEXT:    s_clause 0x1
8321 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
8322 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8323 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8324 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8325 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8326 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
8327 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8328 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
8329 ; GFX10-CU-NEXT:    s_endpgm
8331 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_store:
8332 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8333 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
8334 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
8335 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8336 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8337 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8338 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8339 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8340 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
8341 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8343 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_store:
8344 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8345 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8346 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8347 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8348 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8349 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8350 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8351 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8352 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8354 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_store:
8355 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8356 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x0
8357 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
8358 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8359 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8360 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8361 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8362 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
8363 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8365 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_store:
8366 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8367 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8368 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8369 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8370 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8371 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8372 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
8373 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8374 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8375 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8377 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_store:
8378 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8379 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x0
8380 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x8
8381 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8382 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8383 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8384 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
8385 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8386 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
8387 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8389 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_store:
8390 ; GFX11-WGP:       ; %bb.0: ; %entry
8391 ; GFX11-WGP-NEXT:    s_clause 0x1
8392 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
8393 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8394 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8395 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8396 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
8397 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8398 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
8399 ; GFX11-WGP-NEXT:    s_nop 0
8400 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8401 ; GFX11-WGP-NEXT:    s_endpgm
8403 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_store:
8404 ; GFX11-CU:       ; %bb.0: ; %entry
8405 ; GFX11-CU-NEXT:    s_clause 0x1
8406 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
8407 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
8408 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8409 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8410 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
8411 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8412 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
8413 ; GFX11-CU-NEXT:    s_nop 0
8414 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8415 ; GFX11-CU-NEXT:    s_endpgm
8416     i32 %in, ptr addrspace(1) %out) {
8417 entry:
8418   store atomic i32 %in, ptr addrspace(1) %out syncscope("agent-one-as") seq_cst, align 4
8419   ret void
8422 define amdgpu_kernel void @global_agent_one_as_monotonic_atomicrmw(
8423 ; GFX6-LABEL: global_agent_one_as_monotonic_atomicrmw:
8424 ; GFX6:       ; %bb.0: ; %entry
8425 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
8426 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8427 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8428 ; GFX6-NEXT:    s_mov_b32 s2, -1
8429 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8430 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8431 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8432 ; GFX6-NEXT:    s_endpgm
8434 ; GFX7-LABEL: global_agent_one_as_monotonic_atomicrmw:
8435 ; GFX7:       ; %bb.0: ; %entry
8436 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8437 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
8438 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8439 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8440 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8441 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8442 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
8443 ; GFX7-NEXT:    s_endpgm
8445 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_atomicrmw:
8446 ; GFX10-WGP:       ; %bb.0: ; %entry
8447 ; GFX10-WGP-NEXT:    s_clause 0x1
8448 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
8449 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8450 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8451 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8452 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8453 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
8454 ; GFX10-WGP-NEXT:    s_endpgm
8456 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_atomicrmw:
8457 ; GFX10-CU:       ; %bb.0: ; %entry
8458 ; GFX10-CU-NEXT:    s_clause 0x1
8459 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
8460 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8461 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8462 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8463 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8464 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
8465 ; GFX10-CU-NEXT:    s_endpgm
8467 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_atomicrmw:
8468 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8469 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
8470 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
8471 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8472 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8473 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8474 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8475 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8476 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8478 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_atomicrmw:
8479 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8480 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8481 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8482 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8483 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8484 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8485 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8486 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8488 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_atomicrmw:
8489 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8490 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8491 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8492 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8493 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8494 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8495 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8496 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8498 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_atomicrmw:
8499 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8500 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8501 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8502 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8503 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8504 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8505 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8506 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8508 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_atomicrmw:
8509 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8510 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8511 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8512 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8513 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8514 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8515 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8516 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8518 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_atomicrmw:
8519 ; GFX11-WGP:       ; %bb.0: ; %entry
8520 ; GFX11-WGP-NEXT:    s_clause 0x1
8521 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
8522 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8523 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8524 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8525 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8526 ; GFX11-WGP-NEXT:    s_nop 0
8527 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8528 ; GFX11-WGP-NEXT:    s_endpgm
8530 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_atomicrmw:
8531 ; GFX11-CU:       ; %bb.0: ; %entry
8532 ; GFX11-CU-NEXT:    s_clause 0x1
8533 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
8534 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8535 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8536 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8537 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8538 ; GFX11-CU-NEXT:    s_nop 0
8539 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8540 ; GFX11-CU-NEXT:    s_endpgm
8541     ptr addrspace(1) %out, i32 %in) {
8542 entry:
8543   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") monotonic
8544   ret void
8547 define amdgpu_kernel void @global_agent_one_as_acquire_atomicrmw(
8548 ; GFX6-LABEL: global_agent_one_as_acquire_atomicrmw:
8549 ; GFX6:       ; %bb.0: ; %entry
8550 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
8551 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8552 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8553 ; GFX6-NEXT:    s_mov_b32 s2, -1
8554 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8555 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8556 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8557 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8558 ; GFX6-NEXT:    buffer_wbinvl1
8559 ; GFX6-NEXT:    s_endpgm
8561 ; GFX7-LABEL: global_agent_one_as_acquire_atomicrmw:
8562 ; GFX7:       ; %bb.0: ; %entry
8563 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8564 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
8565 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8566 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8567 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8568 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8569 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
8570 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8571 ; GFX7-NEXT:    buffer_wbinvl1_vol
8572 ; GFX7-NEXT:    s_endpgm
8574 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_atomicrmw:
8575 ; GFX10-WGP:       ; %bb.0: ; %entry
8576 ; GFX10-WGP-NEXT:    s_clause 0x1
8577 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
8578 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8579 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8580 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8581 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8582 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
8583 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8584 ; GFX10-WGP-NEXT:    buffer_gl0_inv
8585 ; GFX10-WGP-NEXT:    buffer_gl1_inv
8586 ; GFX10-WGP-NEXT:    s_endpgm
8588 ; GFX10-CU-LABEL: global_agent_one_as_acquire_atomicrmw:
8589 ; GFX10-CU:       ; %bb.0: ; %entry
8590 ; GFX10-CU-NEXT:    s_clause 0x1
8591 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
8592 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8593 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8594 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8595 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8596 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
8597 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8598 ; GFX10-CU-NEXT:    buffer_gl0_inv
8599 ; GFX10-CU-NEXT:    buffer_gl1_inv
8600 ; GFX10-CU-NEXT:    s_endpgm
8602 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_atomicrmw:
8603 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8604 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
8605 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
8606 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8607 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8608 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8609 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8610 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8611 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8612 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8614 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_atomicrmw:
8615 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8616 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8617 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8618 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8619 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8620 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8621 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8622 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8623 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
8624 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8626 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_atomicrmw:
8627 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8628 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8629 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8630 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8631 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8632 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8633 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8634 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8635 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
8636 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8638 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_atomicrmw:
8639 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8640 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8641 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8642 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8643 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8644 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8645 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8646 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8647 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
8648 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8650 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_atomicrmw:
8651 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8652 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8653 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8654 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8655 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8656 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8657 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8658 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8659 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
8660 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8662 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_atomicrmw:
8663 ; GFX11-WGP:       ; %bb.0: ; %entry
8664 ; GFX11-WGP-NEXT:    s_clause 0x1
8665 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
8666 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8667 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8668 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8669 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8670 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8671 ; GFX11-WGP-NEXT:    buffer_gl0_inv
8672 ; GFX11-WGP-NEXT:    buffer_gl1_inv
8673 ; GFX11-WGP-NEXT:    s_endpgm
8675 ; GFX11-CU-LABEL: global_agent_one_as_acquire_atomicrmw:
8676 ; GFX11-CU:       ; %bb.0: ; %entry
8677 ; GFX11-CU-NEXT:    s_clause 0x1
8678 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
8679 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8680 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8681 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8682 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8683 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8684 ; GFX11-CU-NEXT:    buffer_gl0_inv
8685 ; GFX11-CU-NEXT:    buffer_gl1_inv
8686 ; GFX11-CU-NEXT:    s_endpgm
8687     ptr addrspace(1) %out, i32 %in) {
8688 entry:
8689   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") acquire
8690   ret void
8693 define amdgpu_kernel void @global_agent_one_as_release_atomicrmw(
8694 ; GFX6-LABEL: global_agent_one_as_release_atomicrmw:
8695 ; GFX6:       ; %bb.0: ; %entry
8696 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
8697 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8698 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8699 ; GFX6-NEXT:    s_mov_b32 s2, -1
8700 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8701 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8702 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8703 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8704 ; GFX6-NEXT:    s_endpgm
8706 ; GFX7-LABEL: global_agent_one_as_release_atomicrmw:
8707 ; GFX7:       ; %bb.0: ; %entry
8708 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8709 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
8710 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8711 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8712 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8713 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8714 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8715 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
8716 ; GFX7-NEXT:    s_endpgm
8718 ; GFX10-WGP-LABEL: global_agent_one_as_release_atomicrmw:
8719 ; GFX10-WGP:       ; %bb.0: ; %entry
8720 ; GFX10-WGP-NEXT:    s_clause 0x1
8721 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
8722 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8723 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8724 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8725 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8726 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
8727 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8728 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
8729 ; GFX10-WGP-NEXT:    s_endpgm
8731 ; GFX10-CU-LABEL: global_agent_one_as_release_atomicrmw:
8732 ; GFX10-CU:       ; %bb.0: ; %entry
8733 ; GFX10-CU-NEXT:    s_clause 0x1
8734 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
8735 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8736 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8737 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8738 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8739 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
8740 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8741 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
8742 ; GFX10-CU-NEXT:    s_endpgm
8744 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_atomicrmw:
8745 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8746 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
8747 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
8748 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8749 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8750 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8751 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8752 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8753 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8754 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8756 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_atomicrmw:
8757 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8758 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8759 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8760 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8761 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8762 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8763 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8764 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8765 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8767 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_atomicrmw:
8768 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8769 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8770 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8771 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8772 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8773 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8774 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8775 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8776 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8778 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_atomicrmw:
8779 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8780 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8781 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8782 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8783 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8784 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8785 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
8786 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8787 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8788 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8790 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_atomicrmw:
8791 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8792 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8793 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8794 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8795 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8796 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8797 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
8798 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8799 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8800 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8802 ; GFX11-WGP-LABEL: global_agent_one_as_release_atomicrmw:
8803 ; GFX11-WGP:       ; %bb.0: ; %entry
8804 ; GFX11-WGP-NEXT:    s_clause 0x1
8805 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
8806 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8807 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8808 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8809 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
8810 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8811 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8812 ; GFX11-WGP-NEXT:    s_nop 0
8813 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8814 ; GFX11-WGP-NEXT:    s_endpgm
8816 ; GFX11-CU-LABEL: global_agent_one_as_release_atomicrmw:
8817 ; GFX11-CU:       ; %bb.0: ; %entry
8818 ; GFX11-CU-NEXT:    s_clause 0x1
8819 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
8820 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8821 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8822 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8823 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
8824 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8825 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8826 ; GFX11-CU-NEXT:    s_nop 0
8827 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
8828 ; GFX11-CU-NEXT:    s_endpgm
8829     ptr addrspace(1) %out, i32 %in) {
8830 entry:
8831   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") release
8832   ret void
8835 define amdgpu_kernel void @global_agent_one_as_acq_rel_atomicrmw(
8836 ; GFX6-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8837 ; GFX6:       ; %bb.0: ; %entry
8838 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
8839 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8840 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
8841 ; GFX6-NEXT:    s_mov_b32 s2, -1
8842 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8843 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
8844 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8845 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8846 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
8847 ; GFX6-NEXT:    buffer_wbinvl1
8848 ; GFX6-NEXT:    s_endpgm
8850 ; GFX7-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8851 ; GFX7:       ; %bb.0: ; %entry
8852 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8853 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
8854 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8855 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8856 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
8857 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
8858 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8859 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
8860 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
8861 ; GFX7-NEXT:    buffer_wbinvl1_vol
8862 ; GFX7-NEXT:    s_endpgm
8864 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8865 ; GFX10-WGP:       ; %bb.0: ; %entry
8866 ; GFX10-WGP-NEXT:    s_clause 0x1
8867 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
8868 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8869 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
8870 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8871 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8872 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
8873 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8874 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
8875 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8876 ; GFX10-WGP-NEXT:    buffer_gl0_inv
8877 ; GFX10-WGP-NEXT:    buffer_gl1_inv
8878 ; GFX10-WGP-NEXT:    s_endpgm
8880 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8881 ; GFX10-CU:       ; %bb.0: ; %entry
8882 ; GFX10-CU-NEXT:    s_clause 0x1
8883 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
8884 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8885 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
8886 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8887 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8888 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
8889 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8890 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
8891 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8892 ; GFX10-CU-NEXT:    buffer_gl0_inv
8893 ; GFX10-CU-NEXT:    buffer_gl1_inv
8894 ; GFX10-CU-NEXT:    s_endpgm
8896 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8897 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8898 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
8899 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
8900 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
8901 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
8902 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8903 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
8904 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8905 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
8906 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
8907 ; SKIP-CACHE-INV-NEXT:    s_endpgm
8909 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8910 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8911 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8912 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8913 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8914 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8915 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8916 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8917 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8918 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8919 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
8920 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8922 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8923 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8924 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
8925 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
8926 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8927 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8928 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8929 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8930 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
8931 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8932 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
8933 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
8935 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8936 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8937 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8938 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8939 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8940 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8941 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8942 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
8943 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8944 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8945 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8946 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
8947 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8949 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8950 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8951 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
8952 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
8953 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
8954 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8955 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
8956 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
8957 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8958 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
8959 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
8960 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
8961 ; GFX940-TGSPLIT-NEXT:    s_endpgm
8963 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8964 ; GFX11-WGP:       ; %bb.0: ; %entry
8965 ; GFX11-WGP-NEXT:    s_clause 0x1
8966 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
8967 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8968 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8969 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8970 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
8971 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8972 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8973 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
8974 ; GFX11-WGP-NEXT:    buffer_gl0_inv
8975 ; GFX11-WGP-NEXT:    buffer_gl1_inv
8976 ; GFX11-WGP-NEXT:    s_endpgm
8978 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_atomicrmw:
8979 ; GFX11-CU:       ; %bb.0: ; %entry
8980 ; GFX11-CU-NEXT:    s_clause 0x1
8981 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
8982 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
8983 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
8984 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
8985 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
8986 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8987 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
8988 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
8989 ; GFX11-CU-NEXT:    buffer_gl0_inv
8990 ; GFX11-CU-NEXT:    buffer_gl1_inv
8991 ; GFX11-CU-NEXT:    s_endpgm
8992     ptr addrspace(1) %out, i32 %in) {
8993 entry:
8994   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") acq_rel
8995   ret void
8998 define amdgpu_kernel void @global_agent_one_as_seq_cst_atomicrmw(
8999 ; GFX6-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9000 ; GFX6:       ; %bb.0: ; %entry
9001 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
9002 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9003 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
9004 ; GFX6-NEXT:    s_mov_b32 s2, -1
9005 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9006 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
9007 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9008 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
9009 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9010 ; GFX6-NEXT:    buffer_wbinvl1
9011 ; GFX6-NEXT:    s_endpgm
9013 ; GFX7-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9014 ; GFX7:       ; %bb.0: ; %entry
9015 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9016 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
9017 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9018 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9019 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9020 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9021 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9022 ; GFX7-NEXT:    flat_atomic_swap v[0:1], v2
9023 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9024 ; GFX7-NEXT:    buffer_wbinvl1_vol
9025 ; GFX7-NEXT:    s_endpgm
9027 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9028 ; GFX10-WGP:       ; %bb.0: ; %entry
9029 ; GFX10-WGP-NEXT:    s_clause 0x1
9030 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
9031 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9032 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
9033 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9034 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9035 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9036 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9037 ; GFX10-WGP-NEXT:    global_atomic_swap v0, v1, s[0:1]
9038 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9039 ; GFX10-WGP-NEXT:    buffer_gl0_inv
9040 ; GFX10-WGP-NEXT:    buffer_gl1_inv
9041 ; GFX10-WGP-NEXT:    s_endpgm
9043 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9044 ; GFX10-CU:       ; %bb.0: ; %entry
9045 ; GFX10-CU-NEXT:    s_clause 0x1
9046 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
9047 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9048 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
9049 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9050 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9051 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9052 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9053 ; GFX10-CU-NEXT:    global_atomic_swap v0, v1, s[0:1]
9054 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9055 ; GFX10-CU-NEXT:    buffer_gl0_inv
9056 ; GFX10-CU-NEXT:    buffer_gl1_inv
9057 ; GFX10-CU-NEXT:    s_endpgm
9059 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9060 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9061 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
9062 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
9063 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
9064 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
9065 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9066 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
9067 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9068 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0
9069 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9070 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9072 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9073 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9074 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9075 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9076 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9077 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9078 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9079 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9080 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
9081 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9082 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
9083 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9085 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9086 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9087 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9088 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9089 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9090 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9091 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9092 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9093 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[0:1]
9094 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9095 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
9096 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9098 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9099 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9100 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9101 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9102 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9103 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9104 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9105 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
9106 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9107 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
9108 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9109 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
9110 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9112 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9113 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9114 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9115 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9116 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9117 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9118 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9119 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
9120 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9121 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v0, v1, s[2:3]
9122 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9123 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
9124 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9126 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9127 ; GFX11-WGP:       ; %bb.0: ; %entry
9128 ; GFX11-WGP-NEXT:    s_clause 0x1
9129 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
9130 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9131 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9132 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9133 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9134 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9135 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
9136 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9137 ; GFX11-WGP-NEXT:    buffer_gl0_inv
9138 ; GFX11-WGP-NEXT:    buffer_gl1_inv
9139 ; GFX11-WGP-NEXT:    s_endpgm
9141 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_atomicrmw:
9142 ; GFX11-CU:       ; %bb.0: ; %entry
9143 ; GFX11-CU-NEXT:    s_clause 0x1
9144 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
9145 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9146 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9147 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9148 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9149 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9150 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v0, v1, s[0:1]
9151 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9152 ; GFX11-CU-NEXT:    buffer_gl0_inv
9153 ; GFX11-CU-NEXT:    buffer_gl1_inv
9154 ; GFX11-CU-NEXT:    s_endpgm
9155     ptr addrspace(1) %out, i32 %in) {
9156 entry:
9157   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") seq_cst
9158   ret void
9161 define amdgpu_kernel void @global_agent_one_as_acquire_ret_atomicrmw(
9162 ; GFX6-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9163 ; GFX6:       ; %bb.0: ; %entry
9164 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
9165 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9166 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
9167 ; GFX6-NEXT:    s_mov_b32 s2, -1
9168 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9169 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
9170 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9171 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9172 ; GFX6-NEXT:    buffer_wbinvl1
9173 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9174 ; GFX6-NEXT:    s_endpgm
9176 ; GFX7-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9177 ; GFX7:       ; %bb.0: ; %entry
9178 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9179 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
9180 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9181 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9182 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9183 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9184 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
9185 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9186 ; GFX7-NEXT:    buffer_wbinvl1_vol
9187 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
9188 ; GFX7-NEXT:    s_endpgm
9190 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9191 ; GFX10-WGP:       ; %bb.0: ; %entry
9192 ; GFX10-WGP-NEXT:    s_clause 0x1
9193 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
9194 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9195 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
9196 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9197 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9198 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9199 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9200 ; GFX10-WGP-NEXT:    buffer_gl0_inv
9201 ; GFX10-WGP-NEXT:    buffer_gl1_inv
9202 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
9203 ; GFX10-WGP-NEXT:    s_endpgm
9205 ; GFX10-CU-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9206 ; GFX10-CU:       ; %bb.0: ; %entry
9207 ; GFX10-CU-NEXT:    s_clause 0x1
9208 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
9209 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9210 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
9211 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9212 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9213 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9214 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9215 ; GFX10-CU-NEXT:    buffer_gl0_inv
9216 ; GFX10-CU-NEXT:    buffer_gl1_inv
9217 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
9218 ; GFX10-CU-NEXT:    s_endpgm
9220 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9221 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9222 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
9223 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
9224 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
9225 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
9226 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9227 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
9228 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9229 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9230 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9231 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9233 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9234 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9235 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9236 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9237 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9238 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9239 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9240 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9241 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9242 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
9243 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9244 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9246 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9247 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9248 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9249 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9250 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9251 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9252 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9253 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9254 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9255 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
9256 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9257 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9259 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9260 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9261 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9262 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9263 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9264 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9265 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9266 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9267 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9268 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
9269 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9270 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9272 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9273 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9274 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9275 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9276 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9277 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9278 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9279 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9280 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9281 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
9282 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9283 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9285 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9286 ; GFX11-WGP:       ; %bb.0: ; %entry
9287 ; GFX11-WGP-NEXT:    s_clause 0x1
9288 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
9289 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9290 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9291 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9292 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9293 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9294 ; GFX11-WGP-NEXT:    buffer_gl0_inv
9295 ; GFX11-WGP-NEXT:    buffer_gl1_inv
9296 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
9297 ; GFX11-WGP-NEXT:    s_nop 0
9298 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9299 ; GFX11-WGP-NEXT:    s_endpgm
9301 ; GFX11-CU-LABEL: global_agent_one_as_acquire_ret_atomicrmw:
9302 ; GFX11-CU:       ; %bb.0: ; %entry
9303 ; GFX11-CU-NEXT:    s_clause 0x1
9304 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
9305 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9306 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9307 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9308 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9309 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9310 ; GFX11-CU-NEXT:    buffer_gl0_inv
9311 ; GFX11-CU-NEXT:    buffer_gl1_inv
9312 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
9313 ; GFX11-CU-NEXT:    s_nop 0
9314 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9315 ; GFX11-CU-NEXT:    s_endpgm
9316     ptr addrspace(1) %out, i32 %in) {
9317 entry:
9318   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") acquire
9319   store i32 %val, ptr addrspace(1) %out, align 4
9320   ret void
9323 define amdgpu_kernel void @global_agent_one_as_acq_rel_ret_atomicrmw(
9324 ; GFX6-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9325 ; GFX6:       ; %bb.0: ; %entry
9326 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
9327 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9328 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
9329 ; GFX6-NEXT:    s_mov_b32 s2, -1
9330 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9331 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
9332 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9333 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9334 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9335 ; GFX6-NEXT:    buffer_wbinvl1
9336 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9337 ; GFX6-NEXT:    s_endpgm
9339 ; GFX7-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9340 ; GFX7:       ; %bb.0: ; %entry
9341 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9342 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
9343 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9344 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9345 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9346 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9347 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9348 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
9349 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9350 ; GFX7-NEXT:    buffer_wbinvl1_vol
9351 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
9352 ; GFX7-NEXT:    s_endpgm
9354 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9355 ; GFX10-WGP:       ; %bb.0: ; %entry
9356 ; GFX10-WGP-NEXT:    s_clause 0x1
9357 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
9358 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9359 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
9360 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9361 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9362 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9363 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9364 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9365 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9366 ; GFX10-WGP-NEXT:    buffer_gl0_inv
9367 ; GFX10-WGP-NEXT:    buffer_gl1_inv
9368 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
9369 ; GFX10-WGP-NEXT:    s_endpgm
9371 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9372 ; GFX10-CU:       ; %bb.0: ; %entry
9373 ; GFX10-CU-NEXT:    s_clause 0x1
9374 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
9375 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9376 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
9377 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9378 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9379 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9380 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9381 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9382 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9383 ; GFX10-CU-NEXT:    buffer_gl0_inv
9384 ; GFX10-CU-NEXT:    buffer_gl1_inv
9385 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
9386 ; GFX10-CU-NEXT:    s_endpgm
9388 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9389 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9390 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
9391 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
9392 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
9393 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
9394 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9395 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
9396 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9397 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9398 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9399 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9400 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9402 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9403 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9404 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9405 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9406 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9407 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9408 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9409 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9410 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9411 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9412 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
9413 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9414 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9416 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9417 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9418 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9419 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9420 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9421 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9422 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9423 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9424 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9425 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9426 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
9427 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9428 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9430 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9431 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9432 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9433 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9434 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9435 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9436 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9437 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
9438 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9439 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9440 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9441 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
9442 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9443 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9445 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9446 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9447 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9448 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9449 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9450 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9451 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9452 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
9453 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9454 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9455 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9456 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
9457 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9458 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9460 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9461 ; GFX11-WGP:       ; %bb.0: ; %entry
9462 ; GFX11-WGP-NEXT:    s_clause 0x1
9463 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
9464 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9465 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9466 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9467 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9468 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9469 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9470 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9471 ; GFX11-WGP-NEXT:    buffer_gl0_inv
9472 ; GFX11-WGP-NEXT:    buffer_gl1_inv
9473 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
9474 ; GFX11-WGP-NEXT:    s_nop 0
9475 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9476 ; GFX11-WGP-NEXT:    s_endpgm
9478 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_ret_atomicrmw:
9479 ; GFX11-CU:       ; %bb.0: ; %entry
9480 ; GFX11-CU-NEXT:    s_clause 0x1
9481 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
9482 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9483 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9484 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9485 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9486 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9487 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9488 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9489 ; GFX11-CU-NEXT:    buffer_gl0_inv
9490 ; GFX11-CU-NEXT:    buffer_gl1_inv
9491 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
9492 ; GFX11-CU-NEXT:    s_nop 0
9493 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9494 ; GFX11-CU-NEXT:    s_endpgm
9495     ptr addrspace(1) %out, i32 %in) {
9496 entry:
9497   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") acq_rel
9498   store i32 %val, ptr addrspace(1) %out, align 4
9499   ret void
9502 define amdgpu_kernel void @global_agent_one_as_seq_cst_ret_atomicrmw(
9503 ; GFX6-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9504 ; GFX6:       ; %bb.0: ; %entry
9505 ; GFX6-NEXT:    s_load_dword s6, s[4:5], 0x2
9506 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9507 ; GFX6-NEXT:    s_mov_b32 s3, 0x100f000
9508 ; GFX6-NEXT:    s_mov_b32 s2, -1
9509 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9510 ; GFX6-NEXT:    v_mov_b32_e32 v0, s6
9511 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9512 ; GFX6-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9513 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9514 ; GFX6-NEXT:    buffer_wbinvl1
9515 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9516 ; GFX6-NEXT:    s_endpgm
9518 ; GFX7-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9519 ; GFX7:       ; %bb.0: ; %entry
9520 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9521 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
9522 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9523 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9524 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9525 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9526 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9527 ; GFX7-NEXT:    flat_atomic_swap v2, v[0:1], v2 glc
9528 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9529 ; GFX7-NEXT:    buffer_wbinvl1_vol
9530 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
9531 ; GFX7-NEXT:    s_endpgm
9533 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9534 ; GFX10-WGP:       ; %bb.0: ; %entry
9535 ; GFX10-WGP-NEXT:    s_clause 0x1
9536 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
9537 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9538 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
9539 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9540 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9541 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9542 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9543 ; GFX10-WGP-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9544 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9545 ; GFX10-WGP-NEXT:    buffer_gl0_inv
9546 ; GFX10-WGP-NEXT:    buffer_gl1_inv
9547 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
9548 ; GFX10-WGP-NEXT:    s_endpgm
9550 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9551 ; GFX10-CU:       ; %bb.0: ; %entry
9552 ; GFX10-CU-NEXT:    s_clause 0x1
9553 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
9554 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9555 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
9556 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9557 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9558 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9559 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9560 ; GFX10-CU-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9561 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9562 ; GFX10-CU-NEXT:    buffer_gl0_inv
9563 ; GFX10-CU-NEXT:    buffer_gl1_inv
9564 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
9565 ; GFX10-CU-NEXT:    s_endpgm
9567 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9568 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9569 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x2
9570 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
9571 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
9572 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
9573 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9574 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
9575 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9576 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_swap v0, off, s[0:3], 0 glc
9577 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9578 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
9579 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9581 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9582 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9583 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9584 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9585 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9586 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9587 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9588 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9589 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9590 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9591 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
9592 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9593 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9595 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9596 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9597 ; GFX90A-TGSPLIT-NEXT:    s_load_dword s2, s[4:5], 0x8
9598 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
9599 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9600 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9601 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9602 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9603 ; GFX90A-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[0:1] glc
9604 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9605 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
9606 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v0, v1, s[0:1]
9607 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9609 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9610 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9611 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9612 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9613 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9614 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9615 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9616 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
9617 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9618 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9619 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9620 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
9621 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9622 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9624 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9625 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9626 ; GFX940-TGSPLIT-NEXT:    s_load_dword s4, s[0:1], 0x8
9627 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
9628 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, 0
9629 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9630 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s4
9631 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
9632 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9633 ; GFX940-TGSPLIT-NEXT:    global_atomic_swap v1, v0, v1, s[2:3] sc0
9634 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9635 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
9636 ; GFX940-TGSPLIT-NEXT:    global_store_dword v0, v1, s[2:3] sc0 sc1
9637 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9639 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9640 ; GFX11-WGP:       ; %bb.0: ; %entry
9641 ; GFX11-WGP-NEXT:    s_clause 0x1
9642 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x8
9643 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9644 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9645 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9646 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9647 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9648 ; GFX11-WGP-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9649 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
9650 ; GFX11-WGP-NEXT:    buffer_gl0_inv
9651 ; GFX11-WGP-NEXT:    buffer_gl1_inv
9652 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
9653 ; GFX11-WGP-NEXT:    s_nop 0
9654 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9655 ; GFX11-WGP-NEXT:    s_endpgm
9657 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_ret_atomicrmw:
9658 ; GFX11-CU:       ; %bb.0: ; %entry
9659 ; GFX11-CU-NEXT:    s_clause 0x1
9660 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x8
9661 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x0
9662 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9663 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
9664 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9665 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9666 ; GFX11-CU-NEXT:    global_atomic_swap_b32 v1, v0, v1, s[0:1] glc
9667 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
9668 ; GFX11-CU-NEXT:    buffer_gl0_inv
9669 ; GFX11-CU-NEXT:    buffer_gl1_inv
9670 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
9671 ; GFX11-CU-NEXT:    s_nop 0
9672 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9673 ; GFX11-CU-NEXT:    s_endpgm
9674     ptr addrspace(1) %out, i32 %in) {
9675 entry:
9676   %val = atomicrmw volatile xchg ptr addrspace(1) %out, i32 %in syncscope("agent-one-as") seq_cst
9677   store i32 %val, ptr addrspace(1) %out, align 4
9678   ret void
9681 define amdgpu_kernel void @global_agent_one_as_monotonic_monotonic_cmpxchg(
9682 ; GFX6-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9683 ; GFX6:       ; %bb.0: ; %entry
9684 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9685 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
9686 ; GFX6-NEXT:    s_mov_b32 s6, -1
9687 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9688 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9689 ; GFX6-NEXT:    s_mov_b32 s4, s0
9690 ; GFX6-NEXT:    s_mov_b32 s5, s1
9691 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
9692 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
9693 ; GFX6-NEXT:    s_endpgm
9695 ; GFX7-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9696 ; GFX7:       ; %bb.0: ; %entry
9697 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9698 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9699 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
9700 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
9701 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9702 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9703 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9704 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
9705 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
9706 ; GFX7-NEXT:    s_endpgm
9708 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9709 ; GFX10-WGP:       ; %bb.0: ; %entry
9710 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9711 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
9712 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9713 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
9714 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
9715 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9716 ; GFX10-WGP-NEXT:    s_endpgm
9718 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9719 ; GFX10-CU:       ; %bb.0: ; %entry
9720 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9721 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
9722 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9723 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
9724 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
9725 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9726 ; GFX10-CU-NEXT:    s_endpgm
9728 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9729 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9730 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9731 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
9732 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
9733 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9734 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
9735 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
9736 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
9737 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
9738 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
9739 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9741 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9742 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9743 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9744 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9745 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9746 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
9747 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9748 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9750 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9751 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9752 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9753 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9754 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9755 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
9756 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9757 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9759 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9760 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9761 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9762 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9763 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9764 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
9765 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9766 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9768 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9769 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9770 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9771 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9772 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9773 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
9774 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9775 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9777 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9778 ; GFX11-WGP:       ; %bb.0: ; %entry
9779 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
9780 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
9781 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9782 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
9783 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
9784 ; GFX11-WGP-NEXT:    s_nop 0
9785 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9786 ; GFX11-WGP-NEXT:    s_endpgm
9788 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_monotonic_cmpxchg:
9789 ; GFX11-CU:       ; %bb.0: ; %entry
9790 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
9791 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
9792 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9793 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
9794 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
9795 ; GFX11-CU-NEXT:    s_nop 0
9796 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
9797 ; GFX11-CU-NEXT:    s_endpgm
9798     ptr addrspace(1) %out, i32 %in, i32 %old) {
9799 entry:
9800   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
9801   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic monotonic
9802   ret void
9805 define amdgpu_kernel void @global_agent_one_as_acquire_monotonic_cmpxchg(
9806 ; GFX6-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9807 ; GFX6:       ; %bb.0: ; %entry
9808 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9809 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
9810 ; GFX6-NEXT:    s_mov_b32 s6, -1
9811 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9812 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9813 ; GFX6-NEXT:    s_mov_b32 s4, s0
9814 ; GFX6-NEXT:    s_mov_b32 s5, s1
9815 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
9816 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
9817 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9818 ; GFX6-NEXT:    buffer_wbinvl1
9819 ; GFX6-NEXT:    s_endpgm
9821 ; GFX7-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9822 ; GFX7:       ; %bb.0: ; %entry
9823 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9824 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9825 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
9826 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
9827 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9828 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9829 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9830 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
9831 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
9832 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9833 ; GFX7-NEXT:    buffer_wbinvl1_vol
9834 ; GFX7-NEXT:    s_endpgm
9836 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9837 ; GFX10-WGP:       ; %bb.0: ; %entry
9838 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9839 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
9840 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9841 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
9842 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
9843 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9844 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9845 ; GFX10-WGP-NEXT:    buffer_gl0_inv
9846 ; GFX10-WGP-NEXT:    buffer_gl1_inv
9847 ; GFX10-WGP-NEXT:    s_endpgm
9849 ; GFX10-CU-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9850 ; GFX10-CU:       ; %bb.0: ; %entry
9851 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9852 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
9853 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9854 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
9855 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
9856 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9857 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9858 ; GFX10-CU-NEXT:    buffer_gl0_inv
9859 ; GFX10-CU-NEXT:    buffer_gl1_inv
9860 ; GFX10-CU-NEXT:    s_endpgm
9862 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9863 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9864 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9865 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
9866 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
9867 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9868 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
9869 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
9870 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
9871 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
9872 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
9873 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
9874 ; SKIP-CACHE-INV-NEXT:    s_endpgm
9876 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9877 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9878 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9879 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9880 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9881 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
9882 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9883 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9884 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
9885 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9887 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9888 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9889 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9890 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9891 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9892 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
9893 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9894 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9895 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
9896 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
9898 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9899 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9900 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9901 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9902 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9903 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
9904 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9905 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9906 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
9907 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9909 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9910 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9911 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9912 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
9913 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9914 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
9915 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9916 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
9917 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
9918 ; GFX940-TGSPLIT-NEXT:    s_endpgm
9920 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9921 ; GFX11-WGP:       ; %bb.0: ; %entry
9922 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
9923 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
9924 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9925 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
9926 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
9927 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9928 ; GFX11-WGP-NEXT:    buffer_gl0_inv
9929 ; GFX11-WGP-NEXT:    buffer_gl1_inv
9930 ; GFX11-WGP-NEXT:    s_endpgm
9932 ; GFX11-CU-LABEL: global_agent_one_as_acquire_monotonic_cmpxchg:
9933 ; GFX11-CU:       ; %bb.0: ; %entry
9934 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
9935 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
9936 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
9937 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
9938 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
9939 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
9940 ; GFX11-CU-NEXT:    buffer_gl0_inv
9941 ; GFX11-CU-NEXT:    buffer_gl1_inv
9942 ; GFX11-CU-NEXT:    s_endpgm
9943     ptr addrspace(1) %out, i32 %in, i32 %old) {
9944 entry:
9945   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
9946   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire monotonic
9947   ret void
9950 define amdgpu_kernel void @global_agent_one_as_release_monotonic_cmpxchg(
9951 ; GFX6-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
9952 ; GFX6:       ; %bb.0: ; %entry
9953 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9954 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
9955 ; GFX6-NEXT:    s_mov_b32 s6, -1
9956 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9957 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9958 ; GFX6-NEXT:    s_mov_b32 s4, s0
9959 ; GFX6-NEXT:    s_mov_b32 s5, s1
9960 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
9961 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
9962 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
9963 ; GFX6-NEXT:    s_endpgm
9965 ; GFX7-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
9966 ; GFX7:       ; %bb.0: ; %entry
9967 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9968 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9969 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
9970 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
9971 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9972 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
9973 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
9974 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
9975 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
9976 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
9977 ; GFX7-NEXT:    s_endpgm
9979 ; GFX10-WGP-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
9980 ; GFX10-WGP:       ; %bb.0: ; %entry
9981 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9982 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
9983 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9984 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
9985 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
9986 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
9987 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
9988 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
9989 ; GFX10-WGP-NEXT:    s_endpgm
9991 ; GFX10-CU-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
9992 ; GFX10-CU:       ; %bb.0: ; %entry
9993 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9994 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
9995 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9996 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
9997 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
9998 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
9999 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10000 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10001 ; GFX10-CU-NEXT:    s_endpgm
10003 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10004 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10005 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10006 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10007 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10008 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10009 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10010 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10011 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10012 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10013 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10014 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10015 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10017 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10018 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10019 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10020 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10021 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10022 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10023 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10024 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10025 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10027 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10028 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10029 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10030 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10031 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10032 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10033 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10034 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10035 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10037 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10038 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10039 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10040 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10041 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10042 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10043 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
10044 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10045 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10046 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10048 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10049 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10050 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10051 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10052 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10053 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10054 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
10055 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10056 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10057 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10059 ; GFX11-WGP-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10060 ; GFX11-WGP:       ; %bb.0: ; %entry
10061 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10062 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10063 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10064 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10065 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
10066 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10067 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10068 ; GFX11-WGP-NEXT:    s_nop 0
10069 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
10070 ; GFX11-WGP-NEXT:    s_endpgm
10072 ; GFX11-CU-LABEL: global_agent_one_as_release_monotonic_cmpxchg:
10073 ; GFX11-CU:       ; %bb.0: ; %entry
10074 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10075 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10076 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10077 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10078 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
10079 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10080 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10081 ; GFX11-CU-NEXT:    s_nop 0
10082 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
10083 ; GFX11-CU-NEXT:    s_endpgm
10084     ptr addrspace(1) %out, i32 %in, i32 %old) {
10085 entry:
10086   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10087   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") release monotonic
10088   ret void
10091 define amdgpu_kernel void @global_agent_one_as_acq_rel_monotonic_cmpxchg(
10092 ; GFX6-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10093 ; GFX6:       ; %bb.0: ; %entry
10094 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10095 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10096 ; GFX6-NEXT:    s_mov_b32 s6, -1
10097 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10098 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10099 ; GFX6-NEXT:    s_mov_b32 s4, s0
10100 ; GFX6-NEXT:    s_mov_b32 s5, s1
10101 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10102 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10103 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10104 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10105 ; GFX6-NEXT:    buffer_wbinvl1
10106 ; GFX6-NEXT:    s_endpgm
10108 ; GFX7-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10109 ; GFX7:       ; %bb.0: ; %entry
10110 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10111 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10112 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10113 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10114 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10115 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10116 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10117 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10118 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10119 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10120 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10121 ; GFX7-NEXT:    buffer_wbinvl1_vol
10122 ; GFX7-NEXT:    s_endpgm
10124 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10125 ; GFX10-WGP:       ; %bb.0: ; %entry
10126 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10127 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10128 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10129 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10130 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10131 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
10132 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10133 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10134 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10135 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10136 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10137 ; GFX10-WGP-NEXT:    s_endpgm
10139 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10140 ; GFX10-CU:       ; %bb.0: ; %entry
10141 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10142 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10143 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10144 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10145 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10146 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
10147 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10148 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10149 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10150 ; GFX10-CU-NEXT:    buffer_gl0_inv
10151 ; GFX10-CU-NEXT:    buffer_gl1_inv
10152 ; GFX10-CU-NEXT:    s_endpgm
10154 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10155 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10156 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10157 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10158 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10159 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10160 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10161 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10162 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10163 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10164 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10165 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10166 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10167 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10169 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10170 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10171 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10172 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10173 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10174 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10175 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10176 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10177 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10178 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10179 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10181 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10182 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10183 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10184 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10185 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10186 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10187 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10188 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10189 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10190 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10191 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10193 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10194 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10195 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10196 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10197 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10198 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10199 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
10200 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10201 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10202 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10203 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10204 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10206 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10207 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10208 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10209 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10210 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10211 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10212 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
10213 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10214 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10215 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10216 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10217 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10219 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10220 ; GFX11-WGP:       ; %bb.0: ; %entry
10221 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10222 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10223 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10224 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10225 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
10226 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10227 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10228 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10229 ; GFX11-WGP-NEXT:    buffer_gl0_inv
10230 ; GFX11-WGP-NEXT:    buffer_gl1_inv
10231 ; GFX11-WGP-NEXT:    s_endpgm
10233 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_monotonic_cmpxchg:
10234 ; GFX11-CU:       ; %bb.0: ; %entry
10235 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10236 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10237 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10238 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10239 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
10240 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10241 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10242 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10243 ; GFX11-CU-NEXT:    buffer_gl0_inv
10244 ; GFX11-CU-NEXT:    buffer_gl1_inv
10245 ; GFX11-CU-NEXT:    s_endpgm
10246     ptr addrspace(1) %out, i32 %in, i32 %old) {
10247 entry:
10248   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10249   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel monotonic
10250   ret void
10253 define amdgpu_kernel void @global_agent_one_as_seq_cst_monotonic_cmpxchg(
10254 ; GFX6-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10255 ; GFX6:       ; %bb.0: ; %entry
10256 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10257 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10258 ; GFX6-NEXT:    s_mov_b32 s6, -1
10259 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10260 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10261 ; GFX6-NEXT:    s_mov_b32 s4, s0
10262 ; GFX6-NEXT:    s_mov_b32 s5, s1
10263 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10264 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10265 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10266 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10267 ; GFX6-NEXT:    buffer_wbinvl1
10268 ; GFX6-NEXT:    s_endpgm
10270 ; GFX7-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10271 ; GFX7:       ; %bb.0: ; %entry
10272 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10273 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10274 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10275 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10276 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10277 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10278 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10279 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10280 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10281 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10282 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10283 ; GFX7-NEXT:    buffer_wbinvl1_vol
10284 ; GFX7-NEXT:    s_endpgm
10286 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10287 ; GFX10-WGP:       ; %bb.0: ; %entry
10288 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10289 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10290 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10291 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10292 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10293 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
10294 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10295 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10296 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10297 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10298 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10299 ; GFX10-WGP-NEXT:    s_endpgm
10301 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10302 ; GFX10-CU:       ; %bb.0: ; %entry
10303 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10304 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10305 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10306 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10307 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10308 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
10309 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10310 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10311 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10312 ; GFX10-CU-NEXT:    buffer_gl0_inv
10313 ; GFX10-CU-NEXT:    buffer_gl1_inv
10314 ; GFX10-CU-NEXT:    s_endpgm
10316 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10317 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10318 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10319 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10320 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10321 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10322 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10323 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10324 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10325 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10326 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10327 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10328 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10329 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10331 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10332 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10333 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10334 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10335 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10336 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10337 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10338 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10339 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10340 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10341 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10343 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10344 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10345 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10346 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10347 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10348 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10349 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10350 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10351 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10352 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10353 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10355 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10356 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10357 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10358 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10359 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10360 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10361 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
10362 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10363 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10364 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10365 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10366 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10368 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10369 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10370 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10371 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10372 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10373 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10374 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
10375 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10376 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10377 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10378 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10379 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10381 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10382 ; GFX11-WGP:       ; %bb.0: ; %entry
10383 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10384 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10385 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10386 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10387 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
10388 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10389 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10390 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10391 ; GFX11-WGP-NEXT:    buffer_gl0_inv
10392 ; GFX11-WGP-NEXT:    buffer_gl1_inv
10393 ; GFX11-WGP-NEXT:    s_endpgm
10395 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_monotonic_cmpxchg:
10396 ; GFX11-CU:       ; %bb.0: ; %entry
10397 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10398 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10399 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10400 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10401 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
10402 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10403 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10404 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10405 ; GFX11-CU-NEXT:    buffer_gl0_inv
10406 ; GFX11-CU-NEXT:    buffer_gl1_inv
10407 ; GFX11-CU-NEXT:    s_endpgm
10408     ptr addrspace(1) %out, i32 %in, i32 %old) {
10409 entry:
10410   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10411   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst monotonic
10412   ret void
10415 define amdgpu_kernel void @global_agent_one_as_monotonic_acquire_cmpxchg(
10416 ; GFX6-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10417 ; GFX6:       ; %bb.0: ; %entry
10418 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10419 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10420 ; GFX6-NEXT:    s_mov_b32 s6, -1
10421 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10422 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10423 ; GFX6-NEXT:    s_mov_b32 s4, s0
10424 ; GFX6-NEXT:    s_mov_b32 s5, s1
10425 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10426 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10427 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10428 ; GFX6-NEXT:    buffer_wbinvl1
10429 ; GFX6-NEXT:    s_endpgm
10431 ; GFX7-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10432 ; GFX7:       ; %bb.0: ; %entry
10433 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10434 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10435 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10436 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10437 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10438 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10439 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10440 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10441 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10442 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10443 ; GFX7-NEXT:    buffer_wbinvl1_vol
10444 ; GFX7-NEXT:    s_endpgm
10446 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10447 ; GFX10-WGP:       ; %bb.0: ; %entry
10448 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10449 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10450 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10451 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10452 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10453 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10454 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10455 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10456 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10457 ; GFX10-WGP-NEXT:    s_endpgm
10459 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10460 ; GFX10-CU:       ; %bb.0: ; %entry
10461 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10462 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10463 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10464 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10465 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10466 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10467 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10468 ; GFX10-CU-NEXT:    buffer_gl0_inv
10469 ; GFX10-CU-NEXT:    buffer_gl1_inv
10470 ; GFX10-CU-NEXT:    s_endpgm
10472 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10473 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10474 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10475 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10476 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10477 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10478 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10479 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10480 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10481 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10482 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10483 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10484 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10486 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10487 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10488 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10489 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10490 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10491 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10492 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10493 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10494 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10495 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10497 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10498 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10499 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10500 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10501 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10502 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10503 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10504 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10505 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10506 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10508 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10509 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10510 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10511 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10512 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10513 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10514 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10515 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10516 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10517 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10519 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10520 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10521 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10522 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10523 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10524 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10525 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10526 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10527 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10528 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10530 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10531 ; GFX11-WGP:       ; %bb.0: ; %entry
10532 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10533 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10534 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10535 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10536 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10537 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10538 ; GFX11-WGP-NEXT:    buffer_gl0_inv
10539 ; GFX11-WGP-NEXT:    buffer_gl1_inv
10540 ; GFX11-WGP-NEXT:    s_endpgm
10542 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_acquire_cmpxchg:
10543 ; GFX11-CU:       ; %bb.0: ; %entry
10544 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10545 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10546 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10547 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10548 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10549 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10550 ; GFX11-CU-NEXT:    buffer_gl0_inv
10551 ; GFX11-CU-NEXT:    buffer_gl1_inv
10552 ; GFX11-CU-NEXT:    s_endpgm
10553     ptr addrspace(1) %out, i32 %in, i32 %old) {
10554 entry:
10555   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10556   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic acquire
10557   ret void
10560 define amdgpu_kernel void @global_agent_one_as_acquire_acquire_cmpxchg(
10561 ; GFX6-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10562 ; GFX6:       ; %bb.0: ; %entry
10563 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10564 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10565 ; GFX6-NEXT:    s_mov_b32 s6, -1
10566 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10567 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10568 ; GFX6-NEXT:    s_mov_b32 s4, s0
10569 ; GFX6-NEXT:    s_mov_b32 s5, s1
10570 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10571 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10572 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10573 ; GFX6-NEXT:    buffer_wbinvl1
10574 ; GFX6-NEXT:    s_endpgm
10576 ; GFX7-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10577 ; GFX7:       ; %bb.0: ; %entry
10578 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10579 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10580 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10581 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10582 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10583 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10584 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10585 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10586 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10587 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10588 ; GFX7-NEXT:    buffer_wbinvl1_vol
10589 ; GFX7-NEXT:    s_endpgm
10591 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10592 ; GFX10-WGP:       ; %bb.0: ; %entry
10593 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10594 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10595 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10596 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10597 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10598 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10599 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10600 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10601 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10602 ; GFX10-WGP-NEXT:    s_endpgm
10604 ; GFX10-CU-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10605 ; GFX10-CU:       ; %bb.0: ; %entry
10606 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10607 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10608 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10609 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10610 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10611 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10612 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10613 ; GFX10-CU-NEXT:    buffer_gl0_inv
10614 ; GFX10-CU-NEXT:    buffer_gl1_inv
10615 ; GFX10-CU-NEXT:    s_endpgm
10617 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10618 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10619 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10620 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10621 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10622 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10623 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10624 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10625 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10626 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10627 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10628 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10629 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10631 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10632 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10633 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10634 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10635 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10636 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10637 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10638 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10639 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10640 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10642 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10643 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10644 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10645 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10646 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10647 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10648 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10649 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10650 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10651 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10653 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10654 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10655 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10656 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10657 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10658 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10659 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10660 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10661 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10662 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10664 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10665 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10666 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10667 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10668 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10669 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10670 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10671 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10672 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10673 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10675 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10676 ; GFX11-WGP:       ; %bb.0: ; %entry
10677 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10678 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10679 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10680 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10681 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10682 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10683 ; GFX11-WGP-NEXT:    buffer_gl0_inv
10684 ; GFX11-WGP-NEXT:    buffer_gl1_inv
10685 ; GFX11-WGP-NEXT:    s_endpgm
10687 ; GFX11-CU-LABEL: global_agent_one_as_acquire_acquire_cmpxchg:
10688 ; GFX11-CU:       ; %bb.0: ; %entry
10689 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10690 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10691 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10692 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10693 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10694 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10695 ; GFX11-CU-NEXT:    buffer_gl0_inv
10696 ; GFX11-CU-NEXT:    buffer_gl1_inv
10697 ; GFX11-CU-NEXT:    s_endpgm
10698     ptr addrspace(1) %out, i32 %in, i32 %old) {
10699 entry:
10700   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10701   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire acquire
10702   ret void
10705 define amdgpu_kernel void @global_agent_one_as_release_acquire_cmpxchg(
10706 ; GFX6-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10707 ; GFX6:       ; %bb.0: ; %entry
10708 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10709 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10710 ; GFX6-NEXT:    s_mov_b32 s6, -1
10711 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10712 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10713 ; GFX6-NEXT:    s_mov_b32 s4, s0
10714 ; GFX6-NEXT:    s_mov_b32 s5, s1
10715 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10716 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10717 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10718 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10719 ; GFX6-NEXT:    buffer_wbinvl1
10720 ; GFX6-NEXT:    s_endpgm
10722 ; GFX7-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10723 ; GFX7:       ; %bb.0: ; %entry
10724 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10725 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10726 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10727 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10728 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10729 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10730 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10731 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10732 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10733 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10734 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10735 ; GFX7-NEXT:    buffer_wbinvl1_vol
10736 ; GFX7-NEXT:    s_endpgm
10738 ; GFX10-WGP-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10739 ; GFX10-WGP:       ; %bb.0: ; %entry
10740 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10741 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10742 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10743 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10744 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10745 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
10746 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10747 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10748 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10749 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10750 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10751 ; GFX10-WGP-NEXT:    s_endpgm
10753 ; GFX10-CU-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10754 ; GFX10-CU:       ; %bb.0: ; %entry
10755 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10756 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10757 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10758 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10759 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10760 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
10761 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10762 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10763 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10764 ; GFX10-CU-NEXT:    buffer_gl0_inv
10765 ; GFX10-CU-NEXT:    buffer_gl1_inv
10766 ; GFX10-CU-NEXT:    s_endpgm
10768 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10769 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10770 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10771 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10772 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10773 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10774 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10775 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10776 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10777 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10778 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10779 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10780 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10781 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10783 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10784 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10785 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10786 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10787 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10788 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10789 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10790 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10791 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10792 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10793 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10795 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10796 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10797 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10798 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10799 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10800 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10801 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10802 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10803 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10804 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10805 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10807 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10808 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10809 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10810 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10811 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10812 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10813 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
10814 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10815 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10816 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10817 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10818 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10820 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10821 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10822 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10823 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10824 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10825 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10826 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
10827 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10828 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10829 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10830 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10831 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10833 ; GFX11-WGP-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10834 ; GFX11-WGP:       ; %bb.0: ; %entry
10835 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10836 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10837 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10838 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10839 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
10840 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10841 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10842 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10843 ; GFX11-WGP-NEXT:    buffer_gl0_inv
10844 ; GFX11-WGP-NEXT:    buffer_gl1_inv
10845 ; GFX11-WGP-NEXT:    s_endpgm
10847 ; GFX11-CU-LABEL: global_agent_one_as_release_acquire_cmpxchg:
10848 ; GFX11-CU:       ; %bb.0: ; %entry
10849 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10850 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
10851 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
10852 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
10853 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
10854 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10855 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
10856 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10857 ; GFX11-CU-NEXT:    buffer_gl0_inv
10858 ; GFX11-CU-NEXT:    buffer_gl1_inv
10859 ; GFX11-CU-NEXT:    s_endpgm
10860     ptr addrspace(1) %out, i32 %in, i32 %old) {
10861 entry:
10862   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
10863   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") release acquire
10864   ret void
10867 define amdgpu_kernel void @global_agent_one_as_acq_rel_acquire_cmpxchg(
10868 ; GFX6-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10869 ; GFX6:       ; %bb.0: ; %entry
10870 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10871 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
10872 ; GFX6-NEXT:    s_mov_b32 s6, -1
10873 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
10874 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
10875 ; GFX6-NEXT:    s_mov_b32 s4, s0
10876 ; GFX6-NEXT:    s_mov_b32 s5, s1
10877 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
10878 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10879 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10880 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
10881 ; GFX6-NEXT:    buffer_wbinvl1
10882 ; GFX6-NEXT:    s_endpgm
10884 ; GFX7-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10885 ; GFX7:       ; %bb.0: ; %entry
10886 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10887 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
10888 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
10889 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
10890 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
10891 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
10892 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
10893 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
10894 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10895 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
10896 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
10897 ; GFX7-NEXT:    buffer_wbinvl1_vol
10898 ; GFX7-NEXT:    s_endpgm
10900 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10901 ; GFX10-WGP:       ; %bb.0: ; %entry
10902 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10903 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
10904 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
10905 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
10906 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
10907 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
10908 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10909 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10910 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
10911 ; GFX10-WGP-NEXT:    buffer_gl0_inv
10912 ; GFX10-WGP-NEXT:    buffer_gl1_inv
10913 ; GFX10-WGP-NEXT:    s_endpgm
10915 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10916 ; GFX10-CU:       ; %bb.0: ; %entry
10917 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10918 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
10919 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
10920 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
10921 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
10922 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
10923 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10924 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10925 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
10926 ; GFX10-CU-NEXT:    buffer_gl0_inv
10927 ; GFX10-CU-NEXT:    buffer_gl1_inv
10928 ; GFX10-CU-NEXT:    s_endpgm
10930 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10931 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
10932 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10933 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
10934 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
10935 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
10936 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
10937 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
10938 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
10939 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
10940 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10941 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
10942 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
10943 ; SKIP-CACHE-INV-NEXT:    s_endpgm
10945 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10946 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
10947 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10948 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10949 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10950 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10951 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10952 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10953 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10954 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
10955 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
10957 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10958 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
10959 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
10960 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10961 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10962 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
10963 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10964 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10965 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10966 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
10967 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
10969 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10970 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
10971 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10972 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10973 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10974 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10975 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
10976 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10977 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10978 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10979 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
10980 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
10982 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10983 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
10984 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
10985 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
10986 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
10987 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
10988 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
10989 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10990 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
10991 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
10992 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
10993 ; GFX940-TGSPLIT-NEXT:    s_endpgm
10995 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
10996 ; GFX11-WGP:       ; %bb.0: ; %entry
10997 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
10998 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
10999 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11000 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11001 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11002 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11003 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11004 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11005 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11006 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11007 ; GFX11-WGP-NEXT:    s_endpgm
11009 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_acquire_cmpxchg:
11010 ; GFX11-CU:       ; %bb.0: ; %entry
11011 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11012 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11013 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11014 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11015 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11016 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11017 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11018 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11019 ; GFX11-CU-NEXT:    buffer_gl0_inv
11020 ; GFX11-CU-NEXT:    buffer_gl1_inv
11021 ; GFX11-CU-NEXT:    s_endpgm
11022     ptr addrspace(1) %out, i32 %in, i32 %old) {
11023 entry:
11024   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11025   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel acquire
11026   ret void
11029 define amdgpu_kernel void @global_agent_one_as_seq_cst_acquire_cmpxchg(
11030 ; GFX6-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11031 ; GFX6:       ; %bb.0: ; %entry
11032 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11033 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11034 ; GFX6-NEXT:    s_mov_b32 s6, -1
11035 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11036 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11037 ; GFX6-NEXT:    s_mov_b32 s4, s0
11038 ; GFX6-NEXT:    s_mov_b32 s5, s1
11039 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11040 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11041 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11042 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11043 ; GFX6-NEXT:    buffer_wbinvl1
11044 ; GFX6-NEXT:    s_endpgm
11046 ; GFX7-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11047 ; GFX7:       ; %bb.0: ; %entry
11048 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11049 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11050 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11051 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11052 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11053 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11054 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11055 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11056 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11057 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11058 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11059 ; GFX7-NEXT:    buffer_wbinvl1_vol
11060 ; GFX7-NEXT:    s_endpgm
11062 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11063 ; GFX10-WGP:       ; %bb.0: ; %entry
11064 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11065 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11066 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11067 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11068 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11069 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11070 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11071 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11072 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11073 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11074 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11075 ; GFX10-WGP-NEXT:    s_endpgm
11077 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11078 ; GFX10-CU:       ; %bb.0: ; %entry
11079 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11080 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11081 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11082 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11083 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11084 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11085 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11086 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11087 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11088 ; GFX10-CU-NEXT:    buffer_gl0_inv
11089 ; GFX10-CU-NEXT:    buffer_gl1_inv
11090 ; GFX10-CU-NEXT:    s_endpgm
11092 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11093 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11094 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11095 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11096 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11097 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11098 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11099 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11100 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11101 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11102 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11103 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11104 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11105 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11107 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11108 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11109 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11110 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11111 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11112 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11113 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11114 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11115 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11116 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11117 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11119 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11120 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11121 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11122 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11123 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11124 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11125 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11126 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11127 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11128 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11129 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11131 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11132 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11133 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11134 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11135 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11136 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11137 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11138 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11139 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11140 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11141 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11142 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11144 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11145 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11146 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11147 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11148 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11149 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11150 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11151 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11152 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11153 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11154 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11155 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11157 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11158 ; GFX11-WGP:       ; %bb.0: ; %entry
11159 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11160 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11161 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11162 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11163 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11164 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11165 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11166 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11167 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11168 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11169 ; GFX11-WGP-NEXT:    s_endpgm
11171 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_acquire_cmpxchg:
11172 ; GFX11-CU:       ; %bb.0: ; %entry
11173 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11174 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11175 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11176 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11177 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11178 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11179 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11180 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11181 ; GFX11-CU-NEXT:    buffer_gl0_inv
11182 ; GFX11-CU-NEXT:    buffer_gl1_inv
11183 ; GFX11-CU-NEXT:    s_endpgm
11184     ptr addrspace(1) %out, i32 %in, i32 %old) {
11185 entry:
11186   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11187   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst acquire
11188   ret void
11191 define amdgpu_kernel void @global_agent_one_as_monotonic_seq_cst_cmpxchg(
11192 ; GFX6-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11193 ; GFX6:       ; %bb.0: ; %entry
11194 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11195 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11196 ; GFX6-NEXT:    s_mov_b32 s6, -1
11197 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11198 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11199 ; GFX6-NEXT:    s_mov_b32 s4, s0
11200 ; GFX6-NEXT:    s_mov_b32 s5, s1
11201 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11202 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11203 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11204 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11205 ; GFX6-NEXT:    buffer_wbinvl1
11206 ; GFX6-NEXT:    s_endpgm
11208 ; GFX7-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11209 ; GFX7:       ; %bb.0: ; %entry
11210 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11211 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11212 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11213 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11214 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11215 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11216 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11217 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11218 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11219 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11220 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11221 ; GFX7-NEXT:    buffer_wbinvl1_vol
11222 ; GFX7-NEXT:    s_endpgm
11224 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11225 ; GFX10-WGP:       ; %bb.0: ; %entry
11226 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11227 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11228 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11229 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11230 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11231 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11232 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11233 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11234 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11235 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11236 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11237 ; GFX10-WGP-NEXT:    s_endpgm
11239 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11240 ; GFX10-CU:       ; %bb.0: ; %entry
11241 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11242 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11243 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11244 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11245 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11246 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11247 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11248 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11249 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11250 ; GFX10-CU-NEXT:    buffer_gl0_inv
11251 ; GFX10-CU-NEXT:    buffer_gl1_inv
11252 ; GFX10-CU-NEXT:    s_endpgm
11254 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11255 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11256 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11257 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11258 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11259 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11260 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11261 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11262 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11263 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11264 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11265 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11266 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11267 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11269 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11270 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11271 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11272 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11273 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11274 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11275 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11276 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11277 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11278 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11279 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11281 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11282 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11283 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11284 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11285 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11286 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11287 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11288 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11289 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11290 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11291 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11293 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11294 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11295 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11296 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11297 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11298 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11299 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11300 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11301 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11302 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11303 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11304 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11306 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11307 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11308 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11309 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11310 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11311 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11312 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11313 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11314 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11315 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11316 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11317 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11319 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11320 ; GFX11-WGP:       ; %bb.0: ; %entry
11321 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11322 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11323 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11324 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11325 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11326 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11327 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11328 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11329 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11330 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11331 ; GFX11-WGP-NEXT:    s_endpgm
11333 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_seq_cst_cmpxchg:
11334 ; GFX11-CU:       ; %bb.0: ; %entry
11335 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11336 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11337 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11338 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11339 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11340 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11341 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11342 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11343 ; GFX11-CU-NEXT:    buffer_gl0_inv
11344 ; GFX11-CU-NEXT:    buffer_gl1_inv
11345 ; GFX11-CU-NEXT:    s_endpgm
11346     ptr addrspace(1) %out, i32 %in, i32 %old) {
11347 entry:
11348   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11349   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic seq_cst
11350   ret void
11353 define amdgpu_kernel void @global_agent_one_as_acquire_seq_cst_cmpxchg(
11354 ; GFX6-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11355 ; GFX6:       ; %bb.0: ; %entry
11356 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11357 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11358 ; GFX6-NEXT:    s_mov_b32 s6, -1
11359 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11360 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11361 ; GFX6-NEXT:    s_mov_b32 s4, s0
11362 ; GFX6-NEXT:    s_mov_b32 s5, s1
11363 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11364 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11365 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11366 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11367 ; GFX6-NEXT:    buffer_wbinvl1
11368 ; GFX6-NEXT:    s_endpgm
11370 ; GFX7-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11371 ; GFX7:       ; %bb.0: ; %entry
11372 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11373 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11374 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11375 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11376 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11377 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11378 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11379 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11380 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11381 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11382 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11383 ; GFX7-NEXT:    buffer_wbinvl1_vol
11384 ; GFX7-NEXT:    s_endpgm
11386 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11387 ; GFX10-WGP:       ; %bb.0: ; %entry
11388 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11389 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11390 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11391 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11392 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11393 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11394 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11395 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11396 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11397 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11398 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11399 ; GFX10-WGP-NEXT:    s_endpgm
11401 ; GFX10-CU-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11402 ; GFX10-CU:       ; %bb.0: ; %entry
11403 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11404 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11405 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11406 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11407 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11408 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11409 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11410 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11411 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11412 ; GFX10-CU-NEXT:    buffer_gl0_inv
11413 ; GFX10-CU-NEXT:    buffer_gl1_inv
11414 ; GFX10-CU-NEXT:    s_endpgm
11416 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11417 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11418 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11419 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11420 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11421 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11422 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11423 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11424 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11425 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11426 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11427 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11428 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11429 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11431 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11432 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11433 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11434 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11435 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11436 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11437 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11438 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11439 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11440 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11441 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11443 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11444 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11445 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11446 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11447 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11448 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11449 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11450 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11451 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11452 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11453 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11455 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11456 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11457 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11458 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11459 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11460 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11461 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11462 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11463 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11464 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11465 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11466 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11468 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11469 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11470 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11471 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11472 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11473 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11474 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11475 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11476 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11477 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11478 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11479 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11481 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11482 ; GFX11-WGP:       ; %bb.0: ; %entry
11483 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11484 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11485 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11486 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11487 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11488 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11489 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11490 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11491 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11492 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11493 ; GFX11-WGP-NEXT:    s_endpgm
11495 ; GFX11-CU-LABEL: global_agent_one_as_acquire_seq_cst_cmpxchg:
11496 ; GFX11-CU:       ; %bb.0: ; %entry
11497 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11498 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11499 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11500 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11501 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11502 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11503 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11504 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11505 ; GFX11-CU-NEXT:    buffer_gl0_inv
11506 ; GFX11-CU-NEXT:    buffer_gl1_inv
11507 ; GFX11-CU-NEXT:    s_endpgm
11508     ptr addrspace(1) %out, i32 %in, i32 %old) {
11509 entry:
11510   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11511   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire seq_cst
11512   ret void
11515 define amdgpu_kernel void @global_agent_one_as_release_seq_cst_cmpxchg(
11516 ; GFX6-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11517 ; GFX6:       ; %bb.0: ; %entry
11518 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11519 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11520 ; GFX6-NEXT:    s_mov_b32 s6, -1
11521 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11522 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11523 ; GFX6-NEXT:    s_mov_b32 s4, s0
11524 ; GFX6-NEXT:    s_mov_b32 s5, s1
11525 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11526 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11527 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11528 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11529 ; GFX6-NEXT:    buffer_wbinvl1
11530 ; GFX6-NEXT:    s_endpgm
11532 ; GFX7-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11533 ; GFX7:       ; %bb.0: ; %entry
11534 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11535 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11536 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11537 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11538 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11539 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11540 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11541 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11542 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11543 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11544 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11545 ; GFX7-NEXT:    buffer_wbinvl1_vol
11546 ; GFX7-NEXT:    s_endpgm
11548 ; GFX10-WGP-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11549 ; GFX10-WGP:       ; %bb.0: ; %entry
11550 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11551 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11552 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11553 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11554 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11555 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11556 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11557 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11558 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11559 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11560 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11561 ; GFX10-WGP-NEXT:    s_endpgm
11563 ; GFX10-CU-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11564 ; GFX10-CU:       ; %bb.0: ; %entry
11565 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11566 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11567 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11568 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11569 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11570 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11571 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11572 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11573 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11574 ; GFX10-CU-NEXT:    buffer_gl0_inv
11575 ; GFX10-CU-NEXT:    buffer_gl1_inv
11576 ; GFX10-CU-NEXT:    s_endpgm
11578 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11579 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11580 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11581 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11582 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11583 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11584 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11585 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11586 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11587 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11588 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11589 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11590 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11591 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11593 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11594 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11595 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11596 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11597 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11598 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11599 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11600 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11601 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11602 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11603 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11605 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11606 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11607 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11608 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11609 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11610 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11611 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11612 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11613 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11614 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11615 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11617 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11618 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11619 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11620 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11621 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11622 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11623 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11624 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11625 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11626 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11627 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11628 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11630 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11631 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11632 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11633 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11634 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11635 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11636 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11637 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11638 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11639 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11640 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11641 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11643 ; GFX11-WGP-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11644 ; GFX11-WGP:       ; %bb.0: ; %entry
11645 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11646 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11647 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11648 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11649 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11650 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11651 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11652 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11653 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11654 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11655 ; GFX11-WGP-NEXT:    s_endpgm
11657 ; GFX11-CU-LABEL: global_agent_one_as_release_seq_cst_cmpxchg:
11658 ; GFX11-CU:       ; %bb.0: ; %entry
11659 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11660 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11661 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11662 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11663 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11664 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11665 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11666 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11667 ; GFX11-CU-NEXT:    buffer_gl0_inv
11668 ; GFX11-CU-NEXT:    buffer_gl1_inv
11669 ; GFX11-CU-NEXT:    s_endpgm
11670     ptr addrspace(1) %out, i32 %in, i32 %old) {
11671 entry:
11672   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11673   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") release seq_cst
11674   ret void
11677 define amdgpu_kernel void @global_agent_one_as_acq_rel_seq_cst_cmpxchg(
11678 ; GFX6-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11679 ; GFX6:       ; %bb.0: ; %entry
11680 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11681 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11682 ; GFX6-NEXT:    s_mov_b32 s6, -1
11683 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11684 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11685 ; GFX6-NEXT:    s_mov_b32 s4, s0
11686 ; GFX6-NEXT:    s_mov_b32 s5, s1
11687 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11688 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11689 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11690 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11691 ; GFX6-NEXT:    buffer_wbinvl1
11692 ; GFX6-NEXT:    s_endpgm
11694 ; GFX7-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11695 ; GFX7:       ; %bb.0: ; %entry
11696 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11697 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11698 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11699 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11700 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11701 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11702 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11703 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11704 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11705 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11706 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11707 ; GFX7-NEXT:    buffer_wbinvl1_vol
11708 ; GFX7-NEXT:    s_endpgm
11710 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11711 ; GFX10-WGP:       ; %bb.0: ; %entry
11712 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11713 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11714 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11715 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11716 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11717 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11718 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11719 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11720 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11721 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11722 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11723 ; GFX10-WGP-NEXT:    s_endpgm
11725 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11726 ; GFX10-CU:       ; %bb.0: ; %entry
11727 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11728 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11729 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11730 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11731 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11732 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11733 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11734 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11735 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11736 ; GFX10-CU-NEXT:    buffer_gl0_inv
11737 ; GFX10-CU-NEXT:    buffer_gl1_inv
11738 ; GFX10-CU-NEXT:    s_endpgm
11740 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11741 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11742 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11743 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11744 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11745 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11746 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11747 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11748 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11749 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11750 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11751 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11752 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11753 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11755 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11756 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11757 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11758 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11759 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11760 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11761 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11762 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11763 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11764 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11765 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11767 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11768 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11769 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11770 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11771 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11772 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11773 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11774 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11775 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11776 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11777 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11779 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11780 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11781 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11782 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11783 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11784 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11785 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11786 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11787 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11788 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11789 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11790 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11792 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11793 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11794 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11795 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11796 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11797 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11798 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11799 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11800 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11801 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11802 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11803 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11805 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11806 ; GFX11-WGP:       ; %bb.0: ; %entry
11807 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11808 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11809 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11810 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11811 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11812 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11813 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11814 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11815 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11816 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11817 ; GFX11-WGP-NEXT:    s_endpgm
11819 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_seq_cst_cmpxchg:
11820 ; GFX11-CU:       ; %bb.0: ; %entry
11821 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11822 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11823 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11824 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11825 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11826 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11827 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11828 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11829 ; GFX11-CU-NEXT:    buffer_gl0_inv
11830 ; GFX11-CU-NEXT:    buffer_gl1_inv
11831 ; GFX11-CU-NEXT:    s_endpgm
11832     ptr addrspace(1) %out, i32 %in, i32 %old) {
11833 entry:
11834   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11835   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel seq_cst
11836   ret void
11839 define amdgpu_kernel void @global_agent_one_as_seq_cst_seq_cst_cmpxchg(
11840 ; GFX6-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11841 ; GFX6:       ; %bb.0: ; %entry
11842 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11843 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
11844 ; GFX6-NEXT:    s_mov_b32 s6, -1
11845 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
11846 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
11847 ; GFX6-NEXT:    s_mov_b32 s4, s0
11848 ; GFX6-NEXT:    s_mov_b32 s5, s1
11849 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
11850 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11851 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11852 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
11853 ; GFX6-NEXT:    buffer_wbinvl1
11854 ; GFX6-NEXT:    s_endpgm
11856 ; GFX7-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11857 ; GFX7:       ; %bb.0: ; %entry
11858 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11859 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
11860 ; GFX7-NEXT:    s_add_u32 s0, s0, 16
11861 ; GFX7-NEXT:    s_addc_u32 s1, s1, 0
11862 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
11863 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
11864 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
11865 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
11866 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11867 ; GFX7-NEXT:    flat_atomic_cmpswap v[0:1], v[2:3]
11868 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
11869 ; GFX7-NEXT:    buffer_wbinvl1_vol
11870 ; GFX7-NEXT:    s_endpgm
11872 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11873 ; GFX10-WGP:       ; %bb.0: ; %entry
11874 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11875 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
11876 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11877 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
11878 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
11879 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
11880 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11881 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11882 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11883 ; GFX10-WGP-NEXT:    buffer_gl0_inv
11884 ; GFX10-WGP-NEXT:    buffer_gl1_inv
11885 ; GFX10-WGP-NEXT:    s_endpgm
11887 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11888 ; GFX10-CU:       ; %bb.0: ; %entry
11889 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11890 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
11891 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
11892 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
11893 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
11894 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
11895 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11896 ; GFX10-CU-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11897 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11898 ; GFX10-CU-NEXT:    buffer_gl0_inv
11899 ; GFX10-CU-NEXT:    buffer_gl1_inv
11900 ; GFX10-CU-NEXT:    s_endpgm
11902 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11903 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
11904 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11905 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
11906 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
11907 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
11908 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
11909 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
11910 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
11911 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
11912 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11913 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16
11914 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
11915 ; SKIP-CACHE-INV-NEXT:    s_endpgm
11917 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11918 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
11919 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11920 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11921 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11922 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11923 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11924 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11925 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11926 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
11927 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
11929 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11930 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
11931 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11932 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11933 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11934 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
11935 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11936 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11937 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11938 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
11939 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
11941 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11942 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
11943 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11944 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11945 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11946 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11947 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
11948 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11949 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11950 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11951 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
11952 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
11954 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11955 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
11956 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
11957 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
11958 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
11959 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
11960 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
11961 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11962 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v2, v[0:1], s[0:1] offset:16
11963 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
11964 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
11965 ; GFX940-TGSPLIT-NEXT:    s_endpgm
11967 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11968 ; GFX11-WGP:       ; %bb.0: ; %entry
11969 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11970 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
11971 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
11972 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11973 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
11974 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11975 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11976 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
11977 ; GFX11-WGP-NEXT:    buffer_gl0_inv
11978 ; GFX11-WGP-NEXT:    buffer_gl1_inv
11979 ; GFX11-WGP-NEXT:    s_endpgm
11981 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_seq_cst_cmpxchg:
11982 ; GFX11-CU:       ; %bb.0: ; %entry
11983 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
11984 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
11985 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
11986 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
11987 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
11988 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11989 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v2, v[0:1], s[0:1] offset:16
11990 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
11991 ; GFX11-CU-NEXT:    buffer_gl0_inv
11992 ; GFX11-CU-NEXT:    buffer_gl1_inv
11993 ; GFX11-CU-NEXT:    s_endpgm
11994     ptr addrspace(1) %out, i32 %in, i32 %old) {
11995 entry:
11996   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
11997   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst seq_cst
11998   ret void
12001 define amdgpu_kernel void @global_agent_one_as_monotonic_monotonic_ret_cmpxchg(
12002 ; GFX6-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12003 ; GFX6:       ; %bb.0: ; %entry
12004 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12005 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12006 ; GFX6-NEXT:    s_mov_b32 s6, -1
12007 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12008 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12009 ; GFX6-NEXT:    s_mov_b32 s4, s0
12010 ; GFX6-NEXT:    s_mov_b32 s5, s1
12011 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12012 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12013 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12014 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12015 ; GFX6-NEXT:    s_endpgm
12017 ; GFX7-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12018 ; GFX7:       ; %bb.0: ; %entry
12019 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12020 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12021 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12022 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12023 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12024 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12025 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12026 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12027 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12028 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12029 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12030 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12031 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12032 ; GFX7-NEXT:    s_endpgm
12034 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12035 ; GFX10-WGP:       ; %bb.0: ; %entry
12036 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12037 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12038 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12039 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12040 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12041 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12042 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12043 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12044 ; GFX10-WGP-NEXT:    s_endpgm
12046 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12047 ; GFX10-CU:       ; %bb.0: ; %entry
12048 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12049 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12050 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12051 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12052 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12053 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12054 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12055 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12056 ; GFX10-CU-NEXT:    s_endpgm
12058 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12059 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12060 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12061 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12062 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12063 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12064 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12065 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12066 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12067 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12068 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12069 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12070 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12071 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12073 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12074 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12075 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12076 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12077 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12078 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12079 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12080 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12081 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12082 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12084 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12085 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12086 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12087 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12088 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12089 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12090 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12091 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12092 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12093 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12095 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12096 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12097 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12098 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12099 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12100 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12101 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12102 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12103 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12104 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12106 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12107 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12108 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12109 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12110 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12111 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12112 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12113 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12114 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12115 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12117 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12118 ; GFX11-WGP:       ; %bb.0: ; %entry
12119 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12120 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12121 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12122 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12123 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12124 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12125 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12126 ; GFX11-WGP-NEXT:    s_nop 0
12127 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12128 ; GFX11-WGP-NEXT:    s_endpgm
12130 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_monotonic_ret_cmpxchg:
12131 ; GFX11-CU:       ; %bb.0: ; %entry
12132 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12133 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12134 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12135 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12136 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12137 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12138 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12139 ; GFX11-CU-NEXT:    s_nop 0
12140 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12141 ; GFX11-CU-NEXT:    s_endpgm
12142     ptr addrspace(1) %out, i32 %in, i32 %old) {
12143 entry:
12144   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12145   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic monotonic
12146   %val0 = extractvalue { i32, i1 } %val, 0
12147   store i32 %val0, ptr addrspace(1) %out, align 4
12148   ret void
12151 define amdgpu_kernel void @global_agent_one_as_acquire_monotonic_ret_cmpxchg(
12152 ; GFX6-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12153 ; GFX6:       ; %bb.0: ; %entry
12154 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12155 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12156 ; GFX6-NEXT:    s_mov_b32 s6, -1
12157 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12158 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12159 ; GFX6-NEXT:    s_mov_b32 s4, s0
12160 ; GFX6-NEXT:    s_mov_b32 s5, s1
12161 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12162 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12163 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12164 ; GFX6-NEXT:    buffer_wbinvl1
12165 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12166 ; GFX6-NEXT:    s_endpgm
12168 ; GFX7-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12169 ; GFX7:       ; %bb.0: ; %entry
12170 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12171 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12172 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12173 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12174 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12175 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12176 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12177 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12178 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12179 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12180 ; GFX7-NEXT:    buffer_wbinvl1_vol
12181 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12182 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12183 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12184 ; GFX7-NEXT:    s_endpgm
12186 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12187 ; GFX10-WGP:       ; %bb.0: ; %entry
12188 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12189 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12190 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12191 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12192 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12193 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12194 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12195 ; GFX10-WGP-NEXT:    buffer_gl0_inv
12196 ; GFX10-WGP-NEXT:    buffer_gl1_inv
12197 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12198 ; GFX10-WGP-NEXT:    s_endpgm
12200 ; GFX10-CU-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12201 ; GFX10-CU:       ; %bb.0: ; %entry
12202 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12203 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12204 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12205 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12206 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12207 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12208 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12209 ; GFX10-CU-NEXT:    buffer_gl0_inv
12210 ; GFX10-CU-NEXT:    buffer_gl1_inv
12211 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12212 ; GFX10-CU-NEXT:    s_endpgm
12214 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12215 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12216 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12217 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12218 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12219 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12220 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12221 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12222 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12223 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12224 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12225 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12226 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12227 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12229 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12230 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12231 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12232 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12233 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12234 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12235 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12236 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12237 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
12238 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12239 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12241 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12242 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12243 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12244 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12245 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12246 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12247 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12248 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12249 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
12250 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12251 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12253 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12254 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12255 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12256 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12257 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12258 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12259 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12260 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12261 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
12262 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12263 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12265 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12266 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12267 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12268 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12269 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12270 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12271 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12272 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12273 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
12274 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12275 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12277 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12278 ; GFX11-WGP:       ; %bb.0: ; %entry
12279 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12280 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12281 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12282 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12283 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12284 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12285 ; GFX11-WGP-NEXT:    buffer_gl0_inv
12286 ; GFX11-WGP-NEXT:    buffer_gl1_inv
12287 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12288 ; GFX11-WGP-NEXT:    s_nop 0
12289 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12290 ; GFX11-WGP-NEXT:    s_endpgm
12292 ; GFX11-CU-LABEL: global_agent_one_as_acquire_monotonic_ret_cmpxchg:
12293 ; GFX11-CU:       ; %bb.0: ; %entry
12294 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12295 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12296 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12297 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12298 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12299 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12300 ; GFX11-CU-NEXT:    buffer_gl0_inv
12301 ; GFX11-CU-NEXT:    buffer_gl1_inv
12302 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12303 ; GFX11-CU-NEXT:    s_nop 0
12304 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12305 ; GFX11-CU-NEXT:    s_endpgm
12306     ptr addrspace(1) %out, i32 %in, i32 %old) {
12307 entry:
12308   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12309   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire monotonic
12310   %val0 = extractvalue { i32, i1 } %val, 0
12311   store i32 %val0, ptr addrspace(1) %out, align 4
12312   ret void
12315 define amdgpu_kernel void @global_agent_one_as_acq_rel_monotonic_ret_cmpxchg(
12316 ; GFX6-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12317 ; GFX6:       ; %bb.0: ; %entry
12318 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12319 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12320 ; GFX6-NEXT:    s_mov_b32 s6, -1
12321 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12322 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12323 ; GFX6-NEXT:    s_mov_b32 s4, s0
12324 ; GFX6-NEXT:    s_mov_b32 s5, s1
12325 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12326 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12327 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12328 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12329 ; GFX6-NEXT:    buffer_wbinvl1
12330 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12331 ; GFX6-NEXT:    s_endpgm
12333 ; GFX7-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12334 ; GFX7:       ; %bb.0: ; %entry
12335 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12336 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12337 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12338 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12339 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12340 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12341 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12342 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12343 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12344 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12345 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12346 ; GFX7-NEXT:    buffer_wbinvl1_vol
12347 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12348 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12349 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12350 ; GFX7-NEXT:    s_endpgm
12352 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12353 ; GFX10-WGP:       ; %bb.0: ; %entry
12354 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12355 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12356 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12357 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12358 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12359 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12360 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
12361 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12362 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12363 ; GFX10-WGP-NEXT:    buffer_gl0_inv
12364 ; GFX10-WGP-NEXT:    buffer_gl1_inv
12365 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12366 ; GFX10-WGP-NEXT:    s_endpgm
12368 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12369 ; GFX10-CU:       ; %bb.0: ; %entry
12370 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12371 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12372 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12373 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12374 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12375 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12376 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
12377 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12378 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12379 ; GFX10-CU-NEXT:    buffer_gl0_inv
12380 ; GFX10-CU-NEXT:    buffer_gl1_inv
12381 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12382 ; GFX10-CU-NEXT:    s_endpgm
12384 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12385 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12386 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12387 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12388 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12389 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12390 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12391 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12392 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12393 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12394 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12395 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12396 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12397 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12398 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12400 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12401 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12402 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12403 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12404 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12405 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12406 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12407 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12408 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12409 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
12410 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12411 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12413 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12414 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12415 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12416 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12417 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12418 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12419 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12420 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12421 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12422 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
12423 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12424 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12426 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12427 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12428 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12429 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12430 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12431 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12432 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
12433 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12434 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12435 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12436 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
12437 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12438 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12440 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12441 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12442 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12443 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12444 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12445 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12446 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
12447 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12448 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12449 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12450 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
12451 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12452 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12454 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12455 ; GFX11-WGP:       ; %bb.0: ; %entry
12456 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12457 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12458 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12459 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12460 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12461 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
12462 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12463 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12464 ; GFX11-WGP-NEXT:    buffer_gl0_inv
12465 ; GFX11-WGP-NEXT:    buffer_gl1_inv
12466 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12467 ; GFX11-WGP-NEXT:    s_nop 0
12468 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12469 ; GFX11-WGP-NEXT:    s_endpgm
12471 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_monotonic_ret_cmpxchg:
12472 ; GFX11-CU:       ; %bb.0: ; %entry
12473 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12474 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12475 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12476 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12477 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12478 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
12479 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12480 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12481 ; GFX11-CU-NEXT:    buffer_gl0_inv
12482 ; GFX11-CU-NEXT:    buffer_gl1_inv
12483 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12484 ; GFX11-CU-NEXT:    s_nop 0
12485 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12486 ; GFX11-CU-NEXT:    s_endpgm
12487     ptr addrspace(1) %out, i32 %in, i32 %old) {
12488 entry:
12489   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12490   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel monotonic
12491   %val0 = extractvalue { i32, i1 } %val, 0
12492   store i32 %val0, ptr addrspace(1) %out, align 4
12493   ret void
12496 define amdgpu_kernel void @global_agent_one_as_seq_cst_monotonic_ret_cmpxchg(
12497 ; GFX6-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12498 ; GFX6:       ; %bb.0: ; %entry
12499 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12500 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12501 ; GFX6-NEXT:    s_mov_b32 s6, -1
12502 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12503 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12504 ; GFX6-NEXT:    s_mov_b32 s4, s0
12505 ; GFX6-NEXT:    s_mov_b32 s5, s1
12506 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12507 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12508 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12509 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12510 ; GFX6-NEXT:    buffer_wbinvl1
12511 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12512 ; GFX6-NEXT:    s_endpgm
12514 ; GFX7-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12515 ; GFX7:       ; %bb.0: ; %entry
12516 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12517 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12518 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12519 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12520 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12521 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12522 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12523 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12524 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12525 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12526 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12527 ; GFX7-NEXT:    buffer_wbinvl1_vol
12528 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12529 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12530 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12531 ; GFX7-NEXT:    s_endpgm
12533 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12534 ; GFX10-WGP:       ; %bb.0: ; %entry
12535 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12536 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12537 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12538 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12539 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12540 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12541 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
12542 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12543 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12544 ; GFX10-WGP-NEXT:    buffer_gl0_inv
12545 ; GFX10-WGP-NEXT:    buffer_gl1_inv
12546 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12547 ; GFX10-WGP-NEXT:    s_endpgm
12549 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12550 ; GFX10-CU:       ; %bb.0: ; %entry
12551 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12552 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12553 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12554 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12555 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12556 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12557 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
12558 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12559 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12560 ; GFX10-CU-NEXT:    buffer_gl0_inv
12561 ; GFX10-CU-NEXT:    buffer_gl1_inv
12562 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12563 ; GFX10-CU-NEXT:    s_endpgm
12565 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12566 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12567 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12568 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12569 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12570 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12571 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12572 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12573 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12574 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12575 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12576 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12577 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12578 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12579 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12581 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12582 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12583 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12584 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12585 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12586 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12587 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12588 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12589 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12590 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
12591 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12592 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12594 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12595 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12596 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12597 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12598 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12599 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12600 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12601 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12602 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12603 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
12604 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12605 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12607 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12608 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12609 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12610 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12611 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12612 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12613 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
12614 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12615 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12616 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12617 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
12618 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12619 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12621 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12622 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12623 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12624 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12625 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12626 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12627 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
12628 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12629 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12630 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12631 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
12632 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12633 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12635 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12636 ; GFX11-WGP:       ; %bb.0: ; %entry
12637 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12638 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12639 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12640 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12641 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12642 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
12643 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12644 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12645 ; GFX11-WGP-NEXT:    buffer_gl0_inv
12646 ; GFX11-WGP-NEXT:    buffer_gl1_inv
12647 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12648 ; GFX11-WGP-NEXT:    s_nop 0
12649 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12650 ; GFX11-WGP-NEXT:    s_endpgm
12652 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_monotonic_ret_cmpxchg:
12653 ; GFX11-CU:       ; %bb.0: ; %entry
12654 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12655 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12656 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12657 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12658 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12659 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
12660 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12661 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12662 ; GFX11-CU-NEXT:    buffer_gl0_inv
12663 ; GFX11-CU-NEXT:    buffer_gl1_inv
12664 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12665 ; GFX11-CU-NEXT:    s_nop 0
12666 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12667 ; GFX11-CU-NEXT:    s_endpgm
12668     ptr addrspace(1) %out, i32 %in, i32 %old) {
12669 entry:
12670   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12671   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst monotonic
12672   %val0 = extractvalue { i32, i1 } %val, 0
12673   store i32 %val0, ptr addrspace(1) %out, align 4
12674   ret void
12677 define amdgpu_kernel void @global_agent_one_as_monotonic_acquire_ret_cmpxchg(
12678 ; GFX6-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12679 ; GFX6:       ; %bb.0: ; %entry
12680 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12681 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12682 ; GFX6-NEXT:    s_mov_b32 s6, -1
12683 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12684 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12685 ; GFX6-NEXT:    s_mov_b32 s4, s0
12686 ; GFX6-NEXT:    s_mov_b32 s5, s1
12687 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12688 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12689 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12690 ; GFX6-NEXT:    buffer_wbinvl1
12691 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12692 ; GFX6-NEXT:    s_endpgm
12694 ; GFX7-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12695 ; GFX7:       ; %bb.0: ; %entry
12696 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12697 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12698 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12699 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12700 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12701 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12702 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12703 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12704 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12705 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12706 ; GFX7-NEXT:    buffer_wbinvl1_vol
12707 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12708 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12709 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12710 ; GFX7-NEXT:    s_endpgm
12712 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12713 ; GFX10-WGP:       ; %bb.0: ; %entry
12714 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12715 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12716 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12717 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12718 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12719 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12720 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12721 ; GFX10-WGP-NEXT:    buffer_gl0_inv
12722 ; GFX10-WGP-NEXT:    buffer_gl1_inv
12723 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12724 ; GFX10-WGP-NEXT:    s_endpgm
12726 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12727 ; GFX10-CU:       ; %bb.0: ; %entry
12728 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12729 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12730 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12731 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12732 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12733 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12734 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12735 ; GFX10-CU-NEXT:    buffer_gl0_inv
12736 ; GFX10-CU-NEXT:    buffer_gl1_inv
12737 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12738 ; GFX10-CU-NEXT:    s_endpgm
12740 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12741 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12742 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12743 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12744 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12745 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12746 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12747 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12748 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12749 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12750 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12751 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12752 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12753 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12755 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12756 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12757 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12758 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12759 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12760 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12761 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12762 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12763 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
12764 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12765 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12767 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12768 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12769 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12770 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12771 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12772 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12773 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12774 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12775 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
12776 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12777 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12779 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12780 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12781 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12782 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12783 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12784 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12785 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12786 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12787 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
12788 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12789 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12791 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12792 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12793 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12794 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12795 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12796 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12797 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12798 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12799 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
12800 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12801 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12803 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12804 ; GFX11-WGP:       ; %bb.0: ; %entry
12805 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12806 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12807 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12808 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12809 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12810 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12811 ; GFX11-WGP-NEXT:    buffer_gl0_inv
12812 ; GFX11-WGP-NEXT:    buffer_gl1_inv
12813 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12814 ; GFX11-WGP-NEXT:    s_nop 0
12815 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12816 ; GFX11-WGP-NEXT:    s_endpgm
12818 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_acquire_ret_cmpxchg:
12819 ; GFX11-CU:       ; %bb.0: ; %entry
12820 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12821 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12822 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12823 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12824 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12825 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12826 ; GFX11-CU-NEXT:    buffer_gl0_inv
12827 ; GFX11-CU-NEXT:    buffer_gl1_inv
12828 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12829 ; GFX11-CU-NEXT:    s_nop 0
12830 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12831 ; GFX11-CU-NEXT:    s_endpgm
12832     ptr addrspace(1) %out, i32 %in, i32 %old) {
12833 entry:
12834   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12835   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic acquire
12836   %val0 = extractvalue { i32, i1 } %val, 0
12837   store i32 %val0, ptr addrspace(1) %out, align 4
12838   ret void
12841 define amdgpu_kernel void @global_agent_one_as_acquire_acquire_ret_cmpxchg(
12842 ; GFX6-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12843 ; GFX6:       ; %bb.0: ; %entry
12844 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12845 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
12846 ; GFX6-NEXT:    s_mov_b32 s6, -1
12847 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
12848 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
12849 ; GFX6-NEXT:    s_mov_b32 s4, s0
12850 ; GFX6-NEXT:    s_mov_b32 s5, s1
12851 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
12852 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12853 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
12854 ; GFX6-NEXT:    buffer_wbinvl1
12855 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12856 ; GFX6-NEXT:    s_endpgm
12858 ; GFX7-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12859 ; GFX7:       ; %bb.0: ; %entry
12860 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12861 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12862 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
12863 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
12864 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
12865 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
12866 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
12867 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
12868 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
12869 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
12870 ; GFX7-NEXT:    buffer_wbinvl1_vol
12871 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
12872 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
12873 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
12874 ; GFX7-NEXT:    s_endpgm
12876 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12877 ; GFX10-WGP:       ; %bb.0: ; %entry
12878 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12879 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
12880 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12881 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
12882 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
12883 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12884 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
12885 ; GFX10-WGP-NEXT:    buffer_gl0_inv
12886 ; GFX10-WGP-NEXT:    buffer_gl1_inv
12887 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
12888 ; GFX10-WGP-NEXT:    s_endpgm
12890 ; GFX10-CU-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12891 ; GFX10-CU:       ; %bb.0: ; %entry
12892 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12893 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
12894 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
12895 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
12896 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
12897 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12898 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
12899 ; GFX10-CU-NEXT:    buffer_gl0_inv
12900 ; GFX10-CU-NEXT:    buffer_gl1_inv
12901 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
12902 ; GFX10-CU-NEXT:    s_endpgm
12904 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12905 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
12906 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12907 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
12908 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
12909 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
12910 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
12911 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
12912 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
12913 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
12914 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
12915 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
12916 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
12917 ; SKIP-CACHE-INV-NEXT:    s_endpgm
12919 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12920 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
12921 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12922 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12923 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12924 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12925 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12926 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12927 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
12928 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12929 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
12931 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12932 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
12933 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
12934 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12935 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12936 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
12937 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
12938 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12939 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
12940 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
12941 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
12943 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12944 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
12945 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12946 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12947 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12948 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12949 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12950 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12951 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
12952 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12953 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
12955 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12956 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
12957 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
12958 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
12959 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
12960 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
12961 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
12962 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
12963 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
12964 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
12965 ; GFX940-TGSPLIT-NEXT:    s_endpgm
12967 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12968 ; GFX11-WGP:       ; %bb.0: ; %entry
12969 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12970 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
12971 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
12972 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12973 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12974 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
12975 ; GFX11-WGP-NEXT:    buffer_gl0_inv
12976 ; GFX11-WGP-NEXT:    buffer_gl1_inv
12977 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
12978 ; GFX11-WGP-NEXT:    s_nop 0
12979 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12980 ; GFX11-WGP-NEXT:    s_endpgm
12982 ; GFX11-CU-LABEL: global_agent_one_as_acquire_acquire_ret_cmpxchg:
12983 ; GFX11-CU:       ; %bb.0: ; %entry
12984 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
12985 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
12986 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
12987 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
12988 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
12989 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
12990 ; GFX11-CU-NEXT:    buffer_gl0_inv
12991 ; GFX11-CU-NEXT:    buffer_gl1_inv
12992 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
12993 ; GFX11-CU-NEXT:    s_nop 0
12994 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
12995 ; GFX11-CU-NEXT:    s_endpgm
12996     ptr addrspace(1) %out, i32 %in, i32 %old) {
12997 entry:
12998   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
12999   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire acquire
13000   %val0 = extractvalue { i32, i1 } %val, 0
13001   store i32 %val0, ptr addrspace(1) %out, align 4
13002   ret void
13005 define amdgpu_kernel void @global_agent_one_as_release_acquire_ret_cmpxchg(
13006 ; GFX6-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13007 ; GFX6:       ; %bb.0: ; %entry
13008 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13009 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13010 ; GFX6-NEXT:    s_mov_b32 s6, -1
13011 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13012 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13013 ; GFX6-NEXT:    s_mov_b32 s4, s0
13014 ; GFX6-NEXT:    s_mov_b32 s5, s1
13015 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13016 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13017 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13018 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13019 ; GFX6-NEXT:    buffer_wbinvl1
13020 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13021 ; GFX6-NEXT:    s_endpgm
13023 ; GFX7-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13024 ; GFX7:       ; %bb.0: ; %entry
13025 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13026 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13027 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13028 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13029 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13030 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13031 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13032 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13033 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13034 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13035 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13036 ; GFX7-NEXT:    buffer_wbinvl1_vol
13037 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13038 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13039 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13040 ; GFX7-NEXT:    s_endpgm
13042 ; GFX10-WGP-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13043 ; GFX10-WGP:       ; %bb.0: ; %entry
13044 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13045 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13046 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13047 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13048 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13049 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13050 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13051 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13052 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13053 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13054 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13055 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13056 ; GFX10-WGP-NEXT:    s_endpgm
13058 ; GFX10-CU-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13059 ; GFX10-CU:       ; %bb.0: ; %entry
13060 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13061 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13062 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13063 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13064 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13065 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13066 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13067 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13068 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13069 ; GFX10-CU-NEXT:    buffer_gl0_inv
13070 ; GFX10-CU-NEXT:    buffer_gl1_inv
13071 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13072 ; GFX10-CU-NEXT:    s_endpgm
13074 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13075 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13076 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13077 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13078 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13079 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13080 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13081 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13082 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13083 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13084 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13085 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13086 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13087 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13088 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13090 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13091 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13092 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13093 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13094 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13095 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13096 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13097 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13098 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13099 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
13100 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13101 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
13103 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13104 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
13105 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13106 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13107 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13108 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13109 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13110 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13111 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13112 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
13113 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13114 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
13116 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13117 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
13118 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13119 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13120 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13121 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13122 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
13123 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13124 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13125 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13126 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
13127 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13128 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
13130 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13131 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
13132 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13133 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13134 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13135 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13136 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
13137 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13138 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13139 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13140 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
13141 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13142 ; GFX940-TGSPLIT-NEXT:    s_endpgm
13144 ; GFX11-WGP-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13145 ; GFX11-WGP:       ; %bb.0: ; %entry
13146 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13147 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
13148 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13149 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13150 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13151 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13152 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13153 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13154 ; GFX11-WGP-NEXT:    buffer_gl0_inv
13155 ; GFX11-WGP-NEXT:    buffer_gl1_inv
13156 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
13157 ; GFX11-WGP-NEXT:    s_nop 0
13158 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13159 ; GFX11-WGP-NEXT:    s_endpgm
13161 ; GFX11-CU-LABEL: global_agent_one_as_release_acquire_ret_cmpxchg:
13162 ; GFX11-CU:       ; %bb.0: ; %entry
13163 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13164 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
13165 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
13166 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13167 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13168 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13169 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13170 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13171 ; GFX11-CU-NEXT:    buffer_gl0_inv
13172 ; GFX11-CU-NEXT:    buffer_gl1_inv
13173 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
13174 ; GFX11-CU-NEXT:    s_nop 0
13175 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13176 ; GFX11-CU-NEXT:    s_endpgm
13177     ptr addrspace(1) %out, i32 %in, i32 %old) {
13178 entry:
13179   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
13180   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") release acquire
13181   %val0 = extractvalue { i32, i1 } %val, 0
13182   store i32 %val0, ptr addrspace(1) %out, align 4
13183   ret void
13186 define amdgpu_kernel void @global_agent_one_as_acq_rel_acquire_ret_cmpxchg(
13187 ; GFX6-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13188 ; GFX6:       ; %bb.0: ; %entry
13189 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13190 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13191 ; GFX6-NEXT:    s_mov_b32 s6, -1
13192 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13193 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13194 ; GFX6-NEXT:    s_mov_b32 s4, s0
13195 ; GFX6-NEXT:    s_mov_b32 s5, s1
13196 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13197 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13198 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13199 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13200 ; GFX6-NEXT:    buffer_wbinvl1
13201 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13202 ; GFX6-NEXT:    s_endpgm
13204 ; GFX7-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13205 ; GFX7:       ; %bb.0: ; %entry
13206 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13207 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13208 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13209 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13210 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13211 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13212 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13213 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13214 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13215 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13216 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13217 ; GFX7-NEXT:    buffer_wbinvl1_vol
13218 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13219 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13220 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13221 ; GFX7-NEXT:    s_endpgm
13223 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13224 ; GFX10-WGP:       ; %bb.0: ; %entry
13225 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13226 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13227 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13228 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13229 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13230 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13231 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13232 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13233 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13234 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13235 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13236 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13237 ; GFX10-WGP-NEXT:    s_endpgm
13239 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13240 ; GFX10-CU:       ; %bb.0: ; %entry
13241 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13242 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13243 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13244 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13245 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13246 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13247 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13248 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13249 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13250 ; GFX10-CU-NEXT:    buffer_gl0_inv
13251 ; GFX10-CU-NEXT:    buffer_gl1_inv
13252 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13253 ; GFX10-CU-NEXT:    s_endpgm
13255 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13256 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13257 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13258 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13259 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13260 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13261 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13262 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13263 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13264 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13265 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13266 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13267 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13268 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13269 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13271 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13272 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13273 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13274 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13275 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13276 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13277 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13278 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13279 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13280 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
13281 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13282 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
13284 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13285 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
13286 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13287 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13288 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13289 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13290 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13291 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13292 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13293 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
13294 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13295 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
13297 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13298 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
13299 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13300 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13301 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13302 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13303 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
13304 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13305 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13306 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13307 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
13308 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13309 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
13311 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13312 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
13313 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13314 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13315 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13316 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13317 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
13318 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13319 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13320 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13321 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
13322 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13323 ; GFX940-TGSPLIT-NEXT:    s_endpgm
13325 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13326 ; GFX11-WGP:       ; %bb.0: ; %entry
13327 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13328 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
13329 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13330 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13331 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13332 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13333 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13334 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13335 ; GFX11-WGP-NEXT:    buffer_gl0_inv
13336 ; GFX11-WGP-NEXT:    buffer_gl1_inv
13337 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
13338 ; GFX11-WGP-NEXT:    s_nop 0
13339 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13340 ; GFX11-WGP-NEXT:    s_endpgm
13342 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_acquire_ret_cmpxchg:
13343 ; GFX11-CU:       ; %bb.0: ; %entry
13344 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13345 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
13346 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
13347 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13348 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13349 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13350 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13351 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13352 ; GFX11-CU-NEXT:    buffer_gl0_inv
13353 ; GFX11-CU-NEXT:    buffer_gl1_inv
13354 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
13355 ; GFX11-CU-NEXT:    s_nop 0
13356 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13357 ; GFX11-CU-NEXT:    s_endpgm
13358     ptr addrspace(1) %out, i32 %in, i32 %old) {
13359 entry:
13360   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
13361   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel acquire
13362   %val0 = extractvalue { i32, i1 } %val, 0
13363   store i32 %val0, ptr addrspace(1) %out, align 4
13364   ret void
13367 define amdgpu_kernel void @global_agent_one_as_seq_cst_acquire_ret_cmpxchg(
13368 ; GFX6-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13369 ; GFX6:       ; %bb.0: ; %entry
13370 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13371 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13372 ; GFX6-NEXT:    s_mov_b32 s6, -1
13373 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13374 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13375 ; GFX6-NEXT:    s_mov_b32 s4, s0
13376 ; GFX6-NEXT:    s_mov_b32 s5, s1
13377 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13378 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13379 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13380 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13381 ; GFX6-NEXT:    buffer_wbinvl1
13382 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13383 ; GFX6-NEXT:    s_endpgm
13385 ; GFX7-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13386 ; GFX7:       ; %bb.0: ; %entry
13387 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13388 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13389 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13390 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13391 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13392 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13393 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13394 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13395 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13396 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13397 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13398 ; GFX7-NEXT:    buffer_wbinvl1_vol
13399 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13400 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13401 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13402 ; GFX7-NEXT:    s_endpgm
13404 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13405 ; GFX10-WGP:       ; %bb.0: ; %entry
13406 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13407 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13408 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13409 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13410 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13411 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13412 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13413 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13414 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13415 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13416 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13417 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13418 ; GFX10-WGP-NEXT:    s_endpgm
13420 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13421 ; GFX10-CU:       ; %bb.0: ; %entry
13422 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13423 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13424 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13425 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13426 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13427 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13428 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13429 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13430 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13431 ; GFX10-CU-NEXT:    buffer_gl0_inv
13432 ; GFX10-CU-NEXT:    buffer_gl1_inv
13433 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13434 ; GFX10-CU-NEXT:    s_endpgm
13436 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13437 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13438 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13439 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13440 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13441 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13442 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13443 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13444 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13445 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13446 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13447 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13448 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13449 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13450 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13452 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13453 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13454 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13455 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13456 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13457 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13458 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13459 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13460 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13461 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
13462 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13463 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
13465 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13466 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
13467 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13468 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13469 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13470 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13471 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13472 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13473 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13474 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
13475 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13476 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
13478 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13479 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
13480 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13481 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13482 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13483 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13484 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
13485 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13486 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13487 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13488 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
13489 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13490 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
13492 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13493 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
13494 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13495 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13496 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13497 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13498 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
13499 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13500 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13501 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13502 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
13503 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13504 ; GFX940-TGSPLIT-NEXT:    s_endpgm
13506 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13507 ; GFX11-WGP:       ; %bb.0: ; %entry
13508 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13509 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
13510 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13511 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13512 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13513 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13514 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13515 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13516 ; GFX11-WGP-NEXT:    buffer_gl0_inv
13517 ; GFX11-WGP-NEXT:    buffer_gl1_inv
13518 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
13519 ; GFX11-WGP-NEXT:    s_nop 0
13520 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13521 ; GFX11-WGP-NEXT:    s_endpgm
13523 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_acquire_ret_cmpxchg:
13524 ; GFX11-CU:       ; %bb.0: ; %entry
13525 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13526 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
13527 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
13528 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13529 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13530 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13531 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13532 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13533 ; GFX11-CU-NEXT:    buffer_gl0_inv
13534 ; GFX11-CU-NEXT:    buffer_gl1_inv
13535 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
13536 ; GFX11-CU-NEXT:    s_nop 0
13537 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13538 ; GFX11-CU-NEXT:    s_endpgm
13539     ptr addrspace(1) %out, i32 %in, i32 %old) {
13540 entry:
13541   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
13542   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst acquire
13543   %val0 = extractvalue { i32, i1 } %val, 0
13544   store i32 %val0, ptr addrspace(1) %out, align 4
13545   ret void
13548 define amdgpu_kernel void @global_agent_one_as_monotonic_seq_cst_ret_cmpxchg(
13549 ; GFX6-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13550 ; GFX6:       ; %bb.0: ; %entry
13551 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13552 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13553 ; GFX6-NEXT:    s_mov_b32 s6, -1
13554 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13555 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13556 ; GFX6-NEXT:    s_mov_b32 s4, s0
13557 ; GFX6-NEXT:    s_mov_b32 s5, s1
13558 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13559 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13560 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13561 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13562 ; GFX6-NEXT:    buffer_wbinvl1
13563 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13564 ; GFX6-NEXT:    s_endpgm
13566 ; GFX7-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13567 ; GFX7:       ; %bb.0: ; %entry
13568 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13569 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13570 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13571 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13572 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13573 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13574 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13575 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13576 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13577 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13578 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13579 ; GFX7-NEXT:    buffer_wbinvl1_vol
13580 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13581 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13582 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13583 ; GFX7-NEXT:    s_endpgm
13585 ; GFX10-WGP-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13586 ; GFX10-WGP:       ; %bb.0: ; %entry
13587 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13588 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13589 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13590 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13591 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13592 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13593 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13594 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13595 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13596 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13597 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13598 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13599 ; GFX10-WGP-NEXT:    s_endpgm
13601 ; GFX10-CU-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13602 ; GFX10-CU:       ; %bb.0: ; %entry
13603 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13604 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13605 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13606 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13607 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13608 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13609 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13610 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13611 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13612 ; GFX10-CU-NEXT:    buffer_gl0_inv
13613 ; GFX10-CU-NEXT:    buffer_gl1_inv
13614 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13615 ; GFX10-CU-NEXT:    s_endpgm
13617 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13618 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13619 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13620 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13621 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13622 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13623 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13624 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13625 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13626 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13627 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13628 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13629 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13630 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13631 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13633 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13634 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13635 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13636 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13637 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13638 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13639 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13640 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13641 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13642 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
13643 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13644 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
13646 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13647 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
13648 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13649 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13650 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13651 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13652 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13653 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13654 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13655 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
13656 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13657 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
13659 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13660 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
13661 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13662 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13663 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13664 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13665 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
13666 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13667 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13668 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13669 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
13670 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13671 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
13673 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13674 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
13675 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13676 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13677 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13678 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13679 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
13680 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13681 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13682 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13683 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
13684 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13685 ; GFX940-TGSPLIT-NEXT:    s_endpgm
13687 ; GFX11-WGP-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13688 ; GFX11-WGP:       ; %bb.0: ; %entry
13689 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13690 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
13691 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13692 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13693 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13694 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13695 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13696 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13697 ; GFX11-WGP-NEXT:    buffer_gl0_inv
13698 ; GFX11-WGP-NEXT:    buffer_gl1_inv
13699 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
13700 ; GFX11-WGP-NEXT:    s_nop 0
13701 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13702 ; GFX11-WGP-NEXT:    s_endpgm
13704 ; GFX11-CU-LABEL: global_agent_one_as_monotonic_seq_cst_ret_cmpxchg:
13705 ; GFX11-CU:       ; %bb.0: ; %entry
13706 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13707 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
13708 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
13709 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13710 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13711 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13712 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13713 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13714 ; GFX11-CU-NEXT:    buffer_gl0_inv
13715 ; GFX11-CU-NEXT:    buffer_gl1_inv
13716 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
13717 ; GFX11-CU-NEXT:    s_nop 0
13718 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13719 ; GFX11-CU-NEXT:    s_endpgm
13720     ptr addrspace(1) %out, i32 %in, i32 %old) {
13721 entry:
13722   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
13723   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") monotonic seq_cst
13724   %val0 = extractvalue { i32, i1 } %val, 0
13725   store i32 %val0, ptr addrspace(1) %out, align 4
13726   ret void
13729 define amdgpu_kernel void @global_agent_one_as_acquire_seq_cst_ret_cmpxchg(
13730 ; GFX6-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13731 ; GFX6:       ; %bb.0: ; %entry
13732 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13733 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13734 ; GFX6-NEXT:    s_mov_b32 s6, -1
13735 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13736 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13737 ; GFX6-NEXT:    s_mov_b32 s4, s0
13738 ; GFX6-NEXT:    s_mov_b32 s5, s1
13739 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13740 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13741 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13742 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13743 ; GFX6-NEXT:    buffer_wbinvl1
13744 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13745 ; GFX6-NEXT:    s_endpgm
13747 ; GFX7-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13748 ; GFX7:       ; %bb.0: ; %entry
13749 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13750 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13751 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13752 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13753 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13754 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13755 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13756 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13757 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13758 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13759 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13760 ; GFX7-NEXT:    buffer_wbinvl1_vol
13761 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13762 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13763 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13764 ; GFX7-NEXT:    s_endpgm
13766 ; GFX10-WGP-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13767 ; GFX10-WGP:       ; %bb.0: ; %entry
13768 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13769 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13770 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13771 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13772 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13773 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13774 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13775 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13776 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13777 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13778 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13779 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13780 ; GFX10-WGP-NEXT:    s_endpgm
13782 ; GFX10-CU-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13783 ; GFX10-CU:       ; %bb.0: ; %entry
13784 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13785 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13786 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13787 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13788 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13789 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13790 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13791 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13792 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13793 ; GFX10-CU-NEXT:    buffer_gl0_inv
13794 ; GFX10-CU-NEXT:    buffer_gl1_inv
13795 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13796 ; GFX10-CU-NEXT:    s_endpgm
13798 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13799 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13800 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13801 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13802 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13803 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13804 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13805 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13806 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13807 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13808 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13809 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13810 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13811 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13812 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13814 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13815 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13816 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13817 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13818 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13819 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13820 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13821 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13822 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13823 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
13824 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13825 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
13827 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13828 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
13829 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13830 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13831 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13832 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
13833 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13834 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13835 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13836 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
13837 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
13838 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
13840 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13841 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
13842 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13843 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13844 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13845 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13846 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
13847 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13848 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13849 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13850 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
13851 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13852 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
13854 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13855 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
13856 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13857 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13858 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
13859 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
13860 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
13861 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13862 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
13863 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
13864 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
13865 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
13866 ; GFX940-TGSPLIT-NEXT:    s_endpgm
13868 ; GFX11-WGP-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13869 ; GFX11-WGP:       ; %bb.0: ; %entry
13870 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13871 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
13872 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13873 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13874 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13875 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13876 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13877 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
13878 ; GFX11-WGP-NEXT:    buffer_gl0_inv
13879 ; GFX11-WGP-NEXT:    buffer_gl1_inv
13880 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
13881 ; GFX11-WGP-NEXT:    s_nop 0
13882 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13883 ; GFX11-WGP-NEXT:    s_endpgm
13885 ; GFX11-CU-LABEL: global_agent_one_as_acquire_seq_cst_ret_cmpxchg:
13886 ; GFX11-CU:       ; %bb.0: ; %entry
13887 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
13888 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
13889 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
13890 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
13891 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13892 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13893 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
13894 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
13895 ; GFX11-CU-NEXT:    buffer_gl0_inv
13896 ; GFX11-CU-NEXT:    buffer_gl1_inv
13897 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
13898 ; GFX11-CU-NEXT:    s_nop 0
13899 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
13900 ; GFX11-CU-NEXT:    s_endpgm
13901     ptr addrspace(1) %out, i32 %in, i32 %old) {
13902 entry:
13903   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
13904   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acquire seq_cst
13905   %val0 = extractvalue { i32, i1 } %val, 0
13906   store i32 %val0, ptr addrspace(1) %out, align 4
13907   ret void
13910 define amdgpu_kernel void @global_agent_one_as_release_seq_cst_ret_cmpxchg(
13911 ; GFX6-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13912 ; GFX6:       ; %bb.0: ; %entry
13913 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13914 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
13915 ; GFX6-NEXT:    s_mov_b32 s6, -1
13916 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
13917 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
13918 ; GFX6-NEXT:    s_mov_b32 s4, s0
13919 ; GFX6-NEXT:    s_mov_b32 s5, s1
13920 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
13921 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13922 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13923 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
13924 ; GFX6-NEXT:    buffer_wbinvl1
13925 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13926 ; GFX6-NEXT:    s_endpgm
13928 ; GFX7-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13929 ; GFX7:       ; %bb.0: ; %entry
13930 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13931 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
13932 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
13933 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
13934 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
13935 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
13936 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
13937 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
13938 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13939 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
13940 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
13941 ; GFX7-NEXT:    buffer_wbinvl1_vol
13942 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13943 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
13944 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
13945 ; GFX7-NEXT:    s_endpgm
13947 ; GFX10-WGP-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13948 ; GFX10-WGP:       ; %bb.0: ; %entry
13949 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13950 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
13951 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
13952 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
13953 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
13954 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13955 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
13956 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13957 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
13958 ; GFX10-WGP-NEXT:    buffer_gl0_inv
13959 ; GFX10-WGP-NEXT:    buffer_gl1_inv
13960 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
13961 ; GFX10-WGP-NEXT:    s_endpgm
13963 ; GFX10-CU-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13964 ; GFX10-CU:       ; %bb.0: ; %entry
13965 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13966 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
13967 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
13968 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
13969 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
13970 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13971 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
13972 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
13973 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
13974 ; GFX10-CU-NEXT:    buffer_gl0_inv
13975 ; GFX10-CU-NEXT:    buffer_gl1_inv
13976 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
13977 ; GFX10-CU-NEXT:    s_endpgm
13979 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13980 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
13981 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
13982 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
13983 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
13984 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
13985 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
13986 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
13987 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
13988 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
13989 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13990 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
13991 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
13992 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
13993 ; SKIP-CACHE-INV-NEXT:    s_endpgm
13995 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
13996 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
13997 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
13998 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
13999 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14000 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14001 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14002 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14003 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14004 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
14005 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14006 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
14008 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
14009 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
14010 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14011 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14012 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14013 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14014 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14015 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14016 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14017 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
14018 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14019 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
14021 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
14022 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
14023 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14024 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14025 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14026 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14027 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
14028 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14029 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14030 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14031 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
14032 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14033 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
14035 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
14036 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
14037 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14038 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14039 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14040 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14041 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
14042 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14043 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14044 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14045 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
14046 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14047 ; GFX940-TGSPLIT-NEXT:    s_endpgm
14049 ; GFX11-WGP-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
14050 ; GFX11-WGP:       ; %bb.0: ; %entry
14051 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14052 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
14053 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
14054 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14055 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14056 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
14057 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14058 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14059 ; GFX11-WGP-NEXT:    buffer_gl0_inv
14060 ; GFX11-WGP-NEXT:    buffer_gl1_inv
14061 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
14062 ; GFX11-WGP-NEXT:    s_nop 0
14063 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14064 ; GFX11-WGP-NEXT:    s_endpgm
14066 ; GFX11-CU-LABEL: global_agent_one_as_release_seq_cst_ret_cmpxchg:
14067 ; GFX11-CU:       ; %bb.0: ; %entry
14068 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14069 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
14070 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
14071 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14072 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14073 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
14074 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14075 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14076 ; GFX11-CU-NEXT:    buffer_gl0_inv
14077 ; GFX11-CU-NEXT:    buffer_gl1_inv
14078 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
14079 ; GFX11-CU-NEXT:    s_nop 0
14080 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14081 ; GFX11-CU-NEXT:    s_endpgm
14082     ptr addrspace(1) %out, i32 %in, i32 %old) {
14083 entry:
14084   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
14085   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") release seq_cst
14086   %val0 = extractvalue { i32, i1 } %val, 0
14087   store i32 %val0, ptr addrspace(1) %out, align 4
14088   ret void
14091 define amdgpu_kernel void @global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg(
14092 ; GFX6-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14093 ; GFX6:       ; %bb.0: ; %entry
14094 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14095 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
14096 ; GFX6-NEXT:    s_mov_b32 s6, -1
14097 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
14098 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
14099 ; GFX6-NEXT:    s_mov_b32 s4, s0
14100 ; GFX6-NEXT:    s_mov_b32 s5, s1
14101 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
14102 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
14103 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
14104 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
14105 ; GFX6-NEXT:    buffer_wbinvl1
14106 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
14107 ; GFX6-NEXT:    s_endpgm
14109 ; GFX7-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14110 ; GFX7:       ; %bb.0: ; %entry
14111 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14112 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
14113 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
14114 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
14115 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
14116 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
14117 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
14118 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
14119 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
14120 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
14121 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
14122 ; GFX7-NEXT:    buffer_wbinvl1_vol
14123 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
14124 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
14125 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
14126 ; GFX7-NEXT:    s_endpgm
14128 ; GFX10-WGP-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14129 ; GFX10-WGP:       ; %bb.0: ; %entry
14130 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14131 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
14132 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
14133 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
14134 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
14135 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
14136 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
14137 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14138 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
14139 ; GFX10-WGP-NEXT:    buffer_gl0_inv
14140 ; GFX10-WGP-NEXT:    buffer_gl1_inv
14141 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
14142 ; GFX10-WGP-NEXT:    s_endpgm
14144 ; GFX10-CU-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14145 ; GFX10-CU:       ; %bb.0: ; %entry
14146 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14147 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
14148 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
14149 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
14150 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
14151 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
14152 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
14153 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14154 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
14155 ; GFX10-CU-NEXT:    buffer_gl0_inv
14156 ; GFX10-CU-NEXT:    buffer_gl1_inv
14157 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
14158 ; GFX10-CU-NEXT:    s_endpgm
14160 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14161 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
14162 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14163 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
14164 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
14165 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
14166 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
14167 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
14168 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
14169 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
14170 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
14171 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
14172 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
14173 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
14174 ; SKIP-CACHE-INV-NEXT:    s_endpgm
14176 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14177 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
14178 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14179 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14180 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14181 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14182 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14183 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14184 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14185 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
14186 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14187 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
14189 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14190 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
14191 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14192 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14193 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14194 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14195 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14196 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14197 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14198 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
14199 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14200 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
14202 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14203 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
14204 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14205 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14206 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14207 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14208 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
14209 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14210 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14211 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14212 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
14213 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14214 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
14216 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14217 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
14218 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14219 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14220 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14221 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14222 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
14223 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14224 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14225 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14226 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
14227 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14228 ; GFX940-TGSPLIT-NEXT:    s_endpgm
14230 ; GFX11-WGP-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14231 ; GFX11-WGP:       ; %bb.0: ; %entry
14232 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14233 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
14234 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
14235 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14236 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14237 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
14238 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14239 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14240 ; GFX11-WGP-NEXT:    buffer_gl0_inv
14241 ; GFX11-WGP-NEXT:    buffer_gl1_inv
14242 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
14243 ; GFX11-WGP-NEXT:    s_nop 0
14244 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14245 ; GFX11-WGP-NEXT:    s_endpgm
14247 ; GFX11-CU-LABEL: global_agent_one_as_acq_rel_seq_cst_ret_cmpxchg:
14248 ; GFX11-CU:       ; %bb.0: ; %entry
14249 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14250 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
14251 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
14252 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14253 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14254 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
14255 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14256 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14257 ; GFX11-CU-NEXT:    buffer_gl0_inv
14258 ; GFX11-CU-NEXT:    buffer_gl1_inv
14259 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
14260 ; GFX11-CU-NEXT:    s_nop 0
14261 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14262 ; GFX11-CU-NEXT:    s_endpgm
14263     ptr addrspace(1) %out, i32 %in, i32 %old) {
14264 entry:
14265   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
14266   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") acq_rel seq_cst
14267   %val0 = extractvalue { i32, i1 } %val, 0
14268   store i32 %val0, ptr addrspace(1) %out, align 4
14269   ret void
14272 define amdgpu_kernel void @global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg(
14273 ; GFX6-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14274 ; GFX6:       ; %bb.0: ; %entry
14275 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14276 ; GFX6-NEXT:    s_mov_b32 s7, 0x100f000
14277 ; GFX6-NEXT:    s_mov_b32 s6, -1
14278 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
14279 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
14280 ; GFX6-NEXT:    s_mov_b32 s4, s0
14281 ; GFX6-NEXT:    s_mov_b32 s5, s1
14282 ; GFX6-NEXT:    v_mov_b32_e32 v1, s3
14283 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
14284 ; GFX6-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
14285 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
14286 ; GFX6-NEXT:    buffer_wbinvl1
14287 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
14288 ; GFX6-NEXT:    s_endpgm
14290 ; GFX7-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14291 ; GFX7:       ; %bb.0: ; %entry
14292 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14293 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
14294 ; GFX7-NEXT:    s_add_u32 s4, s0, 16
14295 ; GFX7-NEXT:    s_addc_u32 s5, s1, 0
14296 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
14297 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
14298 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
14299 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
14300 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
14301 ; GFX7-NEXT:    flat_atomic_cmpswap v2, v[0:1], v[2:3] glc
14302 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
14303 ; GFX7-NEXT:    buffer_wbinvl1_vol
14304 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
14305 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
14306 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
14307 ; GFX7-NEXT:    s_endpgm
14309 ; GFX10-WGP-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14310 ; GFX10-WGP:       ; %bb.0: ; %entry
14311 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14312 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, 0
14313 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
14314 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
14315 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
14316 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
14317 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
14318 ; GFX10-WGP-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14319 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
14320 ; GFX10-WGP-NEXT:    buffer_gl0_inv
14321 ; GFX10-WGP-NEXT:    buffer_gl1_inv
14322 ; GFX10-WGP-NEXT:    global_store_dword v2, v0, s[0:1]
14323 ; GFX10-WGP-NEXT:    s_endpgm
14325 ; GFX10-CU-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14326 ; GFX10-CU:       ; %bb.0: ; %entry
14327 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14328 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, 0
14329 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
14330 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
14331 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
14332 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
14333 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
14334 ; GFX10-CU-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14335 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
14336 ; GFX10-CU-NEXT:    buffer_gl0_inv
14337 ; GFX10-CU-NEXT:    buffer_gl1_inv
14338 ; GFX10-CU-NEXT:    global_store_dword v2, v0, s[0:1]
14339 ; GFX10-CU-NEXT:    s_endpgm
14341 ; SKIP-CACHE-INV-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14342 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
14343 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14344 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
14345 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
14346 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
14347 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
14348 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
14349 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
14350 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
14351 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
14352 ; SKIP-CACHE-INV-NEXT:    buffer_atomic_cmpswap v[0:1], off, s[4:7], 0 offset:16 glc
14353 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
14354 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
14355 ; SKIP-CACHE-INV-NEXT:    s_endpgm
14357 ; GFX90A-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14358 ; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
14359 ; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14360 ; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14361 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14362 ; GFX90A-NOTTGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14363 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14364 ; GFX90A-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14365 ; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14366 ; GFX90A-NOTTGSPLIT-NEXT:    buffer_wbinvl1_vol
14367 ; GFX90A-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14368 ; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
14370 ; GFX90A-TGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14371 ; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
14372 ; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
14373 ; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14374 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14375 ; GFX90A-TGSPLIT-NEXT:    v_pk_mov_b32 v[0:1], s[2:3], s[2:3] op_sel:[0,1]
14376 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14377 ; GFX90A-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 glc
14378 ; GFX90A-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14379 ; GFX90A-TGSPLIT-NEXT:    buffer_wbinvl1_vol
14380 ; GFX90A-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1]
14381 ; GFX90A-TGSPLIT-NEXT:    s_endpgm
14383 ; GFX940-NOTTGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14384 ; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
14385 ; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14386 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14387 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14388 ; GFX940-NOTTGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14389 ; GFX940-NOTTGSPLIT-NEXT:    buffer_wbl2 sc1
14390 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14391 ; GFX940-NOTTGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14392 ; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14393 ; GFX940-NOTTGSPLIT-NEXT:    buffer_inv sc1
14394 ; GFX940-NOTTGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14395 ; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
14397 ; GFX940-TGSPLIT-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14398 ; GFX940-TGSPLIT:       ; %bb.0: ; %entry
14399 ; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
14400 ; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, 0
14401 ; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
14402 ; GFX940-TGSPLIT-NEXT:    v_mov_b64_e32 v[0:1], s[2:3]
14403 ; GFX940-TGSPLIT-NEXT:    buffer_wbl2 sc1
14404 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14405 ; GFX940-TGSPLIT-NEXT:    global_atomic_cmpswap v0, v2, v[0:1], s[0:1] offset:16 sc0
14406 ; GFX940-TGSPLIT-NEXT:    s_waitcnt vmcnt(0)
14407 ; GFX940-TGSPLIT-NEXT:    buffer_inv sc1
14408 ; GFX940-TGSPLIT-NEXT:    global_store_dword v2, v0, s[0:1] sc0 sc1
14409 ; GFX940-TGSPLIT-NEXT:    s_endpgm
14411 ; GFX11-WGP-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14412 ; GFX11-WGP:       ; %bb.0: ; %entry
14413 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14414 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v2, 0
14415 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
14416 ; GFX11-WGP-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14417 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14418 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
14419 ; GFX11-WGP-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14420 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
14421 ; GFX11-WGP-NEXT:    buffer_gl0_inv
14422 ; GFX11-WGP-NEXT:    buffer_gl1_inv
14423 ; GFX11-WGP-NEXT:    global_store_b32 v2, v0, s[0:1]
14424 ; GFX11-WGP-NEXT:    s_nop 0
14425 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14426 ; GFX11-WGP-NEXT:    s_endpgm
14428 ; GFX11-CU-LABEL: global_agent_one_as_seq_cst_seq_cst_ret_cmpxchg:
14429 ; GFX11-CU:       ; %bb.0: ; %entry
14430 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
14431 ; GFX11-CU-NEXT:    v_mov_b32_e32 v2, 0
14432 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
14433 ; GFX11-CU-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, s3
14434 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14435 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
14436 ; GFX11-CU-NEXT:    global_atomic_cmpswap_b32 v0, v2, v[0:1], s[0:1] offset:16 glc
14437 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
14438 ; GFX11-CU-NEXT:    buffer_gl0_inv
14439 ; GFX11-CU-NEXT:    buffer_gl1_inv
14440 ; GFX11-CU-NEXT:    global_store_b32 v2, v0, s[0:1]
14441 ; GFX11-CU-NEXT:    s_nop 0
14442 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
14443 ; GFX11-CU-NEXT:    s_endpgm
14444     ptr addrspace(1) %out, i32 %in, i32 %old) {
14445 entry:
14446   %gep = getelementptr i32, ptr addrspace(1) %out, i32 4
14447   %val = cmpxchg volatile ptr addrspace(1) %gep, i32 %old, i32 %in syncscope("agent-one-as") seq_cst seq_cst
14448   %val0 = extractvalue { i32, i1 } %val, 0
14449   store i32 %val0, ptr addrspace(1) %out, align 4
14450   ret void