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
12define amdgpu_kernel void @local_singlethread_unordered_load(
13; GFX6-LABEL: local_singlethread_unordered_load:
14; GFX6:       ; %bb.0: ; %entry
15; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
16; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
17; GFX6-NEXT:    s_mov_b32 m0, -1
18; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
19; GFX6-NEXT:    v_mov_b32_e32 v0, s0
20; GFX6-NEXT:    ds_read_b32 v0, v0
21; GFX6-NEXT:    v_mov_b32_e32 v1, s1
22; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
23; GFX6-NEXT:    ds_write_b32 v1, v0
24; GFX6-NEXT:    s_endpgm
25;
26; GFX7-LABEL: local_singlethread_unordered_load:
27; GFX7:       ; %bb.0: ; %entry
28; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
29; GFX7-NEXT:    s_mov_b32 m0, -1
30; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
31; GFX7-NEXT:    v_mov_b32_e32 v0, s0
32; GFX7-NEXT:    ds_read_b32 v0, v0
33; GFX7-NEXT:    v_mov_b32_e32 v1, s1
34; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
35; GFX7-NEXT:    ds_write_b32 v1, v0
36; GFX7-NEXT:    s_endpgm
37;
38; GFX10-WGP-LABEL: local_singlethread_unordered_load:
39; GFX10-WGP:       ; %bb.0: ; %entry
40; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
41; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
42; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
43; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
44; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
45; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
46; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
47; GFX10-WGP-NEXT:    s_endpgm
48;
49; GFX10-CU-LABEL: local_singlethread_unordered_load:
50; GFX10-CU:       ; %bb.0: ; %entry
51; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
52; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
53; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
54; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
55; GFX10-CU-NEXT:    ds_read_b32 v0, v0
56; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
57; GFX10-CU-NEXT:    ds_write_b32 v1, v0
58; GFX10-CU-NEXT:    s_endpgm
59;
60; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_load:
61; SKIP-CACHE-INV:       ; %bb.0: ; %entry
62; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
63; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
64; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
65; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
66; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
67; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
68; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
69; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
70; SKIP-CACHE-INV-NEXT:    s_endpgm
71;
72; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_load:
73; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
74; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
75; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
76; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
77; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
78; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
79; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
80; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
81; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
82;
83; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_load:
84; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
85; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
86; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
87; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
88; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
89; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
90; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
91; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
92; GFX90A-TGSPLIT-NEXT:    s_endpgm
93;
94; GFX940-NOTTGSPLIT-LABEL: local_singlethread_unordered_load:
95; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
96; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
97; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
98; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
99; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
100; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
101; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
102; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
103; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
104;
105; GFX940-TGSPLIT-LABEL: local_singlethread_unordered_load:
106; GFX940-TGSPLIT:       ; %bb.0: ; %entry
107; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
108; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
109; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
110; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
111; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
112; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
113; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
114; GFX940-TGSPLIT-NEXT:    s_endpgm
115    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
116entry:
117  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") unordered, align 4
118  store i32 %val, i32 addrspace(3)* %out
119  ret void
120}
121
122define amdgpu_kernel void @local_singlethread_monotonic_load(
123; GFX6-LABEL: local_singlethread_monotonic_load:
124; GFX6:       ; %bb.0: ; %entry
125; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
126; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
127; GFX6-NEXT:    s_mov_b32 m0, -1
128; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
129; GFX6-NEXT:    v_mov_b32_e32 v0, s0
130; GFX6-NEXT:    ds_read_b32 v0, v0
131; GFX6-NEXT:    v_mov_b32_e32 v1, s1
132; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
133; GFX6-NEXT:    ds_write_b32 v1, v0
134; GFX6-NEXT:    s_endpgm
135;
136; GFX7-LABEL: local_singlethread_monotonic_load:
137; GFX7:       ; %bb.0: ; %entry
138; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
139; GFX7-NEXT:    s_mov_b32 m0, -1
140; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
141; GFX7-NEXT:    v_mov_b32_e32 v0, s0
142; GFX7-NEXT:    ds_read_b32 v0, v0
143; GFX7-NEXT:    v_mov_b32_e32 v1, s1
144; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
145; GFX7-NEXT:    ds_write_b32 v1, v0
146; GFX7-NEXT:    s_endpgm
147;
148; GFX10-WGP-LABEL: local_singlethread_monotonic_load:
149; GFX10-WGP:       ; %bb.0: ; %entry
150; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
151; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
152; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
153; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
154; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
155; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
156; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
157; GFX10-WGP-NEXT:    s_endpgm
158;
159; GFX10-CU-LABEL: local_singlethread_monotonic_load:
160; GFX10-CU:       ; %bb.0: ; %entry
161; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
162; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
163; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
164; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
165; GFX10-CU-NEXT:    ds_read_b32 v0, v0
166; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
167; GFX10-CU-NEXT:    ds_write_b32 v1, v0
168; GFX10-CU-NEXT:    s_endpgm
169;
170; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_load:
171; SKIP-CACHE-INV:       ; %bb.0: ; %entry
172; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
173; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
174; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
175; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
176; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
177; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
178; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
179; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
180; SKIP-CACHE-INV-NEXT:    s_endpgm
181;
182; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load:
183; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
184; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
185; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
186; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
187; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
188; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
189; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
190; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
191; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
192;
193; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_load:
194; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
195; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
196; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
197; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
198; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
199; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
200; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
201; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
202; GFX90A-TGSPLIT-NEXT:    s_endpgm
203;
204; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_load:
205; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
206; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
207; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
208; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
209; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
210; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
211; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
212; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
213; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
214;
215; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_load:
216; GFX940-TGSPLIT:       ; %bb.0: ; %entry
217; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
218; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
219; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
220; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
221; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
222; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
223; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
224; GFX940-TGSPLIT-NEXT:    s_endpgm
225    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
226entry:
227  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") monotonic, align 4
228  store i32 %val, i32 addrspace(3)* %out
229  ret void
230}
231
232define amdgpu_kernel void @local_singlethread_acquire_load(
233; GFX6-LABEL: local_singlethread_acquire_load:
234; GFX6:       ; %bb.0: ; %entry
235; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
236; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
237; GFX6-NEXT:    s_mov_b32 m0, -1
238; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
239; GFX6-NEXT:    v_mov_b32_e32 v0, s0
240; GFX6-NEXT:    ds_read_b32 v0, v0
241; GFX6-NEXT:    v_mov_b32_e32 v1, s1
242; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
243; GFX6-NEXT:    ds_write_b32 v1, v0
244; GFX6-NEXT:    s_endpgm
245;
246; GFX7-LABEL: local_singlethread_acquire_load:
247; GFX7:       ; %bb.0: ; %entry
248; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
249; GFX7-NEXT:    s_mov_b32 m0, -1
250; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
251; GFX7-NEXT:    v_mov_b32_e32 v0, s0
252; GFX7-NEXT:    ds_read_b32 v0, v0
253; GFX7-NEXT:    v_mov_b32_e32 v1, s1
254; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
255; GFX7-NEXT:    ds_write_b32 v1, v0
256; GFX7-NEXT:    s_endpgm
257;
258; GFX10-WGP-LABEL: local_singlethread_acquire_load:
259; GFX10-WGP:       ; %bb.0: ; %entry
260; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
261; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
262; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
263; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
264; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
265; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
266; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
267; GFX10-WGP-NEXT:    s_endpgm
268;
269; GFX10-CU-LABEL: local_singlethread_acquire_load:
270; GFX10-CU:       ; %bb.0: ; %entry
271; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
272; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
273; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
274; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
275; GFX10-CU-NEXT:    ds_read_b32 v0, v0
276; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
277; GFX10-CU-NEXT:    ds_write_b32 v1, v0
278; GFX10-CU-NEXT:    s_endpgm
279;
280; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_load:
281; SKIP-CACHE-INV:       ; %bb.0: ; %entry
282; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
283; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
284; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
285; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
286; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
287; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
288; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
289; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
290; SKIP-CACHE-INV-NEXT:    s_endpgm
291;
292; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_load:
293; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
294; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
295; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
296; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
297; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
298; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
299; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
300; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
301; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
302;
303; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_load:
304; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
305; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
306; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
307; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
308; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
309; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
310; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
311; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
312; GFX90A-TGSPLIT-NEXT:    s_endpgm
313;
314; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_load:
315; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
316; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
317; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
318; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
319; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
320; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
321; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
322; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
323; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
324;
325; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_load:
326; GFX940-TGSPLIT:       ; %bb.0: ; %entry
327; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
328; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
329; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
330; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
331; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
332; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
333; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
334; GFX940-TGSPLIT-NEXT:    s_endpgm
335    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
336entry:
337  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") acquire, align 4
338  store i32 %val, i32 addrspace(3)* %out
339  ret void
340}
341
342define amdgpu_kernel void @local_singlethread_seq_cst_load(
343; GFX6-LABEL: local_singlethread_seq_cst_load:
344; GFX6:       ; %bb.0: ; %entry
345; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
346; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
347; GFX6-NEXT:    s_mov_b32 m0, -1
348; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
349; GFX6-NEXT:    v_mov_b32_e32 v0, s0
350; GFX6-NEXT:    ds_read_b32 v0, v0
351; GFX6-NEXT:    v_mov_b32_e32 v1, s1
352; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
353; GFX6-NEXT:    ds_write_b32 v1, v0
354; GFX6-NEXT:    s_endpgm
355;
356; GFX7-LABEL: local_singlethread_seq_cst_load:
357; GFX7:       ; %bb.0: ; %entry
358; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
359; GFX7-NEXT:    s_mov_b32 m0, -1
360; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
361; GFX7-NEXT:    v_mov_b32_e32 v0, s0
362; GFX7-NEXT:    ds_read_b32 v0, v0
363; GFX7-NEXT:    v_mov_b32_e32 v1, s1
364; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
365; GFX7-NEXT:    ds_write_b32 v1, v0
366; GFX7-NEXT:    s_endpgm
367;
368; GFX10-WGP-LABEL: local_singlethread_seq_cst_load:
369; GFX10-WGP:       ; %bb.0: ; %entry
370; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
371; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
372; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
373; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
374; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
375; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
376; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
377; GFX10-WGP-NEXT:    s_endpgm
378;
379; GFX10-CU-LABEL: local_singlethread_seq_cst_load:
380; GFX10-CU:       ; %bb.0: ; %entry
381; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
382; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
383; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
384; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
385; GFX10-CU-NEXT:    ds_read_b32 v0, v0
386; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
387; GFX10-CU-NEXT:    ds_write_b32 v1, v0
388; GFX10-CU-NEXT:    s_endpgm
389;
390; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_load:
391; SKIP-CACHE-INV:       ; %bb.0: ; %entry
392; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
393; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
394; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
395; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
396; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
397; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
398; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
399; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
400; SKIP-CACHE-INV-NEXT:    s_endpgm
401;
402; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load:
403; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
404; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
405; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
406; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
407; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
408; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
409; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
410; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
411; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
412;
413; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_load:
414; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
415; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
416; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
417; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
418; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
419; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
420; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
421; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
422; GFX90A-TGSPLIT-NEXT:    s_endpgm
423;
424; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_load:
425; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
426; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
427; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
428; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
429; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
430; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
431; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
432; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
433; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
434;
435; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_load:
436; GFX940-TGSPLIT:       ; %bb.0: ; %entry
437; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
438; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
439; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
440; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
441; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
442; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
443; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
444; GFX940-TGSPLIT-NEXT:    s_endpgm
445    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
446entry:
447  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread") seq_cst, align 4
448  store i32 %val, i32 addrspace(3)* %out
449  ret void
450}
451
452define amdgpu_kernel void @local_singlethread_unordered_store(
453; GFX6-LABEL: local_singlethread_unordered_store:
454; GFX6:       ; %bb.0: ; %entry
455; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
456; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
457; GFX6-NEXT:    s_mov_b32 m0, -1
458; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
459; GFX6-NEXT:    v_mov_b32_e32 v0, s0
460; GFX6-NEXT:    v_mov_b32_e32 v1, s1
461; GFX6-NEXT:    ds_write_b32 v0, v1
462; GFX6-NEXT:    s_endpgm
463;
464; GFX7-LABEL: local_singlethread_unordered_store:
465; GFX7:       ; %bb.0: ; %entry
466; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
467; GFX7-NEXT:    s_mov_b32 m0, -1
468; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
469; GFX7-NEXT:    v_mov_b32_e32 v0, s1
470; GFX7-NEXT:    v_mov_b32_e32 v1, s0
471; GFX7-NEXT:    ds_write_b32 v0, v1
472; GFX7-NEXT:    s_endpgm
473;
474; GFX10-WGP-LABEL: local_singlethread_unordered_store:
475; GFX10-WGP:       ; %bb.0: ; %entry
476; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
477; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
478; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
479; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
480; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
481; GFX10-WGP-NEXT:    s_endpgm
482;
483; GFX10-CU-LABEL: local_singlethread_unordered_store:
484; GFX10-CU:       ; %bb.0: ; %entry
485; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
486; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
487; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
488; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
489; GFX10-CU-NEXT:    ds_write_b32 v0, v1
490; GFX10-CU-NEXT:    s_endpgm
491;
492; SKIP-CACHE-INV-LABEL: local_singlethread_unordered_store:
493; SKIP-CACHE-INV:       ; %bb.0: ; %entry
494; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
495; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
496; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
497; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
498; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
499; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
500; SKIP-CACHE-INV-NEXT:    s_endpgm
501;
502; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_unordered_store:
503; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
504; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
505; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
506; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
507; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
508; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
509; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
510;
511; GFX90A-TGSPLIT-LABEL: local_singlethread_unordered_store:
512; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
513; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
514; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
515; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
516; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
517; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
518; GFX90A-TGSPLIT-NEXT:    s_endpgm
519;
520; GFX940-NOTTGSPLIT-LABEL: local_singlethread_unordered_store:
521; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
522; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
523; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
524; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
525; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
526; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
527; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
528;
529; GFX940-TGSPLIT-LABEL: local_singlethread_unordered_store:
530; GFX940-TGSPLIT:       ; %bb.0: ; %entry
531; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
532; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
533; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
534; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
535; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
536; GFX940-TGSPLIT-NEXT:    s_endpgm
537    i32 %in, i32 addrspace(3)* %out) {
538entry:
539  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") unordered, align 4
540  ret void
541}
542
543define amdgpu_kernel void @local_singlethread_monotonic_store(
544; GFX6-LABEL: local_singlethread_monotonic_store:
545; GFX6:       ; %bb.0: ; %entry
546; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
547; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
548; GFX6-NEXT:    s_mov_b32 m0, -1
549; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
550; GFX6-NEXT:    v_mov_b32_e32 v0, s0
551; GFX6-NEXT:    v_mov_b32_e32 v1, s1
552; GFX6-NEXT:    ds_write_b32 v0, v1
553; GFX6-NEXT:    s_endpgm
554;
555; GFX7-LABEL: local_singlethread_monotonic_store:
556; GFX7:       ; %bb.0: ; %entry
557; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
558; GFX7-NEXT:    s_mov_b32 m0, -1
559; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
560; GFX7-NEXT:    v_mov_b32_e32 v0, s1
561; GFX7-NEXT:    v_mov_b32_e32 v1, s0
562; GFX7-NEXT:    ds_write_b32 v0, v1
563; GFX7-NEXT:    s_endpgm
564;
565; GFX10-WGP-LABEL: local_singlethread_monotonic_store:
566; GFX10-WGP:       ; %bb.0: ; %entry
567; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
568; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
569; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
570; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
571; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
572; GFX10-WGP-NEXT:    s_endpgm
573;
574; GFX10-CU-LABEL: local_singlethread_monotonic_store:
575; GFX10-CU:       ; %bb.0: ; %entry
576; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
577; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
578; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
579; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
580; GFX10-CU-NEXT:    ds_write_b32 v0, v1
581; GFX10-CU-NEXT:    s_endpgm
582;
583; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_store:
584; SKIP-CACHE-INV:       ; %bb.0: ; %entry
585; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
586; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
587; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
588; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
589; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
590; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
591; SKIP-CACHE-INV-NEXT:    s_endpgm
592;
593; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store:
594; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
595; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
596; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
597; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
598; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
599; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
600; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
601;
602; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_store:
603; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
604; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
605; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
606; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
607; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
608; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
609; GFX90A-TGSPLIT-NEXT:    s_endpgm
610;
611; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_store:
612; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
613; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
614; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
615; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
616; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
617; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
618; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
619;
620; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_store:
621; GFX940-TGSPLIT:       ; %bb.0: ; %entry
622; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
623; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
624; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
625; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
626; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
627; GFX940-TGSPLIT-NEXT:    s_endpgm
628    i32 %in, i32 addrspace(3)* %out) {
629entry:
630  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") monotonic, align 4
631  ret void
632}
633
634define amdgpu_kernel void @local_singlethread_release_store(
635; GFX6-LABEL: local_singlethread_release_store:
636; GFX6:       ; %bb.0: ; %entry
637; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
638; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
639; GFX6-NEXT:    s_mov_b32 m0, -1
640; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
641; GFX6-NEXT:    v_mov_b32_e32 v0, s0
642; GFX6-NEXT:    v_mov_b32_e32 v1, s1
643; GFX6-NEXT:    ds_write_b32 v0, v1
644; GFX6-NEXT:    s_endpgm
645;
646; GFX7-LABEL: local_singlethread_release_store:
647; GFX7:       ; %bb.0: ; %entry
648; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
649; GFX7-NEXT:    s_mov_b32 m0, -1
650; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
651; GFX7-NEXT:    v_mov_b32_e32 v0, s1
652; GFX7-NEXT:    v_mov_b32_e32 v1, s0
653; GFX7-NEXT:    ds_write_b32 v0, v1
654; GFX7-NEXT:    s_endpgm
655;
656; GFX10-WGP-LABEL: local_singlethread_release_store:
657; GFX10-WGP:       ; %bb.0: ; %entry
658; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
659; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
660; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
661; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
662; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
663; GFX10-WGP-NEXT:    s_endpgm
664;
665; GFX10-CU-LABEL: local_singlethread_release_store:
666; GFX10-CU:       ; %bb.0: ; %entry
667; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
668; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
669; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
670; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
671; GFX10-CU-NEXT:    ds_write_b32 v0, v1
672; GFX10-CU-NEXT:    s_endpgm
673;
674; SKIP-CACHE-INV-LABEL: local_singlethread_release_store:
675; SKIP-CACHE-INV:       ; %bb.0: ; %entry
676; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
677; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
678; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
679; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
680; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
681; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
682; SKIP-CACHE-INV-NEXT:    s_endpgm
683;
684; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_store:
685; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
686; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
687; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
688; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
689; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
690; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
691; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
692;
693; GFX90A-TGSPLIT-LABEL: local_singlethread_release_store:
694; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
695; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
696; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
697; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
698; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
699; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
700; GFX90A-TGSPLIT-NEXT:    s_endpgm
701;
702; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_store:
703; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
704; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
705; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
706; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
707; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
708; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
709; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
710;
711; GFX940-TGSPLIT-LABEL: local_singlethread_release_store:
712; GFX940-TGSPLIT:       ; %bb.0: ; %entry
713; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
714; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
715; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
716; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
717; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
718; GFX940-TGSPLIT-NEXT:    s_endpgm
719    i32 %in, i32 addrspace(3)* %out) {
720entry:
721  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") release, align 4
722  ret void
723}
724
725define amdgpu_kernel void @local_singlethread_seq_cst_store(
726; GFX6-LABEL: local_singlethread_seq_cst_store:
727; GFX6:       ; %bb.0: ; %entry
728; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
729; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
730; GFX6-NEXT:    s_mov_b32 m0, -1
731; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
732; GFX6-NEXT:    v_mov_b32_e32 v0, s0
733; GFX6-NEXT:    v_mov_b32_e32 v1, s1
734; GFX6-NEXT:    ds_write_b32 v0, v1
735; GFX6-NEXT:    s_endpgm
736;
737; GFX7-LABEL: local_singlethread_seq_cst_store:
738; GFX7:       ; %bb.0: ; %entry
739; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
740; GFX7-NEXT:    s_mov_b32 m0, -1
741; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
742; GFX7-NEXT:    v_mov_b32_e32 v0, s1
743; GFX7-NEXT:    v_mov_b32_e32 v1, s0
744; GFX7-NEXT:    ds_write_b32 v0, v1
745; GFX7-NEXT:    s_endpgm
746;
747; GFX10-WGP-LABEL: local_singlethread_seq_cst_store:
748; GFX10-WGP:       ; %bb.0: ; %entry
749; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
750; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
751; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
752; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
753; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
754; GFX10-WGP-NEXT:    s_endpgm
755;
756; GFX10-CU-LABEL: local_singlethread_seq_cst_store:
757; GFX10-CU:       ; %bb.0: ; %entry
758; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
759; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
760; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
761; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
762; GFX10-CU-NEXT:    ds_write_b32 v0, v1
763; GFX10-CU-NEXT:    s_endpgm
764;
765; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_store:
766; SKIP-CACHE-INV:       ; %bb.0: ; %entry
767; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
768; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
769; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
770; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
771; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
772; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
773; SKIP-CACHE-INV-NEXT:    s_endpgm
774;
775; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store:
776; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
777; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
778; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
779; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
780; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
781; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
782; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
783;
784; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_store:
785; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
786; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
787; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
788; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
789; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
790; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
791; GFX90A-TGSPLIT-NEXT:    s_endpgm
792;
793; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_store:
794; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
795; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
796; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
797; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
798; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
799; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
800; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
801;
802; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_store:
803; GFX940-TGSPLIT:       ; %bb.0: ; %entry
804; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
805; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
806; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
807; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
808; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
809; GFX940-TGSPLIT-NEXT:    s_endpgm
810    i32 %in, i32 addrspace(3)* %out) {
811entry:
812  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread") seq_cst, align 4
813  ret void
814}
815
816define amdgpu_kernel void @local_singlethread_monotonic_atomicrmw(
817; GFX6-LABEL: local_singlethread_monotonic_atomicrmw:
818; GFX6:       ; %bb.0: ; %entry
819; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
820; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
821; GFX6-NEXT:    s_mov_b32 m0, -1
822; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
823; GFX6-NEXT:    v_mov_b32_e32 v0, s0
824; GFX6-NEXT:    v_mov_b32_e32 v1, s1
825; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
826; GFX6-NEXT:    s_endpgm
827;
828; GFX7-LABEL: local_singlethread_monotonic_atomicrmw:
829; GFX7:       ; %bb.0: ; %entry
830; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
831; GFX7-NEXT:    s_mov_b32 m0, -1
832; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
833; GFX7-NEXT:    v_mov_b32_e32 v0, s0
834; GFX7-NEXT:    v_mov_b32_e32 v1, s1
835; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
836; GFX7-NEXT:    s_endpgm
837;
838; GFX10-WGP-LABEL: local_singlethread_monotonic_atomicrmw:
839; GFX10-WGP:       ; %bb.0: ; %entry
840; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
841; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
842; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
843; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
844; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
845; GFX10-WGP-NEXT:    s_endpgm
846;
847; GFX10-CU-LABEL: local_singlethread_monotonic_atomicrmw:
848; GFX10-CU:       ; %bb.0: ; %entry
849; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
850; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
851; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
852; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
853; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
854; GFX10-CU-NEXT:    s_endpgm
855;
856; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_atomicrmw:
857; SKIP-CACHE-INV:       ; %bb.0: ; %entry
858; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
859; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
860; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
861; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
862; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
863; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
864; SKIP-CACHE-INV-NEXT:    s_endpgm
865;
866; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:
867; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
868; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
869; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
870; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
871; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
872; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
873; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
874;
875; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:
876; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
877; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
878; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
879; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
880; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
881; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
882; GFX90A-TGSPLIT-NEXT:    s_endpgm
883;
884; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:
885; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
886; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
887; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
888; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
889; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
890; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
891; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
892;
893; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_atomicrmw:
894; GFX940-TGSPLIT:       ; %bb.0: ; %entry
895; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
896; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
897; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
898; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
899; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
900; GFX940-TGSPLIT-NEXT:    s_endpgm
901    i32 addrspace(3)* %out, i32 %in) {
902entry:
903  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") monotonic
904  ret void
905}
906
907define amdgpu_kernel void @local_singlethread_acquire_atomicrmw(
908; GFX6-LABEL: local_singlethread_acquire_atomicrmw:
909; GFX6:       ; %bb.0: ; %entry
910; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
911; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
912; GFX6-NEXT:    s_mov_b32 m0, -1
913; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
914; GFX6-NEXT:    v_mov_b32_e32 v0, s0
915; GFX6-NEXT:    v_mov_b32_e32 v1, s1
916; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
917; GFX6-NEXT:    s_endpgm
918;
919; GFX7-LABEL: local_singlethread_acquire_atomicrmw:
920; GFX7:       ; %bb.0: ; %entry
921; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
922; GFX7-NEXT:    s_mov_b32 m0, -1
923; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
924; GFX7-NEXT:    v_mov_b32_e32 v0, s0
925; GFX7-NEXT:    v_mov_b32_e32 v1, s1
926; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
927; GFX7-NEXT:    s_endpgm
928;
929; GFX10-WGP-LABEL: local_singlethread_acquire_atomicrmw:
930; GFX10-WGP:       ; %bb.0: ; %entry
931; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
932; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
933; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
934; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
935; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
936; GFX10-WGP-NEXT:    s_endpgm
937;
938; GFX10-CU-LABEL: local_singlethread_acquire_atomicrmw:
939; GFX10-CU:       ; %bb.0: ; %entry
940; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
941; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
942; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
943; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
944; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
945; GFX10-CU-NEXT:    s_endpgm
946;
947; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_atomicrmw:
948; SKIP-CACHE-INV:       ; %bb.0: ; %entry
949; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
950; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
951; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
952; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
953; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
954; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
955; SKIP-CACHE-INV-NEXT:    s_endpgm
956;
957; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:
958; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
959; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
960; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
961; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
962; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
963; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
964; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
965;
966; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:
967; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
968; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
969; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
970; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
971; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
972; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
973; GFX90A-TGSPLIT-NEXT:    s_endpgm
974;
975; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:
976; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
977; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
978; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
979; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
980; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
981; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
982; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
983;
984; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_atomicrmw:
985; GFX940-TGSPLIT:       ; %bb.0: ; %entry
986; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
987; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
988; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
989; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
990; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
991; GFX940-TGSPLIT-NEXT:    s_endpgm
992    i32 addrspace(3)* %out, i32 %in) {
993entry:
994  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acquire
995  ret void
996}
997
998define amdgpu_kernel void @local_singlethread_release_atomicrmw(
999; GFX6-LABEL: local_singlethread_release_atomicrmw:
1000; GFX6:       ; %bb.0: ; %entry
1001; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1002; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1003; GFX6-NEXT:    s_mov_b32 m0, -1
1004; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1005; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1006; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1007; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1008; GFX6-NEXT:    s_endpgm
1009;
1010; GFX7-LABEL: local_singlethread_release_atomicrmw:
1011; GFX7:       ; %bb.0: ; %entry
1012; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1013; GFX7-NEXT:    s_mov_b32 m0, -1
1014; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1015; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1016; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1017; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1018; GFX7-NEXT:    s_endpgm
1019;
1020; GFX10-WGP-LABEL: local_singlethread_release_atomicrmw:
1021; GFX10-WGP:       ; %bb.0: ; %entry
1022; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1023; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1024; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1025; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1026; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1027; GFX10-WGP-NEXT:    s_endpgm
1028;
1029; GFX10-CU-LABEL: local_singlethread_release_atomicrmw:
1030; GFX10-CU:       ; %bb.0: ; %entry
1031; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1032; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1033; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1034; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1035; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1036; GFX10-CU-NEXT:    s_endpgm
1037;
1038; SKIP-CACHE-INV-LABEL: local_singlethread_release_atomicrmw:
1039; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1040; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1041; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1042; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1043; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1044; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1045; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1046; SKIP-CACHE-INV-NEXT:    s_endpgm
1047;
1048; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw:
1049; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1050; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1051; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1052; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1053; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1054; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1055; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1056;
1057; GFX90A-TGSPLIT-LABEL: local_singlethread_release_atomicrmw:
1058; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1059; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1060; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1061; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1062; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1063; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1064; GFX90A-TGSPLIT-NEXT:    s_endpgm
1065;
1066; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_atomicrmw:
1067; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1068; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1069; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1070; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1071; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1072; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1073; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1074;
1075; GFX940-TGSPLIT-LABEL: local_singlethread_release_atomicrmw:
1076; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1077; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1078; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1079; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1080; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1081; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1082; GFX940-TGSPLIT-NEXT:    s_endpgm
1083    i32 addrspace(3)* %out, i32 %in) {
1084entry:
1085  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") release
1086  ret void
1087}
1088
1089define amdgpu_kernel void @local_singlethread_acq_rel_atomicrmw(
1090; GFX6-LABEL: local_singlethread_acq_rel_atomicrmw:
1091; GFX6:       ; %bb.0: ; %entry
1092; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1093; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1094; GFX6-NEXT:    s_mov_b32 m0, -1
1095; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1096; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1097; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1098; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1099; GFX6-NEXT:    s_endpgm
1100;
1101; GFX7-LABEL: local_singlethread_acq_rel_atomicrmw:
1102; GFX7:       ; %bb.0: ; %entry
1103; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1104; GFX7-NEXT:    s_mov_b32 m0, -1
1105; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1106; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1107; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1108; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1109; GFX7-NEXT:    s_endpgm
1110;
1111; GFX10-WGP-LABEL: local_singlethread_acq_rel_atomicrmw:
1112; GFX10-WGP:       ; %bb.0: ; %entry
1113; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1114; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1115; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1116; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1117; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1118; GFX10-WGP-NEXT:    s_endpgm
1119;
1120; GFX10-CU-LABEL: local_singlethread_acq_rel_atomicrmw:
1121; GFX10-CU:       ; %bb.0: ; %entry
1122; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1123; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1124; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1125; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1126; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1127; GFX10-CU-NEXT:    s_endpgm
1128;
1129; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_atomicrmw:
1130; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1131; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1132; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1133; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1134; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1135; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1136; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1137; SKIP-CACHE-INV-NEXT:    s_endpgm
1138;
1139; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:
1140; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1141; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1142; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1143; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1144; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1145; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1146; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1147;
1148; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:
1149; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1150; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1151; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1152; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1153; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1154; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1155; GFX90A-TGSPLIT-NEXT:    s_endpgm
1156;
1157; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:
1158; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1159; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1160; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1161; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1162; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1163; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1164; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1165;
1166; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_atomicrmw:
1167; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1168; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1169; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1170; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1171; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1172; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1173; GFX940-TGSPLIT-NEXT:    s_endpgm
1174    i32 addrspace(3)* %out, i32 %in) {
1175entry:
1176  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acq_rel
1177  ret void
1178}
1179
1180define amdgpu_kernel void @local_singlethread_seq_cst_atomicrmw(
1181; GFX6-LABEL: local_singlethread_seq_cst_atomicrmw:
1182; GFX6:       ; %bb.0: ; %entry
1183; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1184; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1185; GFX6-NEXT:    s_mov_b32 m0, -1
1186; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1187; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1188; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1189; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1190; GFX6-NEXT:    s_endpgm
1191;
1192; GFX7-LABEL: local_singlethread_seq_cst_atomicrmw:
1193; GFX7:       ; %bb.0: ; %entry
1194; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1195; GFX7-NEXT:    s_mov_b32 m0, -1
1196; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1197; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1198; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1199; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1200; GFX7-NEXT:    s_endpgm
1201;
1202; GFX10-WGP-LABEL: local_singlethread_seq_cst_atomicrmw:
1203; GFX10-WGP:       ; %bb.0: ; %entry
1204; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1205; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1206; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1207; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1208; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1209; GFX10-WGP-NEXT:    s_endpgm
1210;
1211; GFX10-CU-LABEL: local_singlethread_seq_cst_atomicrmw:
1212; GFX10-CU:       ; %bb.0: ; %entry
1213; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1214; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1215; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1216; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1217; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1218; GFX10-CU-NEXT:    s_endpgm
1219;
1220; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_atomicrmw:
1221; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1222; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1223; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1224; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1225; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1226; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1227; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1228; SKIP-CACHE-INV-NEXT:    s_endpgm
1229;
1230; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:
1231; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1232; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1233; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1234; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1235; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1236; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1237; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1238;
1239; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:
1240; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1241; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1242; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1243; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1244; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1245; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1246; GFX90A-TGSPLIT-NEXT:    s_endpgm
1247;
1248; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:
1249; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1250; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1251; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1252; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1253; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1254; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1255; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1256;
1257; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_atomicrmw:
1258; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1259; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1260; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1261; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1262; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1263; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
1264; GFX940-TGSPLIT-NEXT:    s_endpgm
1265    i32 addrspace(3)* %out, i32 %in) {
1266entry:
1267  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") seq_cst
1268  ret void
1269}
1270
1271define amdgpu_kernel void @local_singlethread_acquire_ret_atomicrmw(
1272; GFX6-LABEL: local_singlethread_acquire_ret_atomicrmw:
1273; GFX6:       ; %bb.0: ; %entry
1274; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1275; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1276; GFX6-NEXT:    s_mov_b32 m0, -1
1277; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1278; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1279; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1280; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1281; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1282; GFX6-NEXT:    ds_write_b32 v0, v1
1283; GFX6-NEXT:    s_endpgm
1284;
1285; GFX7-LABEL: local_singlethread_acquire_ret_atomicrmw:
1286; GFX7:       ; %bb.0: ; %entry
1287; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1288; GFX7-NEXT:    s_mov_b32 m0, -1
1289; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1290; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1291; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1292; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1293; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1294; GFX7-NEXT:    ds_write_b32 v0, v1
1295; GFX7-NEXT:    s_endpgm
1296;
1297; GFX10-WGP-LABEL: local_singlethread_acquire_ret_atomicrmw:
1298; GFX10-WGP:       ; %bb.0: ; %entry
1299; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1300; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1301; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1302; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1303; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1304; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1305; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
1306; GFX10-WGP-NEXT:    s_endpgm
1307;
1308; GFX10-CU-LABEL: local_singlethread_acquire_ret_atomicrmw:
1309; GFX10-CU:       ; %bb.0: ; %entry
1310; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1311; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1312; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1313; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1314; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1315; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1316; GFX10-CU-NEXT:    ds_write_b32 v0, v1
1317; GFX10-CU-NEXT:    s_endpgm
1318;
1319; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_ret_atomicrmw:
1320; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1321; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1322; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1323; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1324; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1325; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1326; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1327; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1328; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
1329; SKIP-CACHE-INV-NEXT:    s_endpgm
1330;
1331; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:
1332; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1333; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1334; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1335; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1336; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1337; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1338; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1339; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1340; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1341;
1342; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:
1343; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1344; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1345; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1346; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1347; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1348; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1349; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1350; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1351; GFX90A-TGSPLIT-NEXT:    s_endpgm
1352;
1353; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:
1354; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1355; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1356; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1357; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1358; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1359; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1360; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1361; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1362; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1363;
1364; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_ret_atomicrmw:
1365; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1366; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1367; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1368; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1369; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1370; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1371; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1372; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1373; GFX940-TGSPLIT-NEXT:    s_endpgm
1374    i32 addrspace(3)* %out, i32 %in) {
1375entry:
1376  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acquire
1377  store i32 %val, i32 addrspace(3)* %out, align 4
1378  ret void
1379}
1380
1381define amdgpu_kernel void @local_singlethread_acq_rel_ret_atomicrmw(
1382; GFX6-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1383; GFX6:       ; %bb.0: ; %entry
1384; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1385; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1386; GFX6-NEXT:    s_mov_b32 m0, -1
1387; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1388; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1389; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1390; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1391; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1392; GFX6-NEXT:    ds_write_b32 v0, v1
1393; GFX6-NEXT:    s_endpgm
1394;
1395; GFX7-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1396; GFX7:       ; %bb.0: ; %entry
1397; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1398; GFX7-NEXT:    s_mov_b32 m0, -1
1399; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1400; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1401; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1402; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1403; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1404; GFX7-NEXT:    ds_write_b32 v0, v1
1405; GFX7-NEXT:    s_endpgm
1406;
1407; GFX10-WGP-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1408; GFX10-WGP:       ; %bb.0: ; %entry
1409; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1410; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1411; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1412; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1413; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1414; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1415; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
1416; GFX10-WGP-NEXT:    s_endpgm
1417;
1418; GFX10-CU-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1419; GFX10-CU:       ; %bb.0: ; %entry
1420; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1421; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1422; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1423; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1424; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1425; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1426; GFX10-CU-NEXT:    ds_write_b32 v0, v1
1427; GFX10-CU-NEXT:    s_endpgm
1428;
1429; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1430; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1431; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1432; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1433; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1434; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1435; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1436; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1437; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1438; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
1439; SKIP-CACHE-INV-NEXT:    s_endpgm
1440;
1441; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1442; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1443; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1444; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1445; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1446; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1447; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1448; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1449; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1450; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1451;
1452; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1453; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1454; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1455; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1456; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1457; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1458; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1459; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1460; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1461; GFX90A-TGSPLIT-NEXT:    s_endpgm
1462;
1463; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1464; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1465; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1466; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1467; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1468; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1469; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1470; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1471; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1472; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1473;
1474; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_ret_atomicrmw:
1475; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1476; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1477; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1478; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1479; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1480; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1481; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1482; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1483; GFX940-TGSPLIT-NEXT:    s_endpgm
1484    i32 addrspace(3)* %out, i32 %in) {
1485entry:
1486  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") acq_rel
1487  store i32 %val, i32 addrspace(3)* %out, align 4
1488  ret void
1489}
1490
1491define amdgpu_kernel void @local_singlethread_seq_cst_ret_atomicrmw(
1492; GFX6-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1493; GFX6:       ; %bb.0: ; %entry
1494; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
1495; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
1496; GFX6-NEXT:    s_mov_b32 m0, -1
1497; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1498; GFX6-NEXT:    v_mov_b32_e32 v0, s0
1499; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1500; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1501; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1502; GFX6-NEXT:    ds_write_b32 v0, v1
1503; GFX6-NEXT:    s_endpgm
1504;
1505; GFX7-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1506; GFX7:       ; %bb.0: ; %entry
1507; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1508; GFX7-NEXT:    s_mov_b32 m0, -1
1509; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1510; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1511; GFX7-NEXT:    v_mov_b32_e32 v1, s1
1512; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1513; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1514; GFX7-NEXT:    ds_write_b32 v0, v1
1515; GFX7-NEXT:    s_endpgm
1516;
1517; GFX10-WGP-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1518; GFX10-WGP:       ; %bb.0: ; %entry
1519; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1520; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1521; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1522; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
1523; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1524; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1525; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
1526; GFX10-WGP-NEXT:    s_endpgm
1527;
1528; GFX10-CU-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1529; GFX10-CU:       ; %bb.0: ; %entry
1530; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1531; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1532; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1533; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
1534; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1535; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1536; GFX10-CU-NEXT:    ds_write_b32 v0, v1
1537; GFX10-CU-NEXT:    s_endpgm
1538;
1539; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1540; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1541; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1542; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1543; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1544; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1545; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
1546; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1547; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1548; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
1549; SKIP-CACHE-INV-NEXT:    s_endpgm
1550;
1551; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1552; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1553; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1554; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1555; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1556; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1557; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1558; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1559; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1560; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1561;
1562; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1563; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1564; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
1565; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1566; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1567; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1568; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1569; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1570; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1571; GFX90A-TGSPLIT-NEXT:    s_endpgm
1572;
1573; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1574; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1575; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1576; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1577; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1578; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1579; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1580; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1581; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
1582; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1583;
1584; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_ret_atomicrmw:
1585; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1586; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
1587; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1588; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1589; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
1590; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
1591; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1592; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
1593; GFX940-TGSPLIT-NEXT:    s_endpgm
1594    i32 addrspace(3)* %out, i32 %in) {
1595entry:
1596  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread") seq_cst
1597  store i32 %val, i32 addrspace(3)* %out, align 4
1598  ret void
1599}
1600
1601define amdgpu_kernel void @local_singlethread_monotonic_monotonic_cmpxchg(
1602; GFX6-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1603; GFX6:       ; %bb.0: ; %entry
1604; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
1605; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
1606; GFX6-NEXT:    s_mov_b32 m0, -1
1607; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1608; GFX6-NEXT:    v_mov_b32_e32 v0, s2
1609; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1610; GFX6-NEXT:    v_mov_b32_e32 v2, s0
1611; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1612; GFX6-NEXT:    s_endpgm
1613;
1614; GFX7-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1615; GFX7:       ; %bb.0: ; %entry
1616; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1617; GFX7-NEXT:    s_mov_b32 m0, -1
1618; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1619; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1620; GFX7-NEXT:    v_mov_b32_e32 v1, s2
1621; GFX7-NEXT:    v_mov_b32_e32 v2, s1
1622; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1623; GFX7-NEXT:    s_endpgm
1624;
1625; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1626; GFX10-WGP:       ; %bb.0: ; %entry
1627; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1628; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1629; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1630; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1631; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
1632; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1633; GFX10-WGP-NEXT:    s_endpgm
1634;
1635; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1636; GFX10-CU:       ; %bb.0: ; %entry
1637; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1638; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1639; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1640; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1641; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
1642; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1643; GFX10-CU-NEXT:    s_endpgm
1644;
1645; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1646; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1647; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1648; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1649; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1650; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1651; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
1652; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
1653; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1654; SKIP-CACHE-INV-NEXT:    s_endpgm
1655;
1656; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1657; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1658; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1659; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1660; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1661; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1662; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1663; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1664; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1665;
1666; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1667; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1668; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1669; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1670; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1671; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1672; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1673; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1674; GFX90A-TGSPLIT-NEXT:    s_endpgm
1675;
1676; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1677; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1678; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1679; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1680; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1681; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1682; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1683; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1684; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1685;
1686; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_cmpxchg:
1687; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1688; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1689; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1690; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1691; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1692; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1693; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1694; GFX940-TGSPLIT-NEXT:    s_endpgm
1695    i32 addrspace(3)* %out, i32 %in, i32 %old) {
1696entry:
1697  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
1698  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic
1699  ret void
1700}
1701
1702define amdgpu_kernel void @local_singlethread_acquire_monotonic_cmpxchg(
1703; GFX6-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1704; GFX6:       ; %bb.0: ; %entry
1705; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
1706; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
1707; GFX6-NEXT:    s_mov_b32 m0, -1
1708; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1709; GFX6-NEXT:    v_mov_b32_e32 v0, s2
1710; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1711; GFX6-NEXT:    v_mov_b32_e32 v2, s0
1712; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1713; GFX6-NEXT:    s_endpgm
1714;
1715; GFX7-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1716; GFX7:       ; %bb.0: ; %entry
1717; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1718; GFX7-NEXT:    s_mov_b32 m0, -1
1719; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1720; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1721; GFX7-NEXT:    v_mov_b32_e32 v1, s2
1722; GFX7-NEXT:    v_mov_b32_e32 v2, s1
1723; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1724; GFX7-NEXT:    s_endpgm
1725;
1726; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1727; GFX10-WGP:       ; %bb.0: ; %entry
1728; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1729; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1730; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1731; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1732; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
1733; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1734; GFX10-WGP-NEXT:    s_endpgm
1735;
1736; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1737; GFX10-CU:       ; %bb.0: ; %entry
1738; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1739; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1740; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1741; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1742; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
1743; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1744; GFX10-CU-NEXT:    s_endpgm
1745;
1746; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1747; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1748; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1749; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1750; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1751; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1752; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
1753; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
1754; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1755; SKIP-CACHE-INV-NEXT:    s_endpgm
1756;
1757; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1758; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1759; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1760; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1761; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1762; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1763; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1764; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1765; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1766;
1767; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1768; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1769; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1770; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1771; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1772; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1773; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1774; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1775; GFX90A-TGSPLIT-NEXT:    s_endpgm
1776;
1777; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1778; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1779; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1780; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1781; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1782; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1783; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1784; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1785; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1786;
1787; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_cmpxchg:
1788; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1789; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1790; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1791; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1792; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1793; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1794; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1795; GFX940-TGSPLIT-NEXT:    s_endpgm
1796    i32 addrspace(3)* %out, i32 %in, i32 %old) {
1797entry:
1798  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
1799  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic
1800  ret void
1801}
1802
1803define amdgpu_kernel void @local_singlethread_release_monotonic_cmpxchg(
1804; GFX6-LABEL: local_singlethread_release_monotonic_cmpxchg:
1805; GFX6:       ; %bb.0: ; %entry
1806; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
1807; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
1808; GFX6-NEXT:    s_mov_b32 m0, -1
1809; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1810; GFX6-NEXT:    v_mov_b32_e32 v0, s2
1811; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1812; GFX6-NEXT:    v_mov_b32_e32 v2, s0
1813; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1814; GFX6-NEXT:    s_endpgm
1815;
1816; GFX7-LABEL: local_singlethread_release_monotonic_cmpxchg:
1817; GFX7:       ; %bb.0: ; %entry
1818; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1819; GFX7-NEXT:    s_mov_b32 m0, -1
1820; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1821; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1822; GFX7-NEXT:    v_mov_b32_e32 v1, s2
1823; GFX7-NEXT:    v_mov_b32_e32 v2, s1
1824; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1825; GFX7-NEXT:    s_endpgm
1826;
1827; GFX10-WGP-LABEL: local_singlethread_release_monotonic_cmpxchg:
1828; GFX10-WGP:       ; %bb.0: ; %entry
1829; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1830; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1831; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1832; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1833; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
1834; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1835; GFX10-WGP-NEXT:    s_endpgm
1836;
1837; GFX10-CU-LABEL: local_singlethread_release_monotonic_cmpxchg:
1838; GFX10-CU:       ; %bb.0: ; %entry
1839; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1840; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1841; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1842; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1843; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
1844; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1845; GFX10-CU-NEXT:    s_endpgm
1846;
1847; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_cmpxchg:
1848; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1849; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1850; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1851; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1852; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1853; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
1854; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
1855; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1856; SKIP-CACHE-INV-NEXT:    s_endpgm
1857;
1858; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:
1859; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1860; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1861; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1862; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1863; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1864; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1865; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1866; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1867;
1868; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:
1869; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1870; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1871; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1872; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1873; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1874; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1875; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1876; GFX90A-TGSPLIT-NEXT:    s_endpgm
1877;
1878; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:
1879; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1880; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1881; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1882; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1883; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1884; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1885; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1886; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1887;
1888; GFX940-TGSPLIT-LABEL: local_singlethread_release_monotonic_cmpxchg:
1889; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1890; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1891; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1892; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1893; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1894; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1895; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1896; GFX940-TGSPLIT-NEXT:    s_endpgm
1897    i32 addrspace(3)* %out, i32 %in, i32 %old) {
1898entry:
1899  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
1900  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic
1901  ret void
1902}
1903
1904define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_cmpxchg(
1905; GFX6-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1906; GFX6:       ; %bb.0: ; %entry
1907; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
1908; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
1909; GFX6-NEXT:    s_mov_b32 m0, -1
1910; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
1911; GFX6-NEXT:    v_mov_b32_e32 v0, s2
1912; GFX6-NEXT:    v_mov_b32_e32 v1, s1
1913; GFX6-NEXT:    v_mov_b32_e32 v2, s0
1914; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1915; GFX6-NEXT:    s_endpgm
1916;
1917; GFX7-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1918; GFX7:       ; %bb.0: ; %entry
1919; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1920; GFX7-NEXT:    s_mov_b32 m0, -1
1921; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1922; GFX7-NEXT:    v_mov_b32_e32 v0, s0
1923; GFX7-NEXT:    v_mov_b32_e32 v1, s2
1924; GFX7-NEXT:    v_mov_b32_e32 v2, s1
1925; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1926; GFX7-NEXT:    s_endpgm
1927;
1928; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1929; GFX10-WGP:       ; %bb.0: ; %entry
1930; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1931; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
1932; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
1933; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
1934; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
1935; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1936; GFX10-WGP-NEXT:    s_endpgm
1937;
1938; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1939; GFX10-CU:       ; %bb.0: ; %entry
1940; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1941; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
1942; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
1943; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
1944; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
1945; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1946; GFX10-CU-NEXT:    s_endpgm
1947;
1948; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1949; SKIP-CACHE-INV:       ; %bb.0: ; %entry
1950; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1951; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
1952; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
1953; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
1954; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
1955; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
1956; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1957; SKIP-CACHE-INV-NEXT:    s_endpgm
1958;
1959; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1960; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
1961; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1962; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1963; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1964; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1965; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1966; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1967; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
1968;
1969; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1970; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
1971; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
1972; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1973; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1974; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1975; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1976; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1977; GFX90A-TGSPLIT-NEXT:    s_endpgm
1978;
1979; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1980; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
1981; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1982; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1983; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1984; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1985; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1986; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1987; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
1988;
1989; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_cmpxchg:
1990; GFX940-TGSPLIT:       ; %bb.0: ; %entry
1991; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
1992; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
1993; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
1994; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
1995; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
1996; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
1997; GFX940-TGSPLIT-NEXT:    s_endpgm
1998    i32 addrspace(3)* %out, i32 %in, i32 %old) {
1999entry:
2000  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2001  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic
2002  ret void
2003}
2004
2005define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_cmpxchg(
2006; GFX6-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2007; GFX6:       ; %bb.0: ; %entry
2008; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2009; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2010; GFX6-NEXT:    s_mov_b32 m0, -1
2011; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2012; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2013; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2014; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2015; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2016; GFX6-NEXT:    s_endpgm
2017;
2018; GFX7-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2019; GFX7:       ; %bb.0: ; %entry
2020; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2021; GFX7-NEXT:    s_mov_b32 m0, -1
2022; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2023; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2024; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2025; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2026; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2027; GFX7-NEXT:    s_endpgm
2028;
2029; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2030; GFX10-WGP:       ; %bb.0: ; %entry
2031; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2032; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2033; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2034; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2035; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2036; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2037; GFX10-WGP-NEXT:    s_endpgm
2038;
2039; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2040; GFX10-CU:       ; %bb.0: ; %entry
2041; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2042; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2043; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2044; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2045; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2046; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2047; GFX10-CU-NEXT:    s_endpgm
2048;
2049; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2050; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2051; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2052; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2053; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2054; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2055; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2056; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2057; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2058; SKIP-CACHE-INV-NEXT:    s_endpgm
2059;
2060; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2061; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2062; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2063; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2064; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2065; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2066; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2067; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2068; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2069;
2070; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2071; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2072; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2073; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2074; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2075; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2076; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2077; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2078; GFX90A-TGSPLIT-NEXT:    s_endpgm
2079;
2080; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2081; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2082; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2083; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2084; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2085; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2086; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2087; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2088; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2089;
2090; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_cmpxchg:
2091; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2092; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2093; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2094; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2095; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2096; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2097; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2098; GFX940-TGSPLIT-NEXT:    s_endpgm
2099    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2100entry:
2101  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2102  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic
2103  ret void
2104}
2105
2106define amdgpu_kernel void @local_singlethread_monotonic_acquire_cmpxchg(
2107; GFX6-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2108; GFX6:       ; %bb.0: ; %entry
2109; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2110; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2111; GFX6-NEXT:    s_mov_b32 m0, -1
2112; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2113; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2114; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2115; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2116; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2117; GFX6-NEXT:    s_endpgm
2118;
2119; GFX7-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2120; GFX7:       ; %bb.0: ; %entry
2121; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2122; GFX7-NEXT:    s_mov_b32 m0, -1
2123; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2124; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2125; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2126; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2127; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2128; GFX7-NEXT:    s_endpgm
2129;
2130; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2131; GFX10-WGP:       ; %bb.0: ; %entry
2132; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2133; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2134; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2135; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2136; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2137; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2138; GFX10-WGP-NEXT:    s_endpgm
2139;
2140; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2141; GFX10-CU:       ; %bb.0: ; %entry
2142; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2143; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2144; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2145; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2146; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2147; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2148; GFX10-CU-NEXT:    s_endpgm
2149;
2150; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2151; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2152; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2153; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2154; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2155; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2156; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2157; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2158; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2159; SKIP-CACHE-INV-NEXT:    s_endpgm
2160;
2161; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2162; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2163; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2164; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2165; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2166; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2167; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2168; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2169; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2170;
2171; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2172; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2173; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2174; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2175; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2176; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2177; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2178; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2179; GFX90A-TGSPLIT-NEXT:    s_endpgm
2180;
2181; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2182; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2183; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2184; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2185; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2186; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2187; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2188; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2189; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2190;
2191; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_cmpxchg:
2192; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2193; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2194; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2195; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2196; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2197; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2198; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2199; GFX940-TGSPLIT-NEXT:    s_endpgm
2200    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2201entry:
2202  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2203  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire
2204  ret void
2205}
2206
2207define amdgpu_kernel void @local_singlethread_acquire_acquire_cmpxchg(
2208; GFX6-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2209; GFX6:       ; %bb.0: ; %entry
2210; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2211; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2212; GFX6-NEXT:    s_mov_b32 m0, -1
2213; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2214; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2215; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2216; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2217; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2218; GFX6-NEXT:    s_endpgm
2219;
2220; GFX7-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2221; GFX7:       ; %bb.0: ; %entry
2222; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2223; GFX7-NEXT:    s_mov_b32 m0, -1
2224; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2225; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2226; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2227; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2228; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2229; GFX7-NEXT:    s_endpgm
2230;
2231; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2232; GFX10-WGP:       ; %bb.0: ; %entry
2233; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2234; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2235; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2236; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2237; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2238; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2239; GFX10-WGP-NEXT:    s_endpgm
2240;
2241; GFX10-CU-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2242; GFX10-CU:       ; %bb.0: ; %entry
2243; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2244; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2245; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2246; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2247; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2248; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2249; GFX10-CU-NEXT:    s_endpgm
2250;
2251; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2252; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2253; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2254; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2255; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2256; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2257; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2258; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2259; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2260; SKIP-CACHE-INV-NEXT:    s_endpgm
2261;
2262; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2263; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2264; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2265; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2266; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2267; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2268; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2269; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2270; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2271;
2272; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2273; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2274; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2275; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2276; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2277; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2278; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2279; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2280; GFX90A-TGSPLIT-NEXT:    s_endpgm
2281;
2282; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2283; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2284; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2285; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2286; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2287; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2288; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2289; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2290; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2291;
2292; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_acquire_cmpxchg:
2293; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2294; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2295; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2296; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2297; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2298; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2299; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2300; GFX940-TGSPLIT-NEXT:    s_endpgm
2301    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2302entry:
2303  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2304  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire
2305  ret void
2306}
2307
2308define amdgpu_kernel void @local_singlethread_release_acquire_cmpxchg(
2309; GFX6-LABEL: local_singlethread_release_acquire_cmpxchg:
2310; GFX6:       ; %bb.0: ; %entry
2311; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2312; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2313; GFX6-NEXT:    s_mov_b32 m0, -1
2314; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2315; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2316; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2317; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2318; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2319; GFX6-NEXT:    s_endpgm
2320;
2321; GFX7-LABEL: local_singlethread_release_acquire_cmpxchg:
2322; GFX7:       ; %bb.0: ; %entry
2323; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2324; GFX7-NEXT:    s_mov_b32 m0, -1
2325; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2326; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2327; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2328; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2329; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2330; GFX7-NEXT:    s_endpgm
2331;
2332; GFX10-WGP-LABEL: local_singlethread_release_acquire_cmpxchg:
2333; GFX10-WGP:       ; %bb.0: ; %entry
2334; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2335; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2336; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2337; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2338; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2339; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2340; GFX10-WGP-NEXT:    s_endpgm
2341;
2342; GFX10-CU-LABEL: local_singlethread_release_acquire_cmpxchg:
2343; GFX10-CU:       ; %bb.0: ; %entry
2344; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2345; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2346; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2347; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2348; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2349; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2350; GFX10-CU-NEXT:    s_endpgm
2351;
2352; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_cmpxchg:
2353; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2354; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2355; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2356; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2357; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2358; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2359; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2360; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2361; SKIP-CACHE-INV-NEXT:    s_endpgm
2362;
2363; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:
2364; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2365; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2366; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2367; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2368; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2369; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2370; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2371; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2372;
2373; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:
2374; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2375; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2376; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2377; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2378; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2379; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2380; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2381; GFX90A-TGSPLIT-NEXT:    s_endpgm
2382;
2383; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:
2384; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2385; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2386; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2387; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2388; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2389; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2390; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2391; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2392;
2393; GFX940-TGSPLIT-LABEL: local_singlethread_release_acquire_cmpxchg:
2394; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2395; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2396; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2397; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2398; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2399; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2400; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2401; GFX940-TGSPLIT-NEXT:    s_endpgm
2402    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2403entry:
2404  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2405  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release acquire
2406  ret void
2407}
2408
2409define amdgpu_kernel void @local_singlethread_acq_rel_acquire_cmpxchg(
2410; GFX6-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2411; GFX6:       ; %bb.0: ; %entry
2412; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2413; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2414; GFX6-NEXT:    s_mov_b32 m0, -1
2415; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2416; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2417; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2418; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2419; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2420; GFX6-NEXT:    s_endpgm
2421;
2422; GFX7-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2423; GFX7:       ; %bb.0: ; %entry
2424; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2425; GFX7-NEXT:    s_mov_b32 m0, -1
2426; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2427; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2428; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2429; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2430; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2431; GFX7-NEXT:    s_endpgm
2432;
2433; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2434; GFX10-WGP:       ; %bb.0: ; %entry
2435; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2436; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2437; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2438; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2439; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2440; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2441; GFX10-WGP-NEXT:    s_endpgm
2442;
2443; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2444; GFX10-CU:       ; %bb.0: ; %entry
2445; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2446; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2447; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2448; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2449; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2450; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2451; GFX10-CU-NEXT:    s_endpgm
2452;
2453; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2454; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2455; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2456; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2457; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2458; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2459; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2460; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2461; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2462; SKIP-CACHE-INV-NEXT:    s_endpgm
2463;
2464; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2465; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2466; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2467; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2468; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2469; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2470; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2471; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2472; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2473;
2474; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2475; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2476; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2477; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2478; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2479; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2480; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2481; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2482; GFX90A-TGSPLIT-NEXT:    s_endpgm
2483;
2484; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2485; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2486; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2487; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2488; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2489; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2490; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2491; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2492; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2493;
2494; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_cmpxchg:
2495; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2496; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2497; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2498; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2499; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2500; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2501; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2502; GFX940-TGSPLIT-NEXT:    s_endpgm
2503    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2504entry:
2505  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2506  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire
2507  ret void
2508}
2509
2510define amdgpu_kernel void @local_singlethread_seq_cst_acquire_cmpxchg(
2511; GFX6-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2512; GFX6:       ; %bb.0: ; %entry
2513; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2514; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2515; GFX6-NEXT:    s_mov_b32 m0, -1
2516; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2517; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2518; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2519; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2520; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2521; GFX6-NEXT:    s_endpgm
2522;
2523; GFX7-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2524; GFX7:       ; %bb.0: ; %entry
2525; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2526; GFX7-NEXT:    s_mov_b32 m0, -1
2527; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2528; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2529; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2530; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2531; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2532; GFX7-NEXT:    s_endpgm
2533;
2534; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2535; GFX10-WGP:       ; %bb.0: ; %entry
2536; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2537; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2538; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2539; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2540; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2541; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2542; GFX10-WGP-NEXT:    s_endpgm
2543;
2544; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2545; GFX10-CU:       ; %bb.0: ; %entry
2546; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2547; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2548; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2549; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2550; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2551; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2552; GFX10-CU-NEXT:    s_endpgm
2553;
2554; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2555; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2556; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2557; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2558; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2559; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2560; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2561; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2562; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2563; SKIP-CACHE-INV-NEXT:    s_endpgm
2564;
2565; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2566; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2567; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2568; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2569; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2570; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2571; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2572; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2573; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2574;
2575; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2576; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2577; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2578; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2579; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2580; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2581; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2582; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2583; GFX90A-TGSPLIT-NEXT:    s_endpgm
2584;
2585; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2586; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2587; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2588; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2589; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2590; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2591; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2592; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2593; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2594;
2595; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_cmpxchg:
2596; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2597; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2598; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2599; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2600; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2601; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2602; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2603; GFX940-TGSPLIT-NEXT:    s_endpgm
2604    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2605entry:
2606  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2607  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire
2608  ret void
2609}
2610
2611define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_cmpxchg(
2612; GFX6-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2613; GFX6:       ; %bb.0: ; %entry
2614; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2615; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2616; GFX6-NEXT:    s_mov_b32 m0, -1
2617; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2618; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2619; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2620; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2621; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2622; GFX6-NEXT:    s_endpgm
2623;
2624; GFX7-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2625; GFX7:       ; %bb.0: ; %entry
2626; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2627; GFX7-NEXT:    s_mov_b32 m0, -1
2628; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2629; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2630; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2631; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2632; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2633; GFX7-NEXT:    s_endpgm
2634;
2635; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2636; GFX10-WGP:       ; %bb.0: ; %entry
2637; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2638; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2639; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2640; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2641; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2642; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2643; GFX10-WGP-NEXT:    s_endpgm
2644;
2645; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2646; GFX10-CU:       ; %bb.0: ; %entry
2647; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2648; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2649; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2650; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2651; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2652; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2653; GFX10-CU-NEXT:    s_endpgm
2654;
2655; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2656; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2657; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2658; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2659; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2660; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2661; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2662; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2663; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2664; SKIP-CACHE-INV-NEXT:    s_endpgm
2665;
2666; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2667; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2668; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2669; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2670; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2671; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2672; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2673; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2674; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2675;
2676; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2677; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2678; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2679; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2680; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2681; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2682; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2683; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2684; GFX90A-TGSPLIT-NEXT:    s_endpgm
2685;
2686; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2687; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2688; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2689; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2690; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2691; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2692; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2693; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2694; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2695;
2696; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_cmpxchg:
2697; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2698; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2699; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2700; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2701; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2702; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2703; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2704; GFX940-TGSPLIT-NEXT:    s_endpgm
2705    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2706entry:
2707  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2708  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst
2709  ret void
2710}
2711
2712define amdgpu_kernel void @local_singlethread_acquire_seq_cst_cmpxchg(
2713; GFX6-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2714; GFX6:       ; %bb.0: ; %entry
2715; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2716; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2717; GFX6-NEXT:    s_mov_b32 m0, -1
2718; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2719; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2720; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2721; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2722; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2723; GFX6-NEXT:    s_endpgm
2724;
2725; GFX7-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2726; GFX7:       ; %bb.0: ; %entry
2727; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2728; GFX7-NEXT:    s_mov_b32 m0, -1
2729; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2730; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2731; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2732; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2733; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2734; GFX7-NEXT:    s_endpgm
2735;
2736; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2737; GFX10-WGP:       ; %bb.0: ; %entry
2738; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2739; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2740; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2741; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2742; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2743; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2744; GFX10-WGP-NEXT:    s_endpgm
2745;
2746; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2747; GFX10-CU:       ; %bb.0: ; %entry
2748; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2749; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2750; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2751; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2752; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2753; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2754; GFX10-CU-NEXT:    s_endpgm
2755;
2756; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2757; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2758; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2759; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2760; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2761; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2762; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2763; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2764; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2765; SKIP-CACHE-INV-NEXT:    s_endpgm
2766;
2767; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2768; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2769; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2770; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2771; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2772; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2773; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2774; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2775; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2776;
2777; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2778; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2779; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2780; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2781; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2782; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2783; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2784; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2785; GFX90A-TGSPLIT-NEXT:    s_endpgm
2786;
2787; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2788; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2789; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2790; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2791; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2792; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2793; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2794; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2795; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2796;
2797; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_cmpxchg:
2798; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2799; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2800; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2801; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2802; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2803; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2804; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2805; GFX940-TGSPLIT-NEXT:    s_endpgm
2806    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2807entry:
2808  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2809  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst
2810  ret void
2811}
2812
2813define amdgpu_kernel void @local_singlethread_release_seq_cst_cmpxchg(
2814; GFX6-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2815; GFX6:       ; %bb.0: ; %entry
2816; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2817; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2818; GFX6-NEXT:    s_mov_b32 m0, -1
2819; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2820; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2821; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2822; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2823; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2824; GFX6-NEXT:    s_endpgm
2825;
2826; GFX7-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2827; GFX7:       ; %bb.0: ; %entry
2828; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2829; GFX7-NEXT:    s_mov_b32 m0, -1
2830; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2831; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2832; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2833; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2834; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2835; GFX7-NEXT:    s_endpgm
2836;
2837; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2838; GFX10-WGP:       ; %bb.0: ; %entry
2839; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2840; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2841; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2842; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2843; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2844; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2845; GFX10-WGP-NEXT:    s_endpgm
2846;
2847; GFX10-CU-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2848; GFX10-CU:       ; %bb.0: ; %entry
2849; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2850; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2851; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2852; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2853; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2854; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2855; GFX10-CU-NEXT:    s_endpgm
2856;
2857; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2858; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2859; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2860; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2861; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2862; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2863; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2864; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2865; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2866; SKIP-CACHE-INV-NEXT:    s_endpgm
2867;
2868; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2869; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2870; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2871; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2872; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2873; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2874; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2875; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2876; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2877;
2878; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_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:    s_waitcnt lgkmcnt(0)
2882; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2883; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2884; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2885; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2886; GFX90A-TGSPLIT-NEXT:    s_endpgm
2887;
2888; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2889; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2890; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2891; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2892; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2893; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2894; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2895; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2896; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2897;
2898; GFX940-TGSPLIT-LABEL: local_singlethread_release_seq_cst_cmpxchg:
2899; GFX940-TGSPLIT:       ; %bb.0: ; %entry
2900; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2901; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2902; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2903; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2904; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2905; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2906; GFX940-TGSPLIT-NEXT:    s_endpgm
2907    i32 addrspace(3)* %out, i32 %in, i32 %old) {
2908entry:
2909  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
2910  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst
2911  ret void
2912}
2913
2914define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_cmpxchg(
2915; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2916; GFX6:       ; %bb.0: ; %entry
2917; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
2918; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
2919; GFX6-NEXT:    s_mov_b32 m0, -1
2920; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
2921; GFX6-NEXT:    v_mov_b32_e32 v0, s2
2922; GFX6-NEXT:    v_mov_b32_e32 v1, s1
2923; GFX6-NEXT:    v_mov_b32_e32 v2, s0
2924; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2925; GFX6-NEXT:    s_endpgm
2926;
2927; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2928; GFX7:       ; %bb.0: ; %entry
2929; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2930; GFX7-NEXT:    s_mov_b32 m0, -1
2931; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2932; GFX7-NEXT:    v_mov_b32_e32 v0, s0
2933; GFX7-NEXT:    v_mov_b32_e32 v1, s2
2934; GFX7-NEXT:    v_mov_b32_e32 v2, s1
2935; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2936; GFX7-NEXT:    s_endpgm
2937;
2938; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2939; GFX10-WGP:       ; %bb.0: ; %entry
2940; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2941; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
2942; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
2943; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
2944; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
2945; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2946; GFX10-WGP-NEXT:    s_endpgm
2947;
2948; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2949; GFX10-CU:       ; %bb.0: ; %entry
2950; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2951; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
2952; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
2953; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
2954; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
2955; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2956; GFX10-CU-NEXT:    s_endpgm
2957;
2958; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2959; SKIP-CACHE-INV:       ; %bb.0: ; %entry
2960; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2961; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
2962; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
2963; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
2964; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
2965; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
2966; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2967; SKIP-CACHE-INV-NEXT:    s_endpgm
2968;
2969; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2970; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
2971; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2972; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2973; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2974; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2975; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2976; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2977; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
2978;
2979; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2980; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
2981; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
2982; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2983; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2984; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2985; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2986; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2987; GFX90A-TGSPLIT-NEXT:    s_endpgm
2988;
2989; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
2990; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
2991; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
2992; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
2993; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
2994; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
2995; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
2996; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
2997; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
2998;
2999; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_cmpxchg:
3000; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3001; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3002; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3003; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3004; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3005; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3006; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3007; GFX940-TGSPLIT-NEXT:    s_endpgm
3008    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3009entry:
3010  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3011  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst
3012  ret void
3013}
3014
3015define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_cmpxchg(
3016; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3017; GFX6:       ; %bb.0: ; %entry
3018; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3019; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3020; GFX6-NEXT:    s_mov_b32 m0, -1
3021; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3022; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3023; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3024; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3025; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3026; GFX6-NEXT:    s_endpgm
3027;
3028; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3029; GFX7:       ; %bb.0: ; %entry
3030; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3031; GFX7-NEXT:    s_mov_b32 m0, -1
3032; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3033; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3034; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3035; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3036; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3037; GFX7-NEXT:    s_endpgm
3038;
3039; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3040; GFX10-WGP:       ; %bb.0: ; %entry
3041; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3042; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3043; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3044; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3045; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3046; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3047; GFX10-WGP-NEXT:    s_endpgm
3048;
3049; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3050; GFX10-CU:       ; %bb.0: ; %entry
3051; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3052; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3053; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3054; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3055; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3056; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3057; GFX10-CU-NEXT:    s_endpgm
3058;
3059; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3060; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3061; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3062; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3063; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3064; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3065; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3066; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3067; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3068; SKIP-CACHE-INV-NEXT:    s_endpgm
3069;
3070; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3071; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3072; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3073; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3074; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3075; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3076; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3077; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3078; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3079;
3080; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3081; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3082; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3083; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3084; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3085; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3086; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3087; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3088; GFX90A-TGSPLIT-NEXT:    s_endpgm
3089;
3090; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3091; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3092; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3093; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3094; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3095; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3096; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3097; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3098; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3099;
3100; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_cmpxchg:
3101; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3102; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3103; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3104; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3105; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3106; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3107; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
3108; GFX940-TGSPLIT-NEXT:    s_endpgm
3109    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3110entry:
3111  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3112  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst
3113  ret void
3114}
3115
3116define amdgpu_kernel void @local_singlethread_monotonic_monotonic_ret_cmpxchg(
3117; GFX6-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3118; GFX6:       ; %bb.0: ; %entry
3119; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3120; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3121; GFX6-NEXT:    s_mov_b32 m0, -1
3122; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3123; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3124; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3125; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3126; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3127; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3128; GFX6-NEXT:    ds_write_b32 v0, v1
3129; GFX6-NEXT:    s_endpgm
3130;
3131; GFX7-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3132; GFX7:       ; %bb.0: ; %entry
3133; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3134; GFX7-NEXT:    s_mov_b32 m0, -1
3135; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3136; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3137; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3138; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3139; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3140; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3141; GFX7-NEXT:    ds_write_b32 v0, v1
3142; GFX7-NEXT:    s_endpgm
3143;
3144; GFX10-WGP-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3145; GFX10-WGP:       ; %bb.0: ; %entry
3146; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3147; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3148; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3149; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3150; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3151; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3152; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3153; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3154; GFX10-WGP-NEXT:    s_endpgm
3155;
3156; GFX10-CU-LABEL: local_singlethread_monotonic_monotonic_ret_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:    s_waitcnt lgkmcnt(0)
3160; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3161; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3162; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3163; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3164; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3165; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3166; GFX10-CU-NEXT:    s_endpgm
3167;
3168; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3169; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3170; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3171; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3172; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3173; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3174; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3175; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3176; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3177; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3178; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3179; SKIP-CACHE-INV-NEXT:    s_endpgm
3180;
3181; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3182; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3183; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3184; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3185; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3186; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3187; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3188; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3189; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3190; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3191; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3192;
3193; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3194; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3195; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3196; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3197; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3198; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3199; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3200; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3201; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3202; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3203; GFX90A-TGSPLIT-NEXT:    s_endpgm
3204;
3205; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_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:    s_waitcnt lgkmcnt(0)
3209; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3210; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3211; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3212; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3213; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3214; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3215; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3216;
3217; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_monotonic_ret_cmpxchg:
3218; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3219; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3220; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3221; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3222; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3223; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3224; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3225; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3226; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3227; GFX940-TGSPLIT-NEXT:    s_endpgm
3228    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3229entry:
3230  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3231  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic monotonic
3232  %val0 = extractvalue { i32, i1 } %val, 0
3233  store i32 %val0, i32 addrspace(3)* %out, align 4
3234  ret void
3235}
3236
3237define amdgpu_kernel void @local_singlethread_acquire_monotonic_ret_cmpxchg(
3238; GFX6-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3239; GFX6:       ; %bb.0: ; %entry
3240; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3241; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3242; GFX6-NEXT:    s_mov_b32 m0, -1
3243; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3244; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3245; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3246; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3247; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3248; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3249; GFX6-NEXT:    ds_write_b32 v0, v1
3250; GFX6-NEXT:    s_endpgm
3251;
3252; GFX7-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3253; GFX7:       ; %bb.0: ; %entry
3254; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3255; GFX7-NEXT:    s_mov_b32 m0, -1
3256; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3257; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3258; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3259; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3260; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3261; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3262; GFX7-NEXT:    ds_write_b32 v0, v1
3263; GFX7-NEXT:    s_endpgm
3264;
3265; GFX10-WGP-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3266; GFX10-WGP:       ; %bb.0: ; %entry
3267; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3268; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3269; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3270; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3271; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3272; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3273; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3274; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3275; GFX10-WGP-NEXT:    s_endpgm
3276;
3277; GFX10-CU-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3278; GFX10-CU:       ; %bb.0: ; %entry
3279; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3280; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3281; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3282; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3283; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3284; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3285; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3286; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3287; GFX10-CU-NEXT:    s_endpgm
3288;
3289; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3290; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3291; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3292; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3293; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3294; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3295; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3296; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3297; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3298; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3299; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3300; SKIP-CACHE-INV-NEXT:    s_endpgm
3301;
3302; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3303; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3304; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3305; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3306; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3307; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3308; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3309; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3310; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3311; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3312; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3313;
3314; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3315; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3316; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3317; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3318; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3319; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3320; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3321; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3322; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3323; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3324; GFX90A-TGSPLIT-NEXT:    s_endpgm
3325;
3326; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3327; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3328; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3329; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3330; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3331; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3332; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3333; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3334; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3335; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3336; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3337;
3338; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_monotonic_ret_cmpxchg:
3339; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3340; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3341; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3342; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3343; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3344; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3345; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3346; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3347; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3348; GFX940-TGSPLIT-NEXT:    s_endpgm
3349    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3350entry:
3351  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3352  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire monotonic
3353  %val0 = extractvalue { i32, i1 } %val, 0
3354  store i32 %val0, i32 addrspace(3)* %out, align 4
3355  ret void
3356}
3357
3358define amdgpu_kernel void @local_singlethread_release_monotonic_ret_cmpxchg(
3359; GFX6-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3360; GFX6:       ; %bb.0: ; %entry
3361; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3362; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3363; GFX6-NEXT:    s_mov_b32 m0, -1
3364; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3365; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3366; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3367; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3368; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3369; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3370; GFX6-NEXT:    ds_write_b32 v0, v1
3371; GFX6-NEXT:    s_endpgm
3372;
3373; GFX7-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3374; GFX7:       ; %bb.0: ; %entry
3375; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3376; GFX7-NEXT:    s_mov_b32 m0, -1
3377; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3378; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3379; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3380; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3381; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3382; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3383; GFX7-NEXT:    ds_write_b32 v0, v1
3384; GFX7-NEXT:    s_endpgm
3385;
3386; GFX10-WGP-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3387; GFX10-WGP:       ; %bb.0: ; %entry
3388; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3389; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3390; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3391; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3392; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3393; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3394; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3395; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3396; GFX10-WGP-NEXT:    s_endpgm
3397;
3398; GFX10-CU-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3399; GFX10-CU:       ; %bb.0: ; %entry
3400; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3401; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3402; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3403; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3404; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3405; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3406; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3407; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3408; GFX10-CU-NEXT:    s_endpgm
3409;
3410; SKIP-CACHE-INV-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3411; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3412; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3413; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3414; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3415; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3416; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3417; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3418; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3419; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3420; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3421; SKIP-CACHE-INV-NEXT:    s_endpgm
3422;
3423; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3424; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3425; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3426; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3427; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3428; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3429; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3430; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3431; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3432; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3433; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3434;
3435; GFX90A-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3436; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3437; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3438; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3439; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3440; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3441; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3442; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3443; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3444; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3445; GFX90A-TGSPLIT-NEXT:    s_endpgm
3446;
3447; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3448; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3449; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3450; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3451; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3452; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3453; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3454; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3455; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3456; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3457; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3458;
3459; GFX940-TGSPLIT-LABEL: local_singlethread_release_monotonic_ret_cmpxchg:
3460; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3461; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3462; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3463; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3464; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3465; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3466; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3467; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3468; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3469; GFX940-TGSPLIT-NEXT:    s_endpgm
3470    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3471entry:
3472  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3473  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release monotonic
3474  %val0 = extractvalue { i32, i1 } %val, 0
3475  store i32 %val0, i32 addrspace(3)* %out, align 4
3476  ret void
3477}
3478
3479define amdgpu_kernel void @local_singlethread_acq_rel_monotonic_ret_cmpxchg(
3480; GFX6-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3481; GFX6:       ; %bb.0: ; %entry
3482; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3483; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3484; GFX6-NEXT:    s_mov_b32 m0, -1
3485; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3486; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3487; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3488; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3489; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3490; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3491; GFX6-NEXT:    ds_write_b32 v0, v1
3492; GFX6-NEXT:    s_endpgm
3493;
3494; GFX7-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3495; GFX7:       ; %bb.0: ; %entry
3496; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3497; GFX7-NEXT:    s_mov_b32 m0, -1
3498; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3499; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3500; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3501; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3502; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3503; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3504; GFX7-NEXT:    ds_write_b32 v0, v1
3505; GFX7-NEXT:    s_endpgm
3506;
3507; GFX10-WGP-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3508; GFX10-WGP:       ; %bb.0: ; %entry
3509; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3510; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3511; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3512; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3513; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3514; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3515; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3516; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3517; GFX10-WGP-NEXT:    s_endpgm
3518;
3519; GFX10-CU-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3520; GFX10-CU:       ; %bb.0: ; %entry
3521; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3522; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3523; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3524; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3525; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3526; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3527; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3528; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3529; GFX10-CU-NEXT:    s_endpgm
3530;
3531; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3532; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3533; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3534; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3535; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3536; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3537; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3538; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3539; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3540; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3541; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3542; SKIP-CACHE-INV-NEXT:    s_endpgm
3543;
3544; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3545; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3546; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3547; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3548; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3549; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3550; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3551; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3552; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3553; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3554; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3555;
3556; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3557; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3558; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3559; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3560; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3561; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3562; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3563; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3564; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3565; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3566; GFX90A-TGSPLIT-NEXT:    s_endpgm
3567;
3568; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3569; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3570; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3571; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3572; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3573; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3574; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3575; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3576; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3577; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3578; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3579;
3580; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_monotonic_ret_cmpxchg:
3581; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3582; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3583; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3584; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3585; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3586; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3587; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3588; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3589; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3590; GFX940-TGSPLIT-NEXT:    s_endpgm
3591    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3592entry:
3593  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3594  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel monotonic
3595  %val0 = extractvalue { i32, i1 } %val, 0
3596  store i32 %val0, i32 addrspace(3)* %out, align 4
3597  ret void
3598}
3599
3600define amdgpu_kernel void @local_singlethread_seq_cst_monotonic_ret_cmpxchg(
3601; GFX6-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3602; GFX6:       ; %bb.0: ; %entry
3603; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3604; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3605; GFX6-NEXT:    s_mov_b32 m0, -1
3606; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3607; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3608; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3609; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3610; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3611; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3612; GFX6-NEXT:    ds_write_b32 v0, v1
3613; GFX6-NEXT:    s_endpgm
3614;
3615; GFX7-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3616; GFX7:       ; %bb.0: ; %entry
3617; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3618; GFX7-NEXT:    s_mov_b32 m0, -1
3619; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3620; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3621; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3622; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3623; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3624; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3625; GFX7-NEXT:    ds_write_b32 v0, v1
3626; GFX7-NEXT:    s_endpgm
3627;
3628; GFX10-WGP-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3629; GFX10-WGP:       ; %bb.0: ; %entry
3630; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3631; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3632; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3633; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3634; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3635; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3636; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3637; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3638; GFX10-WGP-NEXT:    s_endpgm
3639;
3640; GFX10-CU-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3641; GFX10-CU:       ; %bb.0: ; %entry
3642; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3643; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3644; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3645; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3646; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3647; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3648; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3649; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3650; GFX10-CU-NEXT:    s_endpgm
3651;
3652; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3653; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3654; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3655; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3656; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3657; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3658; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3659; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3660; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3661; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3662; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3663; SKIP-CACHE-INV-NEXT:    s_endpgm
3664;
3665; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3666; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3667; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3668; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3669; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3670; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3671; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3672; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3673; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3674; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3675; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3676;
3677; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3678; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3679; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3680; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3681; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3682; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3683; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3684; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3685; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3686; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3687; GFX90A-TGSPLIT-NEXT:    s_endpgm
3688;
3689; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3690; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3691; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3692; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3693; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3694; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3695; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3696; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3697; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3698; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3699; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3700;
3701; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_monotonic_ret_cmpxchg:
3702; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3703; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3704; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3705; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3706; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3707; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3708; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3709; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3710; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3711; GFX940-TGSPLIT-NEXT:    s_endpgm
3712    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3713entry:
3714  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3715  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst monotonic
3716  %val0 = extractvalue { i32, i1 } %val, 0
3717  store i32 %val0, i32 addrspace(3)* %out, align 4
3718  ret void
3719}
3720
3721define amdgpu_kernel void @local_singlethread_monotonic_acquire_ret_cmpxchg(
3722; GFX6-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3723; GFX6:       ; %bb.0: ; %entry
3724; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3725; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3726; GFX6-NEXT:    s_mov_b32 m0, -1
3727; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3728; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3729; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3730; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3731; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3732; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3733; GFX6-NEXT:    ds_write_b32 v0, v1
3734; GFX6-NEXT:    s_endpgm
3735;
3736; GFX7-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3737; GFX7:       ; %bb.0: ; %entry
3738; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3739; GFX7-NEXT:    s_mov_b32 m0, -1
3740; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3741; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3742; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3743; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3744; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3745; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3746; GFX7-NEXT:    ds_write_b32 v0, v1
3747; GFX7-NEXT:    s_endpgm
3748;
3749; GFX10-WGP-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3750; GFX10-WGP:       ; %bb.0: ; %entry
3751; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3752; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3753; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3754; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3755; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3756; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3757; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3758; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3759; GFX10-WGP-NEXT:    s_endpgm
3760;
3761; GFX10-CU-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3762; GFX10-CU:       ; %bb.0: ; %entry
3763; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3764; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3765; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3766; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3767; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3768; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3769; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3770; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3771; GFX10-CU-NEXT:    s_endpgm
3772;
3773; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3774; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3775; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3776; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3777; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3778; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3779; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3780; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3781; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3782; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3783; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3784; SKIP-CACHE-INV-NEXT:    s_endpgm
3785;
3786; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3787; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3788; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3789; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3790; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3791; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3792; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3793; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3794; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3795; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3796; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3797;
3798; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3799; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3800; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3801; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3802; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3803; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3804; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3805; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3806; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3807; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3808; GFX90A-TGSPLIT-NEXT:    s_endpgm
3809;
3810; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3811; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3812; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3813; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3814; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3815; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3816; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3817; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3818; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3819; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3820; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3821;
3822; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_acquire_ret_cmpxchg:
3823; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3824; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3825; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3826; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3827; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3828; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3829; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3830; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3831; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3832; GFX940-TGSPLIT-NEXT:    s_endpgm
3833    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3834entry:
3835  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3836  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic acquire
3837  %val0 = extractvalue { i32, i1 } %val, 0
3838  store i32 %val0, i32 addrspace(3)* %out, align 4
3839  ret void
3840}
3841
3842define amdgpu_kernel void @local_singlethread_acquire_acquire_ret_cmpxchg(
3843; GFX6-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3844; GFX6:       ; %bb.0: ; %entry
3845; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3846; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3847; GFX6-NEXT:    s_mov_b32 m0, -1
3848; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3849; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3850; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3851; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3852; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3853; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3854; GFX6-NEXT:    ds_write_b32 v0, v1
3855; GFX6-NEXT:    s_endpgm
3856;
3857; GFX7-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3858; GFX7:       ; %bb.0: ; %entry
3859; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3860; GFX7-NEXT:    s_mov_b32 m0, -1
3861; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3862; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3863; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3864; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3865; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3866; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3867; GFX7-NEXT:    ds_write_b32 v0, v1
3868; GFX7-NEXT:    s_endpgm
3869;
3870; GFX10-WGP-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3871; GFX10-WGP:       ; %bb.0: ; %entry
3872; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3873; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3874; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3875; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3876; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3877; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3878; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3879; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
3880; GFX10-WGP-NEXT:    s_endpgm
3881;
3882; GFX10-CU-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3883; GFX10-CU:       ; %bb.0: ; %entry
3884; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3885; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3886; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
3887; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
3888; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
3889; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3890; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
3891; GFX10-CU-NEXT:    ds_write_b32 v0, v1
3892; GFX10-CU-NEXT:    s_endpgm
3893;
3894; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3895; SKIP-CACHE-INV:       ; %bb.0: ; %entry
3896; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3897; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
3898; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3899; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
3900; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
3901; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
3902; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3903; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
3904; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
3905; SKIP-CACHE-INV-NEXT:    s_endpgm
3906;
3907; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3908; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
3909; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3910; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3911; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3912; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3913; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3914; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3915; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3916; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3917; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
3918;
3919; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3920; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
3921; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3922; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3923; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3924; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3925; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3926; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3927; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3928; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3929; GFX90A-TGSPLIT-NEXT:    s_endpgm
3930;
3931; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3932; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
3933; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3934; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3935; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3936; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3937; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3938; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3939; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3940; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
3941; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
3942;
3943; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_acquire_ret_cmpxchg:
3944; GFX940-TGSPLIT:       ; %bb.0: ; %entry
3945; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
3946; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3947; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
3948; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
3949; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
3950; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3951; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
3952; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
3953; GFX940-TGSPLIT-NEXT:    s_endpgm
3954    i32 addrspace(3)* %out, i32 %in, i32 %old) {
3955entry:
3956  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
3957  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire acquire
3958  %val0 = extractvalue { i32, i1 } %val, 0
3959  store i32 %val0, i32 addrspace(3)* %out, align 4
3960  ret void
3961}
3962
3963define amdgpu_kernel void @local_singlethread_release_acquire_ret_cmpxchg(
3964; GFX6-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
3965; GFX6:       ; %bb.0: ; %entry
3966; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
3967; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
3968; GFX6-NEXT:    s_mov_b32 m0, -1
3969; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3970; GFX6-NEXT:    v_mov_b32_e32 v0, s2
3971; GFX6-NEXT:    v_mov_b32_e32 v1, s1
3972; GFX6-NEXT:    v_mov_b32_e32 v2, s0
3973; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3974; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
3975; GFX6-NEXT:    ds_write_b32 v0, v1
3976; GFX6-NEXT:    s_endpgm
3977;
3978; GFX7-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
3979; GFX7:       ; %bb.0: ; %entry
3980; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3981; GFX7-NEXT:    s_mov_b32 m0, -1
3982; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3983; GFX7-NEXT:    v_mov_b32_e32 v0, s0
3984; GFX7-NEXT:    v_mov_b32_e32 v1, s2
3985; GFX7-NEXT:    v_mov_b32_e32 v2, s1
3986; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3987; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
3988; GFX7-NEXT:    ds_write_b32 v0, v1
3989; GFX7-NEXT:    s_endpgm
3990;
3991; GFX10-WGP-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
3992; GFX10-WGP:       ; %bb.0: ; %entry
3993; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
3994; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
3995; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
3996; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
3997; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
3998; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
3999; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4000; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4001; GFX10-WGP-NEXT:    s_endpgm
4002;
4003; GFX10-CU-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4004; GFX10-CU:       ; %bb.0: ; %entry
4005; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4006; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4007; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4008; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4009; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4010; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4011; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4012; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4013; GFX10-CU-NEXT:    s_endpgm
4014;
4015; SKIP-CACHE-INV-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4016; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4017; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4018; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4019; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4020; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4021; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4022; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4023; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4024; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4025; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4026; SKIP-CACHE-INV-NEXT:    s_endpgm
4027;
4028; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4029; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4030; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4031; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4032; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4033; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4034; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4035; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4036; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4037; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4038; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4039;
4040; GFX90A-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4041; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4042; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4043; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4044; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4045; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4046; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4047; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4048; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4049; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4050; GFX90A-TGSPLIT-NEXT:    s_endpgm
4051;
4052; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4053; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4054; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4055; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4056; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4057; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4058; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4059; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4060; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4061; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4062; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4063;
4064; GFX940-TGSPLIT-LABEL: local_singlethread_release_acquire_ret_cmpxchg:
4065; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4066; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4067; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4068; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4069; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4070; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4071; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4072; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4073; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4074; GFX940-TGSPLIT-NEXT:    s_endpgm
4075    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4076entry:
4077  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4078  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release acquire
4079  %val0 = extractvalue { i32, i1 } %val, 0
4080  store i32 %val0, i32 addrspace(3)* %out, align 4
4081  ret void
4082}
4083
4084define amdgpu_kernel void @local_singlethread_acq_rel_acquire_ret_cmpxchg(
4085; GFX6-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4086; GFX6:       ; %bb.0: ; %entry
4087; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4088; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4089; GFX6-NEXT:    s_mov_b32 m0, -1
4090; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4091; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4092; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4093; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4094; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4095; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4096; GFX6-NEXT:    ds_write_b32 v0, v1
4097; GFX6-NEXT:    s_endpgm
4098;
4099; GFX7-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4100; GFX7:       ; %bb.0: ; %entry
4101; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4102; GFX7-NEXT:    s_mov_b32 m0, -1
4103; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4104; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4105; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4106; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4107; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4108; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4109; GFX7-NEXT:    ds_write_b32 v0, v1
4110; GFX7-NEXT:    s_endpgm
4111;
4112; GFX10-WGP-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4113; GFX10-WGP:       ; %bb.0: ; %entry
4114; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4115; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4116; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4117; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4118; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4119; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4120; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4121; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4122; GFX10-WGP-NEXT:    s_endpgm
4123;
4124; GFX10-CU-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4125; GFX10-CU:       ; %bb.0: ; %entry
4126; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4127; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4128; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4129; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4130; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4131; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4132; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4133; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4134; GFX10-CU-NEXT:    s_endpgm
4135;
4136; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4137; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4138; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4139; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4140; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4141; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4142; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4143; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4144; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4145; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4146; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4147; SKIP-CACHE-INV-NEXT:    s_endpgm
4148;
4149; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4150; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4151; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4152; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4153; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4154; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4155; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4156; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4157; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4158; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4159; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4160;
4161; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4162; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4163; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4164; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4165; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4166; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4167; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4168; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4169; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4170; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4171; GFX90A-TGSPLIT-NEXT:    s_endpgm
4172;
4173; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4174; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4175; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4176; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4177; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4178; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4179; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4180; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4181; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4182; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4183; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4184;
4185; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_acquire_ret_cmpxchg:
4186; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4187; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4188; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4189; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4190; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4191; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4192; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4193; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4194; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4195; GFX940-TGSPLIT-NEXT:    s_endpgm
4196    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4197entry:
4198  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4199  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel acquire
4200  %val0 = extractvalue { i32, i1 } %val, 0
4201  store i32 %val0, i32 addrspace(3)* %out, align 4
4202  ret void
4203}
4204
4205define amdgpu_kernel void @local_singlethread_seq_cst_acquire_ret_cmpxchg(
4206; GFX6-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4207; GFX6:       ; %bb.0: ; %entry
4208; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4209; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4210; GFX6-NEXT:    s_mov_b32 m0, -1
4211; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4212; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4213; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4214; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4215; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4216; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4217; GFX6-NEXT:    ds_write_b32 v0, v1
4218; GFX6-NEXT:    s_endpgm
4219;
4220; GFX7-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4221; GFX7:       ; %bb.0: ; %entry
4222; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4223; GFX7-NEXT:    s_mov_b32 m0, -1
4224; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4225; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4226; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4227; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4228; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4229; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4230; GFX7-NEXT:    ds_write_b32 v0, v1
4231; GFX7-NEXT:    s_endpgm
4232;
4233; GFX10-WGP-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4234; GFX10-WGP:       ; %bb.0: ; %entry
4235; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4236; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4237; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4238; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4239; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4240; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4241; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4242; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4243; GFX10-WGP-NEXT:    s_endpgm
4244;
4245; GFX10-CU-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4246; GFX10-CU:       ; %bb.0: ; %entry
4247; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4248; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4249; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4250; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4251; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4252; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4253; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4254; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4255; GFX10-CU-NEXT:    s_endpgm
4256;
4257; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4258; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4259; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4260; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4261; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4262; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4263; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4264; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4265; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4266; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4267; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4268; SKIP-CACHE-INV-NEXT:    s_endpgm
4269;
4270; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4271; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4272; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4273; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4274; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4275; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4276; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4277; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4278; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4279; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4280; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4281;
4282; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4283; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4284; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4285; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4286; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4287; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4288; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4289; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4290; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4291; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4292; GFX90A-TGSPLIT-NEXT:    s_endpgm
4293;
4294; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4295; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4296; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4297; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4298; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4299; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4300; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4301; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4302; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4303; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4304; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4305;
4306; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_acquire_ret_cmpxchg:
4307; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4308; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4309; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4310; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4311; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4312; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4313; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4314; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4315; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4316; GFX940-TGSPLIT-NEXT:    s_endpgm
4317    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4318entry:
4319  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4320  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst acquire
4321  %val0 = extractvalue { i32, i1 } %val, 0
4322  store i32 %val0, i32 addrspace(3)* %out, align 4
4323  ret void
4324}
4325
4326define amdgpu_kernel void @local_singlethread_monotonic_seq_cst_ret_cmpxchg(
4327; GFX6-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4328; GFX6:       ; %bb.0: ; %entry
4329; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4330; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4331; GFX6-NEXT:    s_mov_b32 m0, -1
4332; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4333; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4334; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4335; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4336; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4337; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4338; GFX6-NEXT:    ds_write_b32 v0, v1
4339; GFX6-NEXT:    s_endpgm
4340;
4341; GFX7-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4342; GFX7:       ; %bb.0: ; %entry
4343; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4344; GFX7-NEXT:    s_mov_b32 m0, -1
4345; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4346; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4347; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4348; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4349; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4350; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4351; GFX7-NEXT:    ds_write_b32 v0, v1
4352; GFX7-NEXT:    s_endpgm
4353;
4354; GFX10-WGP-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4355; GFX10-WGP:       ; %bb.0: ; %entry
4356; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4357; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4358; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4359; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4360; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4361; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4362; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4363; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4364; GFX10-WGP-NEXT:    s_endpgm
4365;
4366; GFX10-CU-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4367; GFX10-CU:       ; %bb.0: ; %entry
4368; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4369; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4370; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4371; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4372; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4373; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4374; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4375; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4376; GFX10-CU-NEXT:    s_endpgm
4377;
4378; SKIP-CACHE-INV-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4379; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4380; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4381; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4382; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4383; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4384; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4385; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4386; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4387; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4388; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4389; SKIP-CACHE-INV-NEXT:    s_endpgm
4390;
4391; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4392; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4393; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4394; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4395; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4396; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4397; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4398; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4399; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4400; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4401; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4402;
4403; GFX90A-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4404; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4405; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4406; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4407; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4408; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4409; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4410; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4411; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4412; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4413; GFX90A-TGSPLIT-NEXT:    s_endpgm
4414;
4415; GFX940-NOTTGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4416; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4417; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4418; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4419; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4420; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4421; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4422; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4423; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4424; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4425; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4426;
4427; GFX940-TGSPLIT-LABEL: local_singlethread_monotonic_seq_cst_ret_cmpxchg:
4428; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4429; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4430; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4431; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4432; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4433; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4434; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4435; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4436; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4437; GFX940-TGSPLIT-NEXT:    s_endpgm
4438    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4439entry:
4440  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4441  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") monotonic seq_cst
4442  %val0 = extractvalue { i32, i1 } %val, 0
4443  store i32 %val0, i32 addrspace(3)* %out, align 4
4444  ret void
4445}
4446
4447define amdgpu_kernel void @local_singlethread_acquire_seq_cst_ret_cmpxchg(
4448; GFX6-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4449; GFX6:       ; %bb.0: ; %entry
4450; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4451; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4452; GFX6-NEXT:    s_mov_b32 m0, -1
4453; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4454; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4455; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4456; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4457; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4458; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4459; GFX6-NEXT:    ds_write_b32 v0, v1
4460; GFX6-NEXT:    s_endpgm
4461;
4462; GFX7-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4463; GFX7:       ; %bb.0: ; %entry
4464; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4465; GFX7-NEXT:    s_mov_b32 m0, -1
4466; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4467; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4468; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4469; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4470; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4471; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4472; GFX7-NEXT:    ds_write_b32 v0, v1
4473; GFX7-NEXT:    s_endpgm
4474;
4475; GFX10-WGP-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4476; GFX10-WGP:       ; %bb.0: ; %entry
4477; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4478; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4479; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4480; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4481; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4482; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4483; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4484; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4485; GFX10-WGP-NEXT:    s_endpgm
4486;
4487; GFX10-CU-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4488; GFX10-CU:       ; %bb.0: ; %entry
4489; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4490; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4491; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4492; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4493; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4494; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4495; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4496; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4497; GFX10-CU-NEXT:    s_endpgm
4498;
4499; SKIP-CACHE-INV-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4500; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4501; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4502; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4503; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4504; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4505; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4506; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4507; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4508; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4509; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4510; SKIP-CACHE-INV-NEXT:    s_endpgm
4511;
4512; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4513; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4514; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4515; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4516; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4517; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4518; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4519; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4520; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4521; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4522; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4523;
4524; GFX90A-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4525; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4526; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4527; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4528; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4529; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4530; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4531; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4532; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4533; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4534; GFX90A-TGSPLIT-NEXT:    s_endpgm
4535;
4536; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4537; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4538; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4539; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4540; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4541; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4542; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4543; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4544; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4545; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4546; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4547;
4548; GFX940-TGSPLIT-LABEL: local_singlethread_acquire_seq_cst_ret_cmpxchg:
4549; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4550; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4551; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4552; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4553; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4554; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4555; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4556; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4557; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4558; GFX940-TGSPLIT-NEXT:    s_endpgm
4559    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4560entry:
4561  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4562  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acquire seq_cst
4563  %val0 = extractvalue { i32, i1 } %val, 0
4564  store i32 %val0, i32 addrspace(3)* %out, align 4
4565  ret void
4566}
4567
4568define amdgpu_kernel void @local_singlethread_release_seq_cst_ret_cmpxchg(
4569; GFX6-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4570; GFX6:       ; %bb.0: ; %entry
4571; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4572; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4573; GFX6-NEXT:    s_mov_b32 m0, -1
4574; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4575; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4576; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4577; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4578; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4579; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4580; GFX6-NEXT:    ds_write_b32 v0, v1
4581; GFX6-NEXT:    s_endpgm
4582;
4583; GFX7-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4584; GFX7:       ; %bb.0: ; %entry
4585; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4586; GFX7-NEXT:    s_mov_b32 m0, -1
4587; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4588; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4589; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4590; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4591; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4592; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4593; GFX7-NEXT:    ds_write_b32 v0, v1
4594; GFX7-NEXT:    s_endpgm
4595;
4596; GFX10-WGP-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4597; GFX10-WGP:       ; %bb.0: ; %entry
4598; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4599; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4600; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4601; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4602; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4603; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4604; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4605; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4606; GFX10-WGP-NEXT:    s_endpgm
4607;
4608; GFX10-CU-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4609; GFX10-CU:       ; %bb.0: ; %entry
4610; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4611; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4612; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4613; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4614; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4615; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4616; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4617; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4618; GFX10-CU-NEXT:    s_endpgm
4619;
4620; SKIP-CACHE-INV-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4621; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4622; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4623; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4624; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4625; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4626; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4627; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4628; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4629; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4630; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4631; SKIP-CACHE-INV-NEXT:    s_endpgm
4632;
4633; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4634; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4635; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4636; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4637; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4638; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4639; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4640; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4641; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4642; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4643; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4644;
4645; GFX90A-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4646; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4647; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4648; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4649; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4650; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4651; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4652; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4653; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4654; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4655; GFX90A-TGSPLIT-NEXT:    s_endpgm
4656;
4657; GFX940-NOTTGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4658; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4659; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4660; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4661; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4662; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4663; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4664; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4665; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4666; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4667; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4668;
4669; GFX940-TGSPLIT-LABEL: local_singlethread_release_seq_cst_ret_cmpxchg:
4670; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4671; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4672; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4673; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4674; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4675; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4676; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4677; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4678; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4679; GFX940-TGSPLIT-NEXT:    s_endpgm
4680    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4681entry:
4682  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4683  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") release seq_cst
4684  %val0 = extractvalue { i32, i1 } %val, 0
4685  store i32 %val0, i32 addrspace(3)* %out, align 4
4686  ret void
4687}
4688
4689define amdgpu_kernel void @local_singlethread_acq_rel_seq_cst_ret_cmpxchg(
4690; GFX6-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4691; GFX6:       ; %bb.0: ; %entry
4692; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4693; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4694; GFX6-NEXT:    s_mov_b32 m0, -1
4695; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4696; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4697; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4698; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4699; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4700; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4701; GFX6-NEXT:    ds_write_b32 v0, v1
4702; GFX6-NEXT:    s_endpgm
4703;
4704; GFX7-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4705; GFX7:       ; %bb.0: ; %entry
4706; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4707; GFX7-NEXT:    s_mov_b32 m0, -1
4708; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4709; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4710; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4711; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4712; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4713; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4714; GFX7-NEXT:    ds_write_b32 v0, v1
4715; GFX7-NEXT:    s_endpgm
4716;
4717; GFX10-WGP-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4718; GFX10-WGP:       ; %bb.0: ; %entry
4719; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4720; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4721; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4722; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4723; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4724; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4725; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4726; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4727; GFX10-WGP-NEXT:    s_endpgm
4728;
4729; GFX10-CU-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4730; GFX10-CU:       ; %bb.0: ; %entry
4731; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4732; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4733; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4734; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4735; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4736; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4737; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4738; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4739; GFX10-CU-NEXT:    s_endpgm
4740;
4741; SKIP-CACHE-INV-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4742; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4743; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4744; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4745; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4746; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4747; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4748; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4749; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4750; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4751; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4752; SKIP-CACHE-INV-NEXT:    s_endpgm
4753;
4754; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4755; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4756; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4757; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4758; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4759; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4760; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4761; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4762; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4763; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4764; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4765;
4766; GFX90A-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4767; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4768; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4769; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4770; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4771; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4772; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4773; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4774; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4775; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4776; GFX90A-TGSPLIT-NEXT:    s_endpgm
4777;
4778; GFX940-NOTTGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4779; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4780; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4781; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4782; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4783; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4784; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4785; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4786; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4787; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4788; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4789;
4790; GFX940-TGSPLIT-LABEL: local_singlethread_acq_rel_seq_cst_ret_cmpxchg:
4791; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4792; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4793; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4794; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4795; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4796; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4797; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4798; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4799; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4800; GFX940-TGSPLIT-NEXT:    s_endpgm
4801    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4802entry:
4803  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4804  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") acq_rel seq_cst
4805  %val0 = extractvalue { i32, i1 } %val, 0
4806  store i32 %val0, i32 addrspace(3)* %out, align 4
4807  ret void
4808}
4809
4810define amdgpu_kernel void @local_singlethread_seq_cst_seq_cst_ret_cmpxchg(
4811; GFX6-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4812; GFX6:       ; %bb.0: ; %entry
4813; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
4814; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
4815; GFX6-NEXT:    s_mov_b32 m0, -1
4816; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4817; GFX6-NEXT:    v_mov_b32_e32 v0, s2
4818; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4819; GFX6-NEXT:    v_mov_b32_e32 v2, s0
4820; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4821; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4822; GFX6-NEXT:    ds_write_b32 v0, v1
4823; GFX6-NEXT:    s_endpgm
4824;
4825; GFX7-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4826; GFX7:       ; %bb.0: ; %entry
4827; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4828; GFX7-NEXT:    s_mov_b32 m0, -1
4829; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4830; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4831; GFX7-NEXT:    v_mov_b32_e32 v1, s2
4832; GFX7-NEXT:    v_mov_b32_e32 v2, s1
4833; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4834; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4835; GFX7-NEXT:    ds_write_b32 v0, v1
4836; GFX7-NEXT:    s_endpgm
4837;
4838; GFX10-WGP-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4839; GFX10-WGP:       ; %bb.0: ; %entry
4840; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4841; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4842; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4843; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
4844; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
4845; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4846; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4847; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
4848; GFX10-WGP-NEXT:    s_endpgm
4849;
4850; GFX10-CU-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4851; GFX10-CU:       ; %bb.0: ; %entry
4852; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4853; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4854; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4855; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
4856; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
4857; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4858; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4859; GFX10-CU-NEXT:    ds_write_b32 v0, v1
4860; GFX10-CU-NEXT:    s_endpgm
4861;
4862; SKIP-CACHE-INV-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4863; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4864; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4865; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4866; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4867; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4868; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
4869; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
4870; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4871; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4872; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
4873; SKIP-CACHE-INV-NEXT:    s_endpgm
4874;
4875; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4876; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4877; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4878; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4879; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4880; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4881; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4882; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4883; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4884; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4885; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
4886;
4887; GFX90A-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4888; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
4889; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
4890; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4891; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4892; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4893; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4894; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4895; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4896; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4897; GFX90A-TGSPLIT-NEXT:    s_endpgm
4898;
4899; GFX940-NOTTGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4900; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
4901; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4902; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4903; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4904; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4905; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4906; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4907; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4908; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
4909; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
4910;
4911; GFX940-TGSPLIT-LABEL: local_singlethread_seq_cst_seq_cst_ret_cmpxchg:
4912; GFX940-TGSPLIT:       ; %bb.0: ; %entry
4913; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
4914; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4915; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4916; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
4917; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
4918; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
4919; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4920; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
4921; GFX940-TGSPLIT-NEXT:    s_endpgm
4922    i32 addrspace(3)* %out, i32 %in, i32 %old) {
4923entry:
4924  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
4925  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread") seq_cst seq_cst
4926  %val0 = extractvalue { i32, i1 } %val, 0
4927  store i32 %val0, i32 addrspace(3)* %out, align 4
4928  ret void
4929}
4930
4931define amdgpu_kernel void @local_singlethread_one_as_unordered_load(
4932; GFX6-LABEL: local_singlethread_one_as_unordered_load:
4933; GFX6:       ; %bb.0: ; %entry
4934; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
4935; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
4936; GFX6-NEXT:    s_mov_b32 m0, -1
4937; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4938; GFX6-NEXT:    v_mov_b32_e32 v0, s0
4939; GFX6-NEXT:    ds_read_b32 v0, v0
4940; GFX6-NEXT:    v_mov_b32_e32 v1, s1
4941; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
4942; GFX6-NEXT:    ds_write_b32 v1, v0
4943; GFX6-NEXT:    s_endpgm
4944;
4945; GFX7-LABEL: local_singlethread_one_as_unordered_load:
4946; GFX7:       ; %bb.0: ; %entry
4947; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
4948; GFX7-NEXT:    s_mov_b32 m0, -1
4949; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4950; GFX7-NEXT:    v_mov_b32_e32 v0, s0
4951; GFX7-NEXT:    ds_read_b32 v0, v0
4952; GFX7-NEXT:    v_mov_b32_e32 v1, s1
4953; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
4954; GFX7-NEXT:    ds_write_b32 v1, v0
4955; GFX7-NEXT:    s_endpgm
4956;
4957; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_load:
4958; GFX10-WGP:       ; %bb.0: ; %entry
4959; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
4960; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4961; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
4962; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
4963; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
4964; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
4965; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
4966; GFX10-WGP-NEXT:    s_endpgm
4967;
4968; GFX10-CU-LABEL: local_singlethread_one_as_unordered_load:
4969; GFX10-CU:       ; %bb.0: ; %entry
4970; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
4971; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4972; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
4973; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
4974; GFX10-CU-NEXT:    ds_read_b32 v0, v0
4975; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
4976; GFX10-CU-NEXT:    ds_write_b32 v1, v0
4977; GFX10-CU-NEXT:    s_endpgm
4978;
4979; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_load:
4980; SKIP-CACHE-INV:       ; %bb.0: ; %entry
4981; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
4982; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
4983; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4984; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
4985; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
4986; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
4987; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
4988; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
4989; SKIP-CACHE-INV-NEXT:    s_endpgm
4990;
4991; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load:
4992; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
4993; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
4994; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4995; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
4996; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
4997; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
4998; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
4999; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5000; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5001;
5002; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load:
5003; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5004; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5005; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5006; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5007; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5008; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5009; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5010; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5011; GFX90A-TGSPLIT-NEXT:    s_endpgm
5012;
5013; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_load:
5014; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5015; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5016; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5017; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5018; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5019; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5020; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5021; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5022; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5023;
5024; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_unordered_load:
5025; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5026; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5027; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5028; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5029; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5030; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5031; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5032; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5033; GFX940-TGSPLIT-NEXT:    s_endpgm
5034    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
5035entry:
5036  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") unordered, align 4
5037  store i32 %val, i32 addrspace(3)* %out
5038  ret void
5039}
5040
5041define amdgpu_kernel void @local_singlethread_one_as_monotonic_load(
5042; GFX6-LABEL: local_singlethread_one_as_monotonic_load:
5043; GFX6:       ; %bb.0: ; %entry
5044; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5045; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5046; GFX6-NEXT:    s_mov_b32 m0, -1
5047; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5048; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5049; GFX6-NEXT:    ds_read_b32 v0, v0
5050; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5051; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5052; GFX6-NEXT:    ds_write_b32 v1, v0
5053; GFX6-NEXT:    s_endpgm
5054;
5055; GFX7-LABEL: local_singlethread_one_as_monotonic_load:
5056; GFX7:       ; %bb.0: ; %entry
5057; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5058; GFX7-NEXT:    s_mov_b32 m0, -1
5059; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5060; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5061; GFX7-NEXT:    ds_read_b32 v0, v0
5062; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5063; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5064; GFX7-NEXT:    ds_write_b32 v1, v0
5065; GFX7-NEXT:    s_endpgm
5066;
5067; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_load:
5068; GFX10-WGP:       ; %bb.0: ; %entry
5069; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5070; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5071; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5072; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5073; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
5074; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5075; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
5076; GFX10-WGP-NEXT:    s_endpgm
5077;
5078; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_load:
5079; GFX10-CU:       ; %bb.0: ; %entry
5080; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5081; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5082; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5083; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5084; GFX10-CU-NEXT:    ds_read_b32 v0, v0
5085; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5086; GFX10-CU-NEXT:    ds_write_b32 v1, v0
5087; GFX10-CU-NEXT:    s_endpgm
5088;
5089; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_load:
5090; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5091; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5092; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5093; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5094; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5095; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
5096; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5097; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5098; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
5099; SKIP-CACHE-INV-NEXT:    s_endpgm
5100;
5101; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:
5102; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5103; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5104; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5105; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5106; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5107; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5108; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5109; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5110; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5111;
5112; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:
5113; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5114; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5115; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5116; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5117; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5118; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5119; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5120; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5121; GFX90A-TGSPLIT-NEXT:    s_endpgm
5122;
5123; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:
5124; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5125; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5126; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5127; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5128; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5129; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5130; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5131; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5132; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5133;
5134; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_load:
5135; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5136; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5137; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5138; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5139; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5140; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5141; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5142; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5143; GFX940-TGSPLIT-NEXT:    s_endpgm
5144    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
5145entry:
5146  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") monotonic, align 4
5147  store i32 %val, i32 addrspace(3)* %out
5148  ret void
5149}
5150
5151define amdgpu_kernel void @local_singlethread_one_as_acquire_load(
5152; GFX6-LABEL: local_singlethread_one_as_acquire_load:
5153; GFX6:       ; %bb.0: ; %entry
5154; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5155; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5156; GFX6-NEXT:    s_mov_b32 m0, -1
5157; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5158; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5159; GFX6-NEXT:    ds_read_b32 v0, v0
5160; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5161; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5162; GFX6-NEXT:    ds_write_b32 v1, v0
5163; GFX6-NEXT:    s_endpgm
5164;
5165; GFX7-LABEL: local_singlethread_one_as_acquire_load:
5166; GFX7:       ; %bb.0: ; %entry
5167; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5168; GFX7-NEXT:    s_mov_b32 m0, -1
5169; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5170; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5171; GFX7-NEXT:    ds_read_b32 v0, v0
5172; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5173; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5174; GFX7-NEXT:    ds_write_b32 v1, v0
5175; GFX7-NEXT:    s_endpgm
5176;
5177; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_load:
5178; GFX10-WGP:       ; %bb.0: ; %entry
5179; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5180; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5181; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5182; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5183; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
5184; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5185; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
5186; GFX10-WGP-NEXT:    s_endpgm
5187;
5188; GFX10-CU-LABEL: local_singlethread_one_as_acquire_load:
5189; GFX10-CU:       ; %bb.0: ; %entry
5190; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5191; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5192; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5193; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5194; GFX10-CU-NEXT:    ds_read_b32 v0, v0
5195; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5196; GFX10-CU-NEXT:    ds_write_b32 v1, v0
5197; GFX10-CU-NEXT:    s_endpgm
5198;
5199; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_load:
5200; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5201; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5202; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5203; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5204; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5205; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
5206; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5207; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5208; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
5209; SKIP-CACHE-INV-NEXT:    s_endpgm
5210;
5211; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load:
5212; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5213; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5214; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5215; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5216; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5217; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5218; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5219; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5220; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5221;
5222; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load:
5223; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5224; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5225; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5226; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5227; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5228; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5229; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5230; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5231; GFX90A-TGSPLIT-NEXT:    s_endpgm
5232;
5233; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_load:
5234; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5235; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5236; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5237; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5238; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5239; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5240; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5241; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5242; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5243;
5244; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_load:
5245; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5246; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5247; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5248; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5249; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5250; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5251; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5252; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5253; GFX940-TGSPLIT-NEXT:    s_endpgm
5254    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
5255entry:
5256  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") acquire, align 4
5257  store i32 %val, i32 addrspace(3)* %out
5258  ret void
5259}
5260
5261define amdgpu_kernel void @local_singlethread_one_as_seq_cst_load(
5262; GFX6-LABEL: local_singlethread_one_as_seq_cst_load:
5263; GFX6:       ; %bb.0: ; %entry
5264; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5265; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5266; GFX6-NEXT:    s_mov_b32 m0, -1
5267; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5268; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5269; GFX6-NEXT:    ds_read_b32 v0, v0
5270; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5271; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5272; GFX6-NEXT:    ds_write_b32 v1, v0
5273; GFX6-NEXT:    s_endpgm
5274;
5275; GFX7-LABEL: local_singlethread_one_as_seq_cst_load:
5276; GFX7:       ; %bb.0: ; %entry
5277; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5278; GFX7-NEXT:    s_mov_b32 m0, -1
5279; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5280; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5281; GFX7-NEXT:    ds_read_b32 v0, v0
5282; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5283; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5284; GFX7-NEXT:    ds_write_b32 v1, v0
5285; GFX7-NEXT:    s_endpgm
5286;
5287; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_load:
5288; GFX10-WGP:       ; %bb.0: ; %entry
5289; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5290; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5291; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5292; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5293; GFX10-WGP-NEXT:    ds_read_b32 v0, v0
5294; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5295; GFX10-WGP-NEXT:    ds_write_b32 v1, v0
5296; GFX10-WGP-NEXT:    s_endpgm
5297;
5298; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_load:
5299; GFX10-CU:       ; %bb.0: ; %entry
5300; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5301; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5302; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5303; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5304; GFX10-CU-NEXT:    ds_read_b32 v0, v0
5305; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5306; GFX10-CU-NEXT:    ds_write_b32 v1, v0
5307; GFX10-CU-NEXT:    s_endpgm
5308;
5309; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_load:
5310; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5311; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5312; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5313; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5314; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5315; SKIP-CACHE-INV-NEXT:    ds_read_b32 v0, v0
5316; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5317; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5318; SKIP-CACHE-INV-NEXT:    ds_write_b32 v1, v0
5319; SKIP-CACHE-INV-NEXT:    s_endpgm
5320;
5321; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:
5322; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5323; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5324; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5325; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5326; GFX90A-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5327; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5328; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5329; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5330; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5331;
5332; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:
5333; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5334; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5335; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5336; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5337; GFX90A-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5338; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5339; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5340; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5341; GFX90A-TGSPLIT-NEXT:    s_endpgm
5342;
5343; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:
5344; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5345; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5346; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5347; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5348; GFX940-NOTTGSPLIT-NEXT:    ds_read_b32 v0, v0
5349; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5350; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5351; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v1, v0
5352; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5353;
5354; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_load:
5355; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5356; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5357; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5358; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5359; GFX940-TGSPLIT-NEXT:    ds_read_b32 v0, v0
5360; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5361; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5362; GFX940-TGSPLIT-NEXT:    ds_write_b32 v1, v0
5363; GFX940-TGSPLIT-NEXT:    s_endpgm
5364    i32 addrspace(3)* %in, i32 addrspace(3)* %out) {
5365entry:
5366  %val = load atomic i32, i32 addrspace(3)* %in syncscope("singlethread-one-as") seq_cst, align 4
5367  store i32 %val, i32 addrspace(3)* %out
5368  ret void
5369}
5370
5371define amdgpu_kernel void @local_singlethread_one_as_unordered_store(
5372; GFX6-LABEL: local_singlethread_one_as_unordered_store:
5373; GFX6:       ; %bb.0: ; %entry
5374; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
5375; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
5376; GFX6-NEXT:    s_mov_b32 m0, -1
5377; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5378; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5379; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5380; GFX6-NEXT:    ds_write_b32 v0, v1
5381; GFX6-NEXT:    s_endpgm
5382;
5383; GFX7-LABEL: local_singlethread_one_as_unordered_store:
5384; GFX7:       ; %bb.0: ; %entry
5385; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5386; GFX7-NEXT:    s_mov_b32 m0, -1
5387; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5388; GFX7-NEXT:    v_mov_b32_e32 v0, s1
5389; GFX7-NEXT:    v_mov_b32_e32 v1, s0
5390; GFX7-NEXT:    ds_write_b32 v0, v1
5391; GFX7-NEXT:    s_endpgm
5392;
5393; GFX10-WGP-LABEL: local_singlethread_one_as_unordered_store:
5394; GFX10-WGP:       ; %bb.0: ; %entry
5395; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5396; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5397; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
5398; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
5399; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
5400; GFX10-WGP-NEXT:    s_endpgm
5401;
5402; GFX10-CU-LABEL: local_singlethread_one_as_unordered_store:
5403; GFX10-CU:       ; %bb.0: ; %entry
5404; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5405; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5406; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
5407; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
5408; GFX10-CU-NEXT:    ds_write_b32 v0, v1
5409; GFX10-CU-NEXT:    s_endpgm
5410;
5411; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_unordered_store:
5412; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5413; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5414; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5415; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5416; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
5417; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
5418; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
5419; SKIP-CACHE-INV-NEXT:    s_endpgm
5420;
5421; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store:
5422; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5423; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5424; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5425; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5426; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5427; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5428; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5429;
5430; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store:
5431; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5432; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5433; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5434; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5435; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5436; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5437; GFX90A-TGSPLIT-NEXT:    s_endpgm
5438;
5439; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_unordered_store:
5440; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5441; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5442; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5443; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5444; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5445; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5446; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5447;
5448; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_unordered_store:
5449; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5450; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5451; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5452; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5453; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5454; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5455; GFX940-TGSPLIT-NEXT:    s_endpgm
5456    i32 %in, i32 addrspace(3)* %out) {
5457entry:
5458  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") unordered, align 4
5459  ret void
5460}
5461
5462define amdgpu_kernel void @local_singlethread_one_as_monotonic_store(
5463; GFX6-LABEL: local_singlethread_one_as_monotonic_store:
5464; GFX6:       ; %bb.0: ; %entry
5465; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
5466; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
5467; GFX6-NEXT:    s_mov_b32 m0, -1
5468; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5469; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5470; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5471; GFX6-NEXT:    ds_write_b32 v0, v1
5472; GFX6-NEXT:    s_endpgm
5473;
5474; GFX7-LABEL: local_singlethread_one_as_monotonic_store:
5475; GFX7:       ; %bb.0: ; %entry
5476; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5477; GFX7-NEXT:    s_mov_b32 m0, -1
5478; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5479; GFX7-NEXT:    v_mov_b32_e32 v0, s1
5480; GFX7-NEXT:    v_mov_b32_e32 v1, s0
5481; GFX7-NEXT:    ds_write_b32 v0, v1
5482; GFX7-NEXT:    s_endpgm
5483;
5484; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_store:
5485; GFX10-WGP:       ; %bb.0: ; %entry
5486; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5487; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5488; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
5489; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
5490; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
5491; GFX10-WGP-NEXT:    s_endpgm
5492;
5493; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_store:
5494; GFX10-CU:       ; %bb.0: ; %entry
5495; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5496; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5497; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
5498; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
5499; GFX10-CU-NEXT:    ds_write_b32 v0, v1
5500; GFX10-CU-NEXT:    s_endpgm
5501;
5502; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_store:
5503; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5504; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5505; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5506; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5507; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
5508; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
5509; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
5510; SKIP-CACHE-INV-NEXT:    s_endpgm
5511;
5512; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:
5513; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5514; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5515; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5516; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5517; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5518; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5519; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5520;
5521; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:
5522; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5523; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5524; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5525; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5526; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5527; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5528; GFX90A-TGSPLIT-NEXT:    s_endpgm
5529;
5530; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:
5531; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5532; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5533; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5534; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5535; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5536; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5537; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5538;
5539; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_store:
5540; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5541; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5542; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5543; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5544; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5545; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5546; GFX940-TGSPLIT-NEXT:    s_endpgm
5547    i32 %in, i32 addrspace(3)* %out) {
5548entry:
5549  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") monotonic, align 4
5550  ret void
5551}
5552
5553define amdgpu_kernel void @local_singlethread_one_as_release_store(
5554; GFX6-LABEL: local_singlethread_one_as_release_store:
5555; GFX6:       ; %bb.0: ; %entry
5556; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
5557; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
5558; GFX6-NEXT:    s_mov_b32 m0, -1
5559; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5560; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5561; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5562; GFX6-NEXT:    ds_write_b32 v0, v1
5563; GFX6-NEXT:    s_endpgm
5564;
5565; GFX7-LABEL: local_singlethread_one_as_release_store:
5566; GFX7:       ; %bb.0: ; %entry
5567; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5568; GFX7-NEXT:    s_mov_b32 m0, -1
5569; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5570; GFX7-NEXT:    v_mov_b32_e32 v0, s1
5571; GFX7-NEXT:    v_mov_b32_e32 v1, s0
5572; GFX7-NEXT:    ds_write_b32 v0, v1
5573; GFX7-NEXT:    s_endpgm
5574;
5575; GFX10-WGP-LABEL: local_singlethread_one_as_release_store:
5576; GFX10-WGP:       ; %bb.0: ; %entry
5577; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5578; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5579; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
5580; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
5581; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
5582; GFX10-WGP-NEXT:    s_endpgm
5583;
5584; GFX10-CU-LABEL: local_singlethread_one_as_release_store:
5585; GFX10-CU:       ; %bb.0: ; %entry
5586; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5587; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5588; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
5589; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
5590; GFX10-CU-NEXT:    ds_write_b32 v0, v1
5591; GFX10-CU-NEXT:    s_endpgm
5592;
5593; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_store:
5594; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5595; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5596; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5597; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5598; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
5599; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
5600; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
5601; SKIP-CACHE-INV-NEXT:    s_endpgm
5602;
5603; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store:
5604; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5605; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5606; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5607; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5608; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5609; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5610; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5611;
5612; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_store:
5613; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5614; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5615; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5616; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5617; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5618; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5619; GFX90A-TGSPLIT-NEXT:    s_endpgm
5620;
5621; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_store:
5622; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5623; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5624; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5625; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5626; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5627; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5628; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5629;
5630; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_store:
5631; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5632; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5633; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5634; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5635; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5636; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5637; GFX940-TGSPLIT-NEXT:    s_endpgm
5638    i32 %in, i32 addrspace(3)* %out) {
5639entry:
5640  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") release, align 4
5641  ret void
5642}
5643
5644define amdgpu_kernel void @local_singlethread_one_as_seq_cst_store(
5645; GFX6-LABEL: local_singlethread_one_as_seq_cst_store:
5646; GFX6:       ; %bb.0: ; %entry
5647; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x1
5648; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x0
5649; GFX6-NEXT:    s_mov_b32 m0, -1
5650; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5651; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5652; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5653; GFX6-NEXT:    ds_write_b32 v0, v1
5654; GFX6-NEXT:    s_endpgm
5655;
5656; GFX7-LABEL: local_singlethread_one_as_seq_cst_store:
5657; GFX7:       ; %bb.0: ; %entry
5658; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5659; GFX7-NEXT:    s_mov_b32 m0, -1
5660; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5661; GFX7-NEXT:    v_mov_b32_e32 v0, s1
5662; GFX7-NEXT:    v_mov_b32_e32 v1, s0
5663; GFX7-NEXT:    ds_write_b32 v0, v1
5664; GFX7-NEXT:    s_endpgm
5665;
5666; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_store:
5667; GFX10-WGP:       ; %bb.0: ; %entry
5668; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5669; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5670; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s1
5671; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
5672; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
5673; GFX10-WGP-NEXT:    s_endpgm
5674;
5675; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_store:
5676; GFX10-CU:       ; %bb.0: ; %entry
5677; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5678; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5679; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s1
5680; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
5681; GFX10-CU-NEXT:    ds_write_b32 v0, v1
5682; GFX10-CU-NEXT:    s_endpgm
5683;
5684; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_store:
5685; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5686; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5687; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5688; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5689; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
5690; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
5691; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
5692; SKIP-CACHE-INV-NEXT:    s_endpgm
5693;
5694; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:
5695; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5696; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5697; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5698; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5699; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5700; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5701; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5702;
5703; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:
5704; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5705; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5706; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5707; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5708; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5709; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5710; GFX90A-TGSPLIT-NEXT:    s_endpgm
5711;
5712; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:
5713; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5714; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5715; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5716; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5717; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5718; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
5719; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5720;
5721; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_store:
5722; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5723; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5724; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5725; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s1
5726; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s0
5727; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
5728; GFX940-TGSPLIT-NEXT:    s_endpgm
5729    i32 %in, i32 addrspace(3)* %out) {
5730entry:
5731  store atomic i32 %in, i32 addrspace(3)* %out syncscope("singlethread-one-as") seq_cst, align 4
5732  ret void
5733}
5734
5735define amdgpu_kernel void @local_singlethread_one_as_monotonic_atomicrmw(
5736; GFX6-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5737; GFX6:       ; %bb.0: ; %entry
5738; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5739; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5740; GFX6-NEXT:    s_mov_b32 m0, -1
5741; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5742; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5743; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5744; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5745; GFX6-NEXT:    s_endpgm
5746;
5747; GFX7-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5748; GFX7:       ; %bb.0: ; %entry
5749; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5750; GFX7-NEXT:    s_mov_b32 m0, -1
5751; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5752; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5753; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5754; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5755; GFX7-NEXT:    s_endpgm
5756;
5757; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5758; GFX10-WGP:       ; %bb.0: ; %entry
5759; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5760; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5761; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5762; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5763; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5764; GFX10-WGP-NEXT:    s_endpgm
5765;
5766; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5767; GFX10-CU:       ; %bb.0: ; %entry
5768; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5769; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5770; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5771; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5772; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5773; GFX10-CU-NEXT:    s_endpgm
5774;
5775; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5776; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5777; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5778; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5779; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5780; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5781; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5782; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5783; SKIP-CACHE-INV-NEXT:    s_endpgm
5784;
5785; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5786; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5787; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5788; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5789; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5790; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5791; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5792; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5793;
5794; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5795; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5796; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5797; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5798; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5799; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5800; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5801; GFX90A-TGSPLIT-NEXT:    s_endpgm
5802;
5803; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5804; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5805; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5806; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5807; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5808; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5809; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5810; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5811;
5812; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_atomicrmw:
5813; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5814; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5815; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5816; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5817; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5818; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5819; GFX940-TGSPLIT-NEXT:    s_endpgm
5820    i32 addrspace(3)* %out, i32 %in) {
5821entry:
5822  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") monotonic
5823  ret void
5824}
5825
5826define amdgpu_kernel void @local_singlethread_one_as_acquire_atomicrmw(
5827; GFX6-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5828; GFX6:       ; %bb.0: ; %entry
5829; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5830; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5831; GFX6-NEXT:    s_mov_b32 m0, -1
5832; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5833; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5834; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5835; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5836; GFX6-NEXT:    s_endpgm
5837;
5838; GFX7-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5839; GFX7:       ; %bb.0: ; %entry
5840; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5841; GFX7-NEXT:    s_mov_b32 m0, -1
5842; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5843; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5844; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5845; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5846; GFX7-NEXT:    s_endpgm
5847;
5848; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5849; GFX10-WGP:       ; %bb.0: ; %entry
5850; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5851; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5852; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5853; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5854; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5855; GFX10-WGP-NEXT:    s_endpgm
5856;
5857; GFX10-CU-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5858; GFX10-CU:       ; %bb.0: ; %entry
5859; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5860; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5861; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5862; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5863; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5864; GFX10-CU-NEXT:    s_endpgm
5865;
5866; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5867; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5868; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5869; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5870; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5871; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5872; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5873; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5874; SKIP-CACHE-INV-NEXT:    s_endpgm
5875;
5876; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5877; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5878; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5879; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5880; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5881; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5882; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5883; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5884;
5885; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5886; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5887; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5888; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5889; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5890; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5891; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5892; GFX90A-TGSPLIT-NEXT:    s_endpgm
5893;
5894; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5895; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5896; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5897; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5898; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5899; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5900; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5901; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5902;
5903; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_atomicrmw:
5904; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5905; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5906; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5907; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5908; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5909; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5910; GFX940-TGSPLIT-NEXT:    s_endpgm
5911    i32 addrspace(3)* %out, i32 %in) {
5912entry:
5913  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acquire
5914  ret void
5915}
5916
5917define amdgpu_kernel void @local_singlethread_one_as_release_atomicrmw(
5918; GFX6-LABEL: local_singlethread_one_as_release_atomicrmw:
5919; GFX6:       ; %bb.0: ; %entry
5920; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
5921; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
5922; GFX6-NEXT:    s_mov_b32 m0, -1
5923; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
5924; GFX6-NEXT:    v_mov_b32_e32 v0, s0
5925; GFX6-NEXT:    v_mov_b32_e32 v1, s1
5926; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5927; GFX6-NEXT:    s_endpgm
5928;
5929; GFX7-LABEL: local_singlethread_one_as_release_atomicrmw:
5930; GFX7:       ; %bb.0: ; %entry
5931; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5932; GFX7-NEXT:    s_mov_b32 m0, -1
5933; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
5934; GFX7-NEXT:    v_mov_b32_e32 v0, s0
5935; GFX7-NEXT:    v_mov_b32_e32 v1, s1
5936; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5937; GFX7-NEXT:    s_endpgm
5938;
5939; GFX10-WGP-LABEL: local_singlethread_one_as_release_atomicrmw:
5940; GFX10-WGP:       ; %bb.0: ; %entry
5941; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5942; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
5943; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
5944; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
5945; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5946; GFX10-WGP-NEXT:    s_endpgm
5947;
5948; GFX10-CU-LABEL: local_singlethread_one_as_release_atomicrmw:
5949; GFX10-CU:       ; %bb.0: ; %entry
5950; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5951; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
5952; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
5953; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
5954; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5955; GFX10-CU-NEXT:    s_endpgm
5956;
5957; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_atomicrmw:
5958; SKIP-CACHE-INV:       ; %bb.0: ; %entry
5959; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5960; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
5961; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
5962; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
5963; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
5964; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5965; SKIP-CACHE-INV-NEXT:    s_endpgm
5966;
5967; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:
5968; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
5969; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5970; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5971; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5972; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5973; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5974; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
5975;
5976; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:
5977; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
5978; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
5979; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5980; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5981; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5982; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5983; GFX90A-TGSPLIT-NEXT:    s_endpgm
5984;
5985; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:
5986; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
5987; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5988; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5989; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5990; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
5991; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
5992; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
5993;
5994; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_atomicrmw:
5995; GFX940-TGSPLIT:       ; %bb.0: ; %entry
5996; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
5997; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
5998; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
5999; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6000; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6001; GFX940-TGSPLIT-NEXT:    s_endpgm
6002    i32 addrspace(3)* %out, i32 %in) {
6003entry:
6004  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") release
6005  ret void
6006}
6007
6008define amdgpu_kernel void @local_singlethread_one_as_acq_rel_atomicrmw(
6009; GFX6-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6010; GFX6:       ; %bb.0: ; %entry
6011; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
6012; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
6013; GFX6-NEXT:    s_mov_b32 m0, -1
6014; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6015; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6016; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6017; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6018; GFX6-NEXT:    s_endpgm
6019;
6020; GFX7-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6021; GFX7:       ; %bb.0: ; %entry
6022; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6023; GFX7-NEXT:    s_mov_b32 m0, -1
6024; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6025; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6026; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6027; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6028; GFX7-NEXT:    s_endpgm
6029;
6030; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6031; GFX10-WGP:       ; %bb.0: ; %entry
6032; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6033; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6034; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6035; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
6036; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6037; GFX10-WGP-NEXT:    s_endpgm
6038;
6039; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6040; GFX10-CU:       ; %bb.0: ; %entry
6041; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6042; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6043; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6044; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
6045; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6046; GFX10-CU-NEXT:    s_endpgm
6047;
6048; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6049; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6050; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6051; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6052; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6053; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6054; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
6055; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6056; SKIP-CACHE-INV-NEXT:    s_endpgm
6057;
6058; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6059; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6060; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6061; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6062; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6063; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6064; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6065; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6066;
6067; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6068; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6069; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6070; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6071; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6072; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6073; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6074; GFX90A-TGSPLIT-NEXT:    s_endpgm
6075;
6076; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6077; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6078; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6079; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6080; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6081; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6082; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6083; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6084;
6085; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_atomicrmw:
6086; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6087; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6088; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6089; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6090; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6091; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6092; GFX940-TGSPLIT-NEXT:    s_endpgm
6093    i32 addrspace(3)* %out, i32 %in) {
6094entry:
6095  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acq_rel
6096  ret void
6097}
6098
6099define amdgpu_kernel void @local_singlethread_one_as_seq_cst_atomicrmw(
6100; GFX6-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6101; GFX6:       ; %bb.0: ; %entry
6102; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
6103; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
6104; GFX6-NEXT:    s_mov_b32 m0, -1
6105; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6106; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6107; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6108; GFX6-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6109; GFX6-NEXT:    s_endpgm
6110;
6111; GFX7-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6112; GFX7:       ; %bb.0: ; %entry
6113; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6114; GFX7-NEXT:    s_mov_b32 m0, -1
6115; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6116; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6117; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6118; GFX7-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6119; GFX7-NEXT:    s_endpgm
6120;
6121; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6122; GFX10-WGP:       ; %bb.0: ; %entry
6123; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6124; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6125; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6126; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
6127; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6128; GFX10-WGP-NEXT:    s_endpgm
6129;
6130; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6131; GFX10-CU:       ; %bb.0: ; %entry
6132; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6133; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6134; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6135; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
6136; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6137; GFX10-CU-NEXT:    s_endpgm
6138;
6139; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6140; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6141; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6142; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6143; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6144; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6145; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
6146; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6147; SKIP-CACHE-INV-NEXT:    s_endpgm
6148;
6149; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6150; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6151; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6152; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6153; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6154; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6155; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6156; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6157;
6158; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6159; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6160; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6161; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6162; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6163; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6164; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6165; GFX90A-TGSPLIT-NEXT:    s_endpgm
6166;
6167; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6168; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6169; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6170; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6171; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6172; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6173; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6174; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6175;
6176; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_atomicrmw:
6177; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6178; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6179; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6180; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6181; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6182; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1
6183; GFX940-TGSPLIT-NEXT:    s_endpgm
6184    i32 addrspace(3)* %out, i32 %in) {
6185entry:
6186  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") seq_cst
6187  ret void
6188}
6189
6190define amdgpu_kernel void @local_singlethread_one_as_acquire_ret_atomicrmw(
6191; GFX6-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6192; GFX6:       ; %bb.0: ; %entry
6193; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
6194; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
6195; GFX6-NEXT:    s_mov_b32 m0, -1
6196; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6197; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6198; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6199; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6200; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6201; GFX6-NEXT:    ds_write_b32 v0, v1
6202; GFX6-NEXT:    s_endpgm
6203;
6204; GFX7-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6205; GFX7:       ; %bb.0: ; %entry
6206; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6207; GFX7-NEXT:    s_mov_b32 m0, -1
6208; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6209; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6210; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6211; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6212; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6213; GFX7-NEXT:    ds_write_b32 v0, v1
6214; GFX7-NEXT:    s_endpgm
6215;
6216; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6217; GFX10-WGP:       ; %bb.0: ; %entry
6218; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6219; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6220; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6221; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
6222; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6223; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6224; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
6225; GFX10-WGP-NEXT:    s_endpgm
6226;
6227; GFX10-CU-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6228; GFX10-CU:       ; %bb.0: ; %entry
6229; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6230; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6231; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6232; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
6233; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6234; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6235; GFX10-CU-NEXT:    ds_write_b32 v0, v1
6236; GFX10-CU-NEXT:    s_endpgm
6237;
6238; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6239; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6240; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6241; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6242; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6243; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6244; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
6245; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6246; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6247; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
6248; SKIP-CACHE-INV-NEXT:    s_endpgm
6249;
6250; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6251; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6252; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6253; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6254; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6255; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6256; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6257; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6258; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6259; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6260;
6261; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6262; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6263; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6264; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6265; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6266; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6267; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6268; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6269; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6270; GFX90A-TGSPLIT-NEXT:    s_endpgm
6271;
6272; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6273; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6274; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6275; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6276; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6277; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6278; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6279; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6280; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6281; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6282;
6283; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_ret_atomicrmw:
6284; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6285; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6286; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6287; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6288; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6289; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6290; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6291; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6292; GFX940-TGSPLIT-NEXT:    s_endpgm
6293    i32 addrspace(3)* %out, i32 %in) {
6294entry:
6295  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acquire
6296  store i32 %val, i32 addrspace(3)* %out, align 4
6297  ret void
6298}
6299
6300define amdgpu_kernel void @local_singlethread_one_as_acq_rel_ret_atomicrmw(
6301; GFX6-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6302; GFX6:       ; %bb.0: ; %entry
6303; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
6304; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
6305; GFX6-NEXT:    s_mov_b32 m0, -1
6306; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6307; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6308; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6309; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6310; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6311; GFX6-NEXT:    ds_write_b32 v0, v1
6312; GFX6-NEXT:    s_endpgm
6313;
6314; GFX7-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6315; GFX7:       ; %bb.0: ; %entry
6316; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6317; GFX7-NEXT:    s_mov_b32 m0, -1
6318; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6319; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6320; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6321; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6322; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6323; GFX7-NEXT:    ds_write_b32 v0, v1
6324; GFX7-NEXT:    s_endpgm
6325;
6326; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6327; GFX10-WGP:       ; %bb.0: ; %entry
6328; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6329; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6330; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6331; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
6332; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6333; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6334; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
6335; GFX10-WGP-NEXT:    s_endpgm
6336;
6337; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6338; GFX10-CU:       ; %bb.0: ; %entry
6339; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6340; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6341; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6342; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
6343; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6344; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6345; GFX10-CU-NEXT:    ds_write_b32 v0, v1
6346; GFX10-CU-NEXT:    s_endpgm
6347;
6348; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6349; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6350; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6351; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6352; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6353; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6354; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
6355; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6356; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6357; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
6358; SKIP-CACHE-INV-NEXT:    s_endpgm
6359;
6360; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6361; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6362; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6363; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6364; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6365; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6366; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6367; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6368; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6369; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6370;
6371; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6372; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6373; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6374; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6375; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6376; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6377; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6378; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6379; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6380; GFX90A-TGSPLIT-NEXT:    s_endpgm
6381;
6382; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6383; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6384; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6385; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6386; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6387; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6388; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6389; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6390; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6391; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6392;
6393; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_ret_atomicrmw:
6394; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6395; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6396; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6397; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6398; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6399; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6400; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6401; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6402; GFX940-TGSPLIT-NEXT:    s_endpgm
6403    i32 addrspace(3)* %out, i32 %in) {
6404entry:
6405  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") acq_rel
6406  store i32 %val, i32 addrspace(3)* %out, align 4
6407  ret void
6408}
6409
6410define amdgpu_kernel void @local_singlethread_one_as_seq_cst_ret_atomicrmw(
6411; GFX6-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6412; GFX6:       ; %bb.0: ; %entry
6413; GFX6-NEXT:    s_load_dword s0, s[4:5], 0x0
6414; GFX6-NEXT:    s_load_dword s1, s[4:5], 0x1
6415; GFX6-NEXT:    s_mov_b32 m0, -1
6416; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6417; GFX6-NEXT:    v_mov_b32_e32 v0, s0
6418; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6419; GFX6-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6420; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6421; GFX6-NEXT:    ds_write_b32 v0, v1
6422; GFX6-NEXT:    s_endpgm
6423;
6424; GFX7-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6425; GFX7:       ; %bb.0: ; %entry
6426; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6427; GFX7-NEXT:    s_mov_b32 m0, -1
6428; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6429; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6430; GFX7-NEXT:    v_mov_b32_e32 v1, s1
6431; GFX7-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6432; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6433; GFX7-NEXT:    ds_write_b32 v0, v1
6434; GFX7-NEXT:    s_endpgm
6435;
6436; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6437; GFX10-WGP:       ; %bb.0: ; %entry
6438; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6439; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6440; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6441; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
6442; GFX10-WGP-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6443; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6444; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
6445; GFX10-WGP-NEXT:    s_endpgm
6446;
6447; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6448; GFX10-CU:       ; %bb.0: ; %entry
6449; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6450; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6451; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6452; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
6453; GFX10-CU-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6454; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6455; GFX10-CU-NEXT:    ds_write_b32 v0, v1
6456; GFX10-CU-NEXT:    s_endpgm
6457;
6458; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6459; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6460; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6461; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6462; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6463; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6464; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
6465; SKIP-CACHE-INV-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6466; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6467; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
6468; SKIP-CACHE-INV-NEXT:    s_endpgm
6469;
6470; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6471; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6472; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6473; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6474; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6475; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6476; GFX90A-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6477; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6478; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6479; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6480;
6481; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6482; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6483; GFX90A-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
6484; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6485; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6486; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6487; GFX90A-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6488; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6489; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6490; GFX90A-TGSPLIT-NEXT:    s_endpgm
6491;
6492; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6493; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6494; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6495; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6496; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6497; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6498; GFX940-NOTTGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6499; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6500; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
6501; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6502;
6503; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_ret_atomicrmw:
6504; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6505; GFX940-TGSPLIT-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
6506; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6507; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6508; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s1
6509; GFX940-TGSPLIT-NEXT:    ds_wrxchg_rtn_b32 v1, v0, v1
6510; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6511; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
6512; GFX940-TGSPLIT-NEXT:    s_endpgm
6513    i32 addrspace(3)* %out, i32 %in) {
6514entry:
6515  %val = atomicrmw volatile xchg i32 addrspace(3)* %out, i32 %in syncscope("singlethread-one-as") seq_cst
6516  store i32 %val, i32 addrspace(3)* %out, align 4
6517  ret void
6518}
6519
6520define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_cmpxchg(
6521; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6522; GFX6:       ; %bb.0: ; %entry
6523; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
6524; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
6525; GFX6-NEXT:    s_mov_b32 m0, -1
6526; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6527; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6528; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6529; GFX6-NEXT:    v_mov_b32_e32 v2, s0
6530; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6531; GFX6-NEXT:    s_endpgm
6532;
6533; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6534; GFX7:       ; %bb.0: ; %entry
6535; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6536; GFX7-NEXT:    s_mov_b32 m0, -1
6537; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6538; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6539; GFX7-NEXT:    v_mov_b32_e32 v1, s2
6540; GFX7-NEXT:    v_mov_b32_e32 v2, s1
6541; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6542; GFX7-NEXT:    s_endpgm
6543;
6544; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6545; GFX10-WGP:       ; %bb.0: ; %entry
6546; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6547; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6548; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6549; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
6550; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
6551; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6552; GFX10-WGP-NEXT:    s_endpgm
6553;
6554; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6555; GFX10-CU:       ; %bb.0: ; %entry
6556; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6557; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6558; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6559; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
6560; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
6561; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6562; GFX10-CU-NEXT:    s_endpgm
6563;
6564; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6565; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6566; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6567; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6568; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6569; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6570; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
6571; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
6572; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6573; SKIP-CACHE-INV-NEXT:    s_endpgm
6574;
6575; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6576; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6577; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6578; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6579; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6580; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6581; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6582; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6583; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6584;
6585; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6586; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6587; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6588; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6589; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6590; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6591; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6592; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6593; GFX90A-TGSPLIT-NEXT:    s_endpgm
6594;
6595; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6596; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6597; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6598; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6599; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6600; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6601; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6602; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6603; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6604;
6605; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_cmpxchg:
6606; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6607; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6608; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6609; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6610; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6611; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6612; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6613; GFX940-TGSPLIT-NEXT:    s_endpgm
6614    i32 addrspace(3)* %out, i32 %in, i32 %old) {
6615entry:
6616  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
6617  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic
6618  ret void
6619}
6620
6621define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_cmpxchg(
6622; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6623; GFX6:       ; %bb.0: ; %entry
6624; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
6625; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
6626; GFX6-NEXT:    s_mov_b32 m0, -1
6627; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6628; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6629; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6630; GFX6-NEXT:    v_mov_b32_e32 v2, s0
6631; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6632; GFX6-NEXT:    s_endpgm
6633;
6634; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6635; GFX7:       ; %bb.0: ; %entry
6636; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6637; GFX7-NEXT:    s_mov_b32 m0, -1
6638; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6639; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6640; GFX7-NEXT:    v_mov_b32_e32 v1, s2
6641; GFX7-NEXT:    v_mov_b32_e32 v2, s1
6642; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6643; GFX7-NEXT:    s_endpgm
6644;
6645; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6646; GFX10-WGP:       ; %bb.0: ; %entry
6647; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6648; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6649; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6650; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
6651; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
6652; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6653; GFX10-WGP-NEXT:    s_endpgm
6654;
6655; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6656; GFX10-CU:       ; %bb.0: ; %entry
6657; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6658; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6659; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6660; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
6661; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
6662; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6663; GFX10-CU-NEXT:    s_endpgm
6664;
6665; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6666; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6667; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6668; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6669; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6670; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6671; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
6672; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
6673; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6674; SKIP-CACHE-INV-NEXT:    s_endpgm
6675;
6676; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6677; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6678; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6679; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6680; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6681; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6682; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6683; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6684; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6685;
6686; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6687; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6688; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6689; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6690; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6691; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6692; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6693; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6694; GFX90A-TGSPLIT-NEXT:    s_endpgm
6695;
6696; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6697; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6698; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6699; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6700; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6701; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6702; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6703; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6704; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6705;
6706; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_cmpxchg:
6707; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6708; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6709; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6710; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6711; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6712; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6713; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6714; GFX940-TGSPLIT-NEXT:    s_endpgm
6715    i32 addrspace(3)* %out, i32 %in, i32 %old) {
6716entry:
6717  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
6718  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic
6719  ret void
6720}
6721
6722define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_cmpxchg(
6723; GFX6-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6724; GFX6:       ; %bb.0: ; %entry
6725; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
6726; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
6727; GFX6-NEXT:    s_mov_b32 m0, -1
6728; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6729; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6730; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6731; GFX6-NEXT:    v_mov_b32_e32 v2, s0
6732; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6733; GFX6-NEXT:    s_endpgm
6734;
6735; GFX7-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6736; GFX7:       ; %bb.0: ; %entry
6737; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6738; GFX7-NEXT:    s_mov_b32 m0, -1
6739; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6740; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6741; GFX7-NEXT:    v_mov_b32_e32 v1, s2
6742; GFX7-NEXT:    v_mov_b32_e32 v2, s1
6743; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6744; GFX7-NEXT:    s_endpgm
6745;
6746; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6747; GFX10-WGP:       ; %bb.0: ; %entry
6748; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6749; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6750; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6751; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
6752; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
6753; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6754; GFX10-WGP-NEXT:    s_endpgm
6755;
6756; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6757; GFX10-CU:       ; %bb.0: ; %entry
6758; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6759; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6760; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6761; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
6762; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
6763; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6764; GFX10-CU-NEXT:    s_endpgm
6765;
6766; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6767; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6768; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6769; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6770; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6771; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6772; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
6773; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
6774; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6775; SKIP-CACHE-INV-NEXT:    s_endpgm
6776;
6777; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6778; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6779; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6780; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6781; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6782; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6783; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6784; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6785; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6786;
6787; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6788; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6789; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6790; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6791; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6792; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6793; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6794; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6795; GFX90A-TGSPLIT-NEXT:    s_endpgm
6796;
6797; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6798; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6799; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6800; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6801; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6802; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6803; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6804; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6805; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6806;
6807; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_cmpxchg:
6808; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6809; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6810; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6811; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6812; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6813; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6814; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6815; GFX940-TGSPLIT-NEXT:    s_endpgm
6816    i32 addrspace(3)* %out, i32 %in, i32 %old) {
6817entry:
6818  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
6819  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic
6820  ret void
6821}
6822
6823define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_cmpxchg(
6824; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6825; GFX6:       ; %bb.0: ; %entry
6826; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
6827; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
6828; GFX6-NEXT:    s_mov_b32 m0, -1
6829; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6830; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6831; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6832; GFX6-NEXT:    v_mov_b32_e32 v2, s0
6833; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6834; GFX6-NEXT:    s_endpgm
6835;
6836; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6837; GFX7:       ; %bb.0: ; %entry
6838; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6839; GFX7-NEXT:    s_mov_b32 m0, -1
6840; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6841; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6842; GFX7-NEXT:    v_mov_b32_e32 v1, s2
6843; GFX7-NEXT:    v_mov_b32_e32 v2, s1
6844; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6845; GFX7-NEXT:    s_endpgm
6846;
6847; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6848; GFX10-WGP:       ; %bb.0: ; %entry
6849; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6850; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6851; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6852; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
6853; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
6854; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6855; GFX10-WGP-NEXT:    s_endpgm
6856;
6857; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6858; GFX10-CU:       ; %bb.0: ; %entry
6859; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6860; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6861; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6862; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
6863; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
6864; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6865; GFX10-CU-NEXT:    s_endpgm
6866;
6867; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6868; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6869; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6870; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6871; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6872; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6873; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
6874; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
6875; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6876; SKIP-CACHE-INV-NEXT:    s_endpgm
6877;
6878; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6879; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6880; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6881; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6882; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6883; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6884; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6885; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6886; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6887;
6888; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6889; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6890; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6891; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6892; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6893; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6894; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6895; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6896; GFX90A-TGSPLIT-NEXT:    s_endpgm
6897;
6898; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6899; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
6900; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6901; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6902; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6903; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6904; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6905; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6906; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
6907;
6908; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_cmpxchg:
6909; GFX940-TGSPLIT:       ; %bb.0: ; %entry
6910; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6911; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6912; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6913; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6914; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6915; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6916; GFX940-TGSPLIT-NEXT:    s_endpgm
6917    i32 addrspace(3)* %out, i32 %in, i32 %old) {
6918entry:
6919  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
6920  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic
6921  ret void
6922}
6923
6924define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_cmpxchg(
6925; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6926; GFX6:       ; %bb.0: ; %entry
6927; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
6928; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
6929; GFX6-NEXT:    s_mov_b32 m0, -1
6930; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
6931; GFX6-NEXT:    v_mov_b32_e32 v0, s2
6932; GFX6-NEXT:    v_mov_b32_e32 v1, s1
6933; GFX6-NEXT:    v_mov_b32_e32 v2, s0
6934; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6935; GFX6-NEXT:    s_endpgm
6936;
6937; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6938; GFX7:       ; %bb.0: ; %entry
6939; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6940; GFX7-NEXT:    s_mov_b32 m0, -1
6941; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
6942; GFX7-NEXT:    v_mov_b32_e32 v0, s0
6943; GFX7-NEXT:    v_mov_b32_e32 v1, s2
6944; GFX7-NEXT:    v_mov_b32_e32 v2, s1
6945; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6946; GFX7-NEXT:    s_endpgm
6947;
6948; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6949; GFX10-WGP:       ; %bb.0: ; %entry
6950; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6951; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
6952; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
6953; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
6954; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
6955; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6956; GFX10-WGP-NEXT:    s_endpgm
6957;
6958; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6959; GFX10-CU:       ; %bb.0: ; %entry
6960; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6961; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
6962; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
6963; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
6964; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
6965; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6966; GFX10-CU-NEXT:    s_endpgm
6967;
6968; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6969; SKIP-CACHE-INV:       ; %bb.0: ; %entry
6970; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
6971; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
6972; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
6973; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
6974; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
6975; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
6976; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6977; SKIP-CACHE-INV-NEXT:    s_endpgm
6978;
6979; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6980; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
6981; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6982; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6983; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6984; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6985; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6986; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6987; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
6988;
6989; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
6990; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
6991; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
6992; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
6993; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
6994; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
6995; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
6996; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
6997; GFX90A-TGSPLIT-NEXT:    s_endpgm
6998;
6999; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
7000; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7001; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7002; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7003; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7004; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7005; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7006; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7007; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7008;
7009; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_cmpxchg:
7010; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7011; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7012; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7013; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7014; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7015; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7016; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7017; GFX940-TGSPLIT-NEXT:    s_endpgm
7018    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7019entry:
7020  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7021  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic
7022  ret void
7023}
7024
7025define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_cmpxchg(
7026; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7027; GFX6:       ; %bb.0: ; %entry
7028; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7029; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7030; GFX6-NEXT:    s_mov_b32 m0, -1
7031; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7032; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7033; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7034; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7035; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7036; GFX6-NEXT:    s_endpgm
7037;
7038; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7039; GFX7:       ; %bb.0: ; %entry
7040; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7041; GFX7-NEXT:    s_mov_b32 m0, -1
7042; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7043; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7044; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7045; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7046; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7047; GFX7-NEXT:    s_endpgm
7048;
7049; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7050; GFX10-WGP:       ; %bb.0: ; %entry
7051; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7052; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7053; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7054; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7055; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7056; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7057; GFX10-WGP-NEXT:    s_endpgm
7058;
7059; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7060; GFX10-CU:       ; %bb.0: ; %entry
7061; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7062; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7063; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7064; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7065; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7066; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7067; GFX10-CU-NEXT:    s_endpgm
7068;
7069; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7070; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7071; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7072; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7073; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7074; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7075; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7076; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7077; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7078; SKIP-CACHE-INV-NEXT:    s_endpgm
7079;
7080; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7081; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7082; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7083; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7084; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7085; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7086; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7087; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7088; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7089;
7090; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7091; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7092; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7093; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7094; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7095; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7096; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7097; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7098; GFX90A-TGSPLIT-NEXT:    s_endpgm
7099;
7100; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7101; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7102; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7103; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7104; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7105; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7106; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7107; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7108; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7109;
7110; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_cmpxchg:
7111; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7112; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7113; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7114; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7115; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7116; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7117; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7118; GFX940-TGSPLIT-NEXT:    s_endpgm
7119    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7120entry:
7121  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7122  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire
7123  ret void
7124}
7125
7126define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_cmpxchg(
7127; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7128; GFX6:       ; %bb.0: ; %entry
7129; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7130; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7131; GFX6-NEXT:    s_mov_b32 m0, -1
7132; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7133; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7134; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7135; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7136; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7137; GFX6-NEXT:    s_endpgm
7138;
7139; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7140; GFX7:       ; %bb.0: ; %entry
7141; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7142; GFX7-NEXT:    s_mov_b32 m0, -1
7143; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7144; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7145; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7146; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7147; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7148; GFX7-NEXT:    s_endpgm
7149;
7150; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7151; GFX10-WGP:       ; %bb.0: ; %entry
7152; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7153; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7154; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7155; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7156; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7157; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7158; GFX10-WGP-NEXT:    s_endpgm
7159;
7160; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7161; GFX10-CU:       ; %bb.0: ; %entry
7162; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7163; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7164; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7165; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7166; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7167; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7168; GFX10-CU-NEXT:    s_endpgm
7169;
7170; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7171; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7172; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7173; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7174; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7175; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7176; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7177; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7178; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7179; SKIP-CACHE-INV-NEXT:    s_endpgm
7180;
7181; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7182; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7183; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7184; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7185; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7186; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7187; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7188; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7189; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7190;
7191; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7192; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7193; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7194; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7195; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7196; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7197; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7198; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7199; GFX90A-TGSPLIT-NEXT:    s_endpgm
7200;
7201; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7202; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7203; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7204; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7205; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7206; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7207; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7208; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7209; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7210;
7211; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_cmpxchg:
7212; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7213; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7214; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7215; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7216; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7217; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7218; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7219; GFX940-TGSPLIT-NEXT:    s_endpgm
7220    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7221entry:
7222  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7223  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire
7224  ret void
7225}
7226
7227define amdgpu_kernel void @local_singlethread_one_as_release_acquire_cmpxchg(
7228; GFX6-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7229; GFX6:       ; %bb.0: ; %entry
7230; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7231; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7232; GFX6-NEXT:    s_mov_b32 m0, -1
7233; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7234; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7235; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7236; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7237; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7238; GFX6-NEXT:    s_endpgm
7239;
7240; GFX7-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7241; GFX7:       ; %bb.0: ; %entry
7242; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7243; GFX7-NEXT:    s_mov_b32 m0, -1
7244; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7245; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7246; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7247; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7248; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7249; GFX7-NEXT:    s_endpgm
7250;
7251; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7252; GFX10-WGP:       ; %bb.0: ; %entry
7253; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7254; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7255; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7256; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7257; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7258; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7259; GFX10-WGP-NEXT:    s_endpgm
7260;
7261; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7262; GFX10-CU:       ; %bb.0: ; %entry
7263; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7264; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7265; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7266; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7267; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7268; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7269; GFX10-CU-NEXT:    s_endpgm
7270;
7271; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7272; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7273; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7274; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7275; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7276; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7277; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7278; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7279; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7280; SKIP-CACHE-INV-NEXT:    s_endpgm
7281;
7282; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7283; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7284; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7285; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7286; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7287; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7288; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7289; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7290; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7291;
7292; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7293; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7294; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7295; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7296; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7297; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7298; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7299; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7300; GFX90A-TGSPLIT-NEXT:    s_endpgm
7301;
7302; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7303; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7304; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7305; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7306; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7307; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7308; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7309; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7310; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7311;
7312; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_cmpxchg:
7313; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7314; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7315; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7316; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7317; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7318; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7319; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7320; GFX940-TGSPLIT-NEXT:    s_endpgm
7321    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7322entry:
7323  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7324  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire
7325  ret void
7326}
7327
7328define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_cmpxchg(
7329; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7330; GFX6:       ; %bb.0: ; %entry
7331; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7332; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7333; GFX6-NEXT:    s_mov_b32 m0, -1
7334; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7335; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7336; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7337; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7338; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7339; GFX6-NEXT:    s_endpgm
7340;
7341; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7342; GFX7:       ; %bb.0: ; %entry
7343; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7344; GFX7-NEXT:    s_mov_b32 m0, -1
7345; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7346; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7347; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7348; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7349; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7350; GFX7-NEXT:    s_endpgm
7351;
7352; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7353; GFX10-WGP:       ; %bb.0: ; %entry
7354; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7355; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7356; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7357; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7358; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7359; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7360; GFX10-WGP-NEXT:    s_endpgm
7361;
7362; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7363; GFX10-CU:       ; %bb.0: ; %entry
7364; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7365; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7366; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7367; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7368; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7369; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7370; GFX10-CU-NEXT:    s_endpgm
7371;
7372; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7373; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7374; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7375; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7376; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7377; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7378; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7379; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7380; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7381; SKIP-CACHE-INV-NEXT:    s_endpgm
7382;
7383; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7384; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7385; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7386; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7387; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7388; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7389; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7390; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7391; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7392;
7393; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7394; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7395; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7396; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7397; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7398; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7399; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7400; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7401; GFX90A-TGSPLIT-NEXT:    s_endpgm
7402;
7403; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7404; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7405; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7406; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7407; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7408; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7409; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7410; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7411; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7412;
7413; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_cmpxchg:
7414; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7415; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7416; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7417; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7418; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7419; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7420; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7421; GFX940-TGSPLIT-NEXT:    s_endpgm
7422    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7423entry:
7424  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7425  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire
7426  ret void
7427}
7428
7429define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_cmpxchg(
7430; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7431; GFX6:       ; %bb.0: ; %entry
7432; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7433; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7434; GFX6-NEXT:    s_mov_b32 m0, -1
7435; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7436; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7437; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7438; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7439; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7440; GFX6-NEXT:    s_endpgm
7441;
7442; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7443; GFX7:       ; %bb.0: ; %entry
7444; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7445; GFX7-NEXT:    s_mov_b32 m0, -1
7446; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7447; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7448; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7449; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7450; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7451; GFX7-NEXT:    s_endpgm
7452;
7453; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7454; GFX10-WGP:       ; %bb.0: ; %entry
7455; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7456; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7457; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7458; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7459; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7460; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7461; GFX10-WGP-NEXT:    s_endpgm
7462;
7463; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7464; GFX10-CU:       ; %bb.0: ; %entry
7465; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7466; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7467; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7468; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7469; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7470; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7471; GFX10-CU-NEXT:    s_endpgm
7472;
7473; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7474; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7475; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7476; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7477; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7478; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7479; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7480; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7481; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7482; SKIP-CACHE-INV-NEXT:    s_endpgm
7483;
7484; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7485; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7486; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7487; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7488; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7489; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7490; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7491; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7492; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7493;
7494; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7495; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7496; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7497; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7498; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7499; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7500; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7501; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7502; GFX90A-TGSPLIT-NEXT:    s_endpgm
7503;
7504; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7505; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7506; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7507; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7508; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7509; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7510; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7511; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7512; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7513;
7514; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_cmpxchg:
7515; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7516; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7517; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7518; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7519; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7520; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7521; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7522; GFX940-TGSPLIT-NEXT:    s_endpgm
7523    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7524entry:
7525  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7526  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire
7527  ret void
7528}
7529
7530define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_cmpxchg(
7531; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7532; GFX6:       ; %bb.0: ; %entry
7533; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7534; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7535; GFX6-NEXT:    s_mov_b32 m0, -1
7536; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7537; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7538; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7539; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7540; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7541; GFX6-NEXT:    s_endpgm
7542;
7543; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7544; GFX7:       ; %bb.0: ; %entry
7545; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7546; GFX7-NEXT:    s_mov_b32 m0, -1
7547; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7548; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7549; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7550; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7551; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7552; GFX7-NEXT:    s_endpgm
7553;
7554; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7555; GFX10-WGP:       ; %bb.0: ; %entry
7556; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7557; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7558; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7559; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7560; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7561; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7562; GFX10-WGP-NEXT:    s_endpgm
7563;
7564; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7565; GFX10-CU:       ; %bb.0: ; %entry
7566; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7567; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7568; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7569; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7570; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7571; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7572; GFX10-CU-NEXT:    s_endpgm
7573;
7574; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7575; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7576; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7577; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7578; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7579; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7580; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7581; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7582; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7583; SKIP-CACHE-INV-NEXT:    s_endpgm
7584;
7585; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7586; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7587; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7588; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7589; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7590; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7591; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7592; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7593; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7594;
7595; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7596; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7597; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7598; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7599; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7600; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7601; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7602; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7603; GFX90A-TGSPLIT-NEXT:    s_endpgm
7604;
7605; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7606; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7607; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7608; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7609; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7610; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7611; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7612; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7613; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7614;
7615; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_cmpxchg:
7616; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7617; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7618; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7619; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7620; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7621; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7622; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7623; GFX940-TGSPLIT-NEXT:    s_endpgm
7624    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7625entry:
7626  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7627  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst
7628  ret void
7629}
7630
7631define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_cmpxchg(
7632; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7633; GFX6:       ; %bb.0: ; %entry
7634; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7635; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7636; GFX6-NEXT:    s_mov_b32 m0, -1
7637; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7638; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7639; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7640; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7641; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7642; GFX6-NEXT:    s_endpgm
7643;
7644; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7645; GFX7:       ; %bb.0: ; %entry
7646; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7647; GFX7-NEXT:    s_mov_b32 m0, -1
7648; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7649; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7650; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7651; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7652; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7653; GFX7-NEXT:    s_endpgm
7654;
7655; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7656; GFX10-WGP:       ; %bb.0: ; %entry
7657; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7658; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7659; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7660; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7661; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7662; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7663; GFX10-WGP-NEXT:    s_endpgm
7664;
7665; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7666; GFX10-CU:       ; %bb.0: ; %entry
7667; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7668; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7669; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7670; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7671; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7672; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7673; GFX10-CU-NEXT:    s_endpgm
7674;
7675; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7676; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7677; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7678; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7679; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7680; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7681; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7682; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7683; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7684; SKIP-CACHE-INV-NEXT:    s_endpgm
7685;
7686; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7687; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7688; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7689; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7690; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7691; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7692; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7693; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7694; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7695;
7696; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7697; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7698; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7699; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7700; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7701; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7702; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7703; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7704; GFX90A-TGSPLIT-NEXT:    s_endpgm
7705;
7706; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7707; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7708; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7709; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7710; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7711; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7712; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7713; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7714; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7715;
7716; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_cmpxchg:
7717; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7718; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7719; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7720; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7721; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7722; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7723; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7724; GFX940-TGSPLIT-NEXT:    s_endpgm
7725    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7726entry:
7727  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7728  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst
7729  ret void
7730}
7731
7732define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_cmpxchg(
7733; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7734; GFX6:       ; %bb.0: ; %entry
7735; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7736; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7737; GFX6-NEXT:    s_mov_b32 m0, -1
7738; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7739; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7740; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7741; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7742; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7743; GFX6-NEXT:    s_endpgm
7744;
7745; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7746; GFX7:       ; %bb.0: ; %entry
7747; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7748; GFX7-NEXT:    s_mov_b32 m0, -1
7749; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7750; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7751; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7752; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7753; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7754; GFX7-NEXT:    s_endpgm
7755;
7756; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7757; GFX10-WGP:       ; %bb.0: ; %entry
7758; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7759; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7760; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7761; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7762; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7763; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7764; GFX10-WGP-NEXT:    s_endpgm
7765;
7766; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7767; GFX10-CU:       ; %bb.0: ; %entry
7768; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7769; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7770; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7771; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7772; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7773; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7774; GFX10-CU-NEXT:    s_endpgm
7775;
7776; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7777; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7778; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7779; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7780; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7781; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7782; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7783; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7784; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7785; SKIP-CACHE-INV-NEXT:    s_endpgm
7786;
7787; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7788; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7789; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7790; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7791; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7792; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7793; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7794; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7795; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7796;
7797; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7798; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7799; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7800; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7801; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7802; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7803; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7804; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7805; GFX90A-TGSPLIT-NEXT:    s_endpgm
7806;
7807; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7808; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7809; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7810; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7811; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7812; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7813; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7814; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7815; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7816;
7817; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_cmpxchg:
7818; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7819; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7820; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7821; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7822; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7823; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7824; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7825; GFX940-TGSPLIT-NEXT:    s_endpgm
7826    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7827entry:
7828  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7829  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst
7830  ret void
7831}
7832
7833define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_cmpxchg(
7834; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7835; GFX6:       ; %bb.0: ; %entry
7836; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7837; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7838; GFX6-NEXT:    s_mov_b32 m0, -1
7839; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7840; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7841; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7842; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7843; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7844; GFX6-NEXT:    s_endpgm
7845;
7846; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7847; GFX7:       ; %bb.0: ; %entry
7848; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7849; GFX7-NEXT:    s_mov_b32 m0, -1
7850; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7851; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7852; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7853; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7854; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7855; GFX7-NEXT:    s_endpgm
7856;
7857; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7858; GFX10-WGP:       ; %bb.0: ; %entry
7859; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7860; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7861; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7862; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7863; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7864; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7865; GFX10-WGP-NEXT:    s_endpgm
7866;
7867; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7868; GFX10-CU:       ; %bb.0: ; %entry
7869; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7870; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7871; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7872; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7873; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7874; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7875; GFX10-CU-NEXT:    s_endpgm
7876;
7877; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7878; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7879; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7880; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7881; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7882; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7883; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7884; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7885; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7886; SKIP-CACHE-INV-NEXT:    s_endpgm
7887;
7888; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7889; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7890; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7891; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7892; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7893; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7894; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7895; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7896; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7897;
7898; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7899; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
7900; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7901; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7902; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7903; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7904; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7905; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7906; GFX90A-TGSPLIT-NEXT:    s_endpgm
7907;
7908; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7909; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
7910; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7911; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7912; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7913; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7914; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7915; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7916; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
7917;
7918; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_cmpxchg:
7919; GFX940-TGSPLIT:       ; %bb.0: ; %entry
7920; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7921; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7922; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7923; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7924; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7925; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7926; GFX940-TGSPLIT-NEXT:    s_endpgm
7927    i32 addrspace(3)* %out, i32 %in, i32 %old) {
7928entry:
7929  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
7930  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst
7931  ret void
7932}
7933
7934define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_cmpxchg(
7935; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7936; GFX6:       ; %bb.0: ; %entry
7937; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
7938; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
7939; GFX6-NEXT:    s_mov_b32 m0, -1
7940; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
7941; GFX6-NEXT:    v_mov_b32_e32 v0, s2
7942; GFX6-NEXT:    v_mov_b32_e32 v1, s1
7943; GFX6-NEXT:    v_mov_b32_e32 v2, s0
7944; GFX6-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7945; GFX6-NEXT:    s_endpgm
7946;
7947; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7948; GFX7:       ; %bb.0: ; %entry
7949; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7950; GFX7-NEXT:    s_mov_b32 m0, -1
7951; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
7952; GFX7-NEXT:    v_mov_b32_e32 v0, s0
7953; GFX7-NEXT:    v_mov_b32_e32 v1, s2
7954; GFX7-NEXT:    v_mov_b32_e32 v2, s1
7955; GFX7-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7956; GFX7-NEXT:    s_endpgm
7957;
7958; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7959; GFX10-WGP:       ; %bb.0: ; %entry
7960; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7961; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
7962; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
7963; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
7964; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
7965; GFX10-WGP-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7966; GFX10-WGP-NEXT:    s_endpgm
7967;
7968; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7969; GFX10-CU:       ; %bb.0: ; %entry
7970; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7971; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
7972; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
7973; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
7974; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
7975; GFX10-CU-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7976; GFX10-CU-NEXT:    s_endpgm
7977;
7978; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7979; SKIP-CACHE-INV:       ; %bb.0: ; %entry
7980; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
7981; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
7982; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
7983; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
7984; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
7985; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
7986; SKIP-CACHE-INV-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7987; SKIP-CACHE-INV-NEXT:    s_endpgm
7988;
7989; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
7990; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
7991; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
7992; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
7993; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
7994; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
7995; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
7996; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
7997; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
7998;
7999; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
8000; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8001; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8002; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8003; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8004; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8005; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8006; GFX90A-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
8007; GFX90A-TGSPLIT-NEXT:    s_endpgm
8008;
8009; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
8010; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8011; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8012; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8013; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8014; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8015; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8016; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
8017; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8018;
8019; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_cmpxchg:
8020; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8021; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8022; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8023; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8024; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8025; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8026; GFX940-TGSPLIT-NEXT:    ds_cmpst_b32 v0, v1, v2 offset:16
8027; GFX940-TGSPLIT-NEXT:    s_endpgm
8028    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8029entry:
8030  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8031  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst
8032  ret void
8033}
8034
8035define amdgpu_kernel void @local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg(
8036; GFX6-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8037; GFX6:       ; %bb.0: ; %entry
8038; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8039; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8040; GFX6-NEXT:    s_mov_b32 m0, -1
8041; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8042; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8043; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8044; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8045; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8046; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8047; GFX6-NEXT:    ds_write_b32 v0, v1
8048; GFX6-NEXT:    s_endpgm
8049;
8050; GFX7-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8051; GFX7:       ; %bb.0: ; %entry
8052; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8053; GFX7-NEXT:    s_mov_b32 m0, -1
8054; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8055; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8056; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8057; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8058; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8059; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8060; GFX7-NEXT:    ds_write_b32 v0, v1
8061; GFX7-NEXT:    s_endpgm
8062;
8063; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8064; GFX10-WGP:       ; %bb.0: ; %entry
8065; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8066; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8067; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8068; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8069; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8070; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8071; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8072; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8073; GFX10-WGP-NEXT:    s_endpgm
8074;
8075; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8076; GFX10-CU:       ; %bb.0: ; %entry
8077; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8078; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8079; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8080; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8081; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8082; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8083; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8084; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8085; GFX10-CU-NEXT:    s_endpgm
8086;
8087; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8088; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8089; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8090; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8091; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8092; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8093; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8094; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8095; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8096; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8097; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8098; SKIP-CACHE-INV-NEXT:    s_endpgm
8099;
8100; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8101; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8102; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8103; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8104; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8105; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8106; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8107; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8108; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8109; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8110; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8111;
8112; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8113; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8114; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8115; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8116; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8117; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8118; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8119; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8120; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8121; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8122; GFX90A-TGSPLIT-NEXT:    s_endpgm
8123;
8124; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8125; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8126; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8127; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8128; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8129; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8130; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8131; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8132; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8133; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8134; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8135;
8136; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_monotonic_ret_cmpxchg:
8137; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8138; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8139; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8140; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8141; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8142; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8143; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8144; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8145; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8146; GFX940-TGSPLIT-NEXT:    s_endpgm
8147    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8148entry:
8149  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8150  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic monotonic
8151  %val0 = extractvalue { i32, i1 } %val, 0
8152  store i32 %val0, i32 addrspace(3)* %out, align 4
8153  ret void
8154}
8155
8156define amdgpu_kernel void @local_singlethread_one_as_acquire_monotonic_ret_cmpxchg(
8157; GFX6-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8158; GFX6:       ; %bb.0: ; %entry
8159; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8160; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8161; GFX6-NEXT:    s_mov_b32 m0, -1
8162; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8163; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8164; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8165; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8166; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8167; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8168; GFX6-NEXT:    ds_write_b32 v0, v1
8169; GFX6-NEXT:    s_endpgm
8170;
8171; GFX7-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8172; GFX7:       ; %bb.0: ; %entry
8173; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8174; GFX7-NEXT:    s_mov_b32 m0, -1
8175; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8176; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8177; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8178; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8179; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8180; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8181; GFX7-NEXT:    ds_write_b32 v0, v1
8182; GFX7-NEXT:    s_endpgm
8183;
8184; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8185; GFX10-WGP:       ; %bb.0: ; %entry
8186; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8187; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8188; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8189; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8190; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8191; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8192; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8193; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8194; GFX10-WGP-NEXT:    s_endpgm
8195;
8196; GFX10-CU-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8197; GFX10-CU:       ; %bb.0: ; %entry
8198; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8199; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8200; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8201; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8202; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8203; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8204; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8205; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8206; GFX10-CU-NEXT:    s_endpgm
8207;
8208; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8209; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8210; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8211; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8212; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8213; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8214; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8215; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8216; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8217; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8218; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8219; SKIP-CACHE-INV-NEXT:    s_endpgm
8220;
8221; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8222; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8223; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8224; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8225; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8226; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8227; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8228; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8229; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8230; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8231; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8232;
8233; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8234; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8235; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8236; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8237; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8238; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8239; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8240; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8241; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8242; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8243; GFX90A-TGSPLIT-NEXT:    s_endpgm
8244;
8245; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8246; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8247; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8248; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8249; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8250; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8251; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8252; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8253; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8254; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8255; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8256;
8257; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_monotonic_ret_cmpxchg:
8258; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8259; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8260; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8261; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8262; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8263; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8264; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8265; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8266; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8267; GFX940-TGSPLIT-NEXT:    s_endpgm
8268    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8269entry:
8270  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8271  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire monotonic
8272  %val0 = extractvalue { i32, i1 } %val, 0
8273  store i32 %val0, i32 addrspace(3)* %out, align 4
8274  ret void
8275}
8276
8277define amdgpu_kernel void @local_singlethread_one_as_release_monotonic_ret_cmpxchg(
8278; GFX6-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8279; GFX6:       ; %bb.0: ; %entry
8280; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8281; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8282; GFX6-NEXT:    s_mov_b32 m0, -1
8283; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8284; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8285; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8286; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8287; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8288; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8289; GFX6-NEXT:    ds_write_b32 v0, v1
8290; GFX6-NEXT:    s_endpgm
8291;
8292; GFX7-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8293; GFX7:       ; %bb.0: ; %entry
8294; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8295; GFX7-NEXT:    s_mov_b32 m0, -1
8296; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8297; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8298; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8299; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8300; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8301; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8302; GFX7-NEXT:    ds_write_b32 v0, v1
8303; GFX7-NEXT:    s_endpgm
8304;
8305; GFX10-WGP-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8306; GFX10-WGP:       ; %bb.0: ; %entry
8307; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8308; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8309; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8310; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8311; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8312; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8313; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8314; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8315; GFX10-WGP-NEXT:    s_endpgm
8316;
8317; GFX10-CU-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8318; GFX10-CU:       ; %bb.0: ; %entry
8319; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8320; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8321; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8322; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8323; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8324; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8325; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8326; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8327; GFX10-CU-NEXT:    s_endpgm
8328;
8329; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8330; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8331; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8332; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8333; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8334; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8335; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8336; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8337; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8338; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8339; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8340; SKIP-CACHE-INV-NEXT:    s_endpgm
8341;
8342; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8343; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8344; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8345; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8346; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8347; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8348; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8349; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8350; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8351; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8352; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8353;
8354; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8355; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8356; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8357; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8358; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8359; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8360; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8361; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8362; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8363; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8364; GFX90A-TGSPLIT-NEXT:    s_endpgm
8365;
8366; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8367; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8368; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8369; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8370; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8371; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8372; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8373; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8374; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8375; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8376; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8377;
8378; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_monotonic_ret_cmpxchg:
8379; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8380; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8381; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8382; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8383; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8384; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8385; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8386; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8387; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8388; GFX940-TGSPLIT-NEXT:    s_endpgm
8389    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8390entry:
8391  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8392  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release monotonic
8393  %val0 = extractvalue { i32, i1 } %val, 0
8394  store i32 %val0, i32 addrspace(3)* %out, align 4
8395  ret void
8396}
8397
8398define amdgpu_kernel void @local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg(
8399; GFX6-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8400; GFX6:       ; %bb.0: ; %entry
8401; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8402; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8403; GFX6-NEXT:    s_mov_b32 m0, -1
8404; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8405; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8406; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8407; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8408; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8409; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8410; GFX6-NEXT:    ds_write_b32 v0, v1
8411; GFX6-NEXT:    s_endpgm
8412;
8413; GFX7-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8414; GFX7:       ; %bb.0: ; %entry
8415; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8416; GFX7-NEXT:    s_mov_b32 m0, -1
8417; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8418; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8419; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8420; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8421; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8422; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8423; GFX7-NEXT:    ds_write_b32 v0, v1
8424; GFX7-NEXT:    s_endpgm
8425;
8426; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8427; GFX10-WGP:       ; %bb.0: ; %entry
8428; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8429; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8430; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8431; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8432; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8433; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8434; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8435; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8436; GFX10-WGP-NEXT:    s_endpgm
8437;
8438; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8439; GFX10-CU:       ; %bb.0: ; %entry
8440; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8441; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8442; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8443; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8444; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8445; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8446; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8447; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8448; GFX10-CU-NEXT:    s_endpgm
8449;
8450; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8451; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8452; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8453; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8454; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8455; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8456; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8457; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8458; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8459; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8460; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8461; SKIP-CACHE-INV-NEXT:    s_endpgm
8462;
8463; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8464; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8465; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8466; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8467; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8468; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8469; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8470; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8471; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8472; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8473; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8474;
8475; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8476; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8477; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8478; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8479; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8480; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8481; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8482; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8483; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8484; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8485; GFX90A-TGSPLIT-NEXT:    s_endpgm
8486;
8487; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8488; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8489; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8490; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8491; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8492; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8493; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8494; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8495; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8496; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8497; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8498;
8499; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_monotonic_ret_cmpxchg:
8500; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8501; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8502; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8503; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8504; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8505; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8506; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8507; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8508; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8509; GFX940-TGSPLIT-NEXT:    s_endpgm
8510    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8511entry:
8512  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8513  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel monotonic
8514  %val0 = extractvalue { i32, i1 } %val, 0
8515  store i32 %val0, i32 addrspace(3)* %out, align 4
8516  ret void
8517}
8518
8519define amdgpu_kernel void @local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg(
8520; GFX6-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8521; GFX6:       ; %bb.0: ; %entry
8522; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8523; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8524; GFX6-NEXT:    s_mov_b32 m0, -1
8525; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8526; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8527; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8528; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8529; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8530; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8531; GFX6-NEXT:    ds_write_b32 v0, v1
8532; GFX6-NEXT:    s_endpgm
8533;
8534; GFX7-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8535; GFX7:       ; %bb.0: ; %entry
8536; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8537; GFX7-NEXT:    s_mov_b32 m0, -1
8538; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8539; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8540; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8541; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8542; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8543; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8544; GFX7-NEXT:    ds_write_b32 v0, v1
8545; GFX7-NEXT:    s_endpgm
8546;
8547; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8548; GFX10-WGP:       ; %bb.0: ; %entry
8549; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8550; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8551; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8552; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8553; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8554; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8555; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8556; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8557; GFX10-WGP-NEXT:    s_endpgm
8558;
8559; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8560; GFX10-CU:       ; %bb.0: ; %entry
8561; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8562; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8563; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8564; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8565; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8566; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8567; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8568; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8569; GFX10-CU-NEXT:    s_endpgm
8570;
8571; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8572; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8573; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8574; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8575; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8576; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8577; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8578; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8579; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8580; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8581; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8582; SKIP-CACHE-INV-NEXT:    s_endpgm
8583;
8584; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8585; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8586; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8587; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8588; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8589; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8590; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8591; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8592; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8593; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8594; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8595;
8596; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8597; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8598; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8599; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8600; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8601; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8602; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8603; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8604; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8605; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8606; GFX90A-TGSPLIT-NEXT:    s_endpgm
8607;
8608; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8609; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8610; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8611; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8612; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8613; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8614; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8615; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8616; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8617; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8618; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8619;
8620; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_monotonic_ret_cmpxchg:
8621; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8622; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8623; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8624; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8625; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8626; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8627; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8628; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8629; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8630; GFX940-TGSPLIT-NEXT:    s_endpgm
8631    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8632entry:
8633  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8634  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst monotonic
8635  %val0 = extractvalue { i32, i1 } %val, 0
8636  store i32 %val0, i32 addrspace(3)* %out, align 4
8637  ret void
8638}
8639
8640define amdgpu_kernel void @local_singlethread_one_as_monotonic_acquire_ret_cmpxchg(
8641; GFX6-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8642; GFX6:       ; %bb.0: ; %entry
8643; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8644; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8645; GFX6-NEXT:    s_mov_b32 m0, -1
8646; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8647; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8648; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8649; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8650; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8651; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8652; GFX6-NEXT:    ds_write_b32 v0, v1
8653; GFX6-NEXT:    s_endpgm
8654;
8655; GFX7-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8656; GFX7:       ; %bb.0: ; %entry
8657; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8658; GFX7-NEXT:    s_mov_b32 m0, -1
8659; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8660; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8661; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8662; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8663; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8664; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8665; GFX7-NEXT:    ds_write_b32 v0, v1
8666; GFX7-NEXT:    s_endpgm
8667;
8668; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8669; GFX10-WGP:       ; %bb.0: ; %entry
8670; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8671; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8672; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8673; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8674; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8675; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8676; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8677; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8678; GFX10-WGP-NEXT:    s_endpgm
8679;
8680; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8681; GFX10-CU:       ; %bb.0: ; %entry
8682; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8683; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8684; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8685; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8686; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8687; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8688; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8689; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8690; GFX10-CU-NEXT:    s_endpgm
8691;
8692; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8693; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8694; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8695; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8696; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8697; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8698; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8699; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8700; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8701; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8702; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8703; SKIP-CACHE-INV-NEXT:    s_endpgm
8704;
8705; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8706; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8707; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8708; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8709; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8710; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8711; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8712; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8713; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8714; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8715; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8716;
8717; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8718; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8719; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8720; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8721; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8722; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8723; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8724; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8725; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8726; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8727; GFX90A-TGSPLIT-NEXT:    s_endpgm
8728;
8729; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8730; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8731; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8732; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8733; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8734; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8735; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8736; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8737; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8738; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8739; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8740;
8741; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_acquire_ret_cmpxchg:
8742; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8743; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8744; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8745; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8746; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8747; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8748; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8749; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8750; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8751; GFX940-TGSPLIT-NEXT:    s_endpgm
8752    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8753entry:
8754  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8755  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic acquire
8756  %val0 = extractvalue { i32, i1 } %val, 0
8757  store i32 %val0, i32 addrspace(3)* %out, align 4
8758  ret void
8759}
8760
8761define amdgpu_kernel void @local_singlethread_one_as_acquire_acquire_ret_cmpxchg(
8762; GFX6-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8763; GFX6:       ; %bb.0: ; %entry
8764; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8765; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8766; GFX6-NEXT:    s_mov_b32 m0, -1
8767; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8768; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8769; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8770; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8771; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8772; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8773; GFX6-NEXT:    ds_write_b32 v0, v1
8774; GFX6-NEXT:    s_endpgm
8775;
8776; GFX7-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8777; GFX7:       ; %bb.0: ; %entry
8778; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8779; GFX7-NEXT:    s_mov_b32 m0, -1
8780; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8781; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8782; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8783; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8784; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8785; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8786; GFX7-NEXT:    ds_write_b32 v0, v1
8787; GFX7-NEXT:    s_endpgm
8788;
8789; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8790; GFX10-WGP:       ; %bb.0: ; %entry
8791; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8792; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8793; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8794; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8795; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8796; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8797; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8798; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8799; GFX10-WGP-NEXT:    s_endpgm
8800;
8801; GFX10-CU-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8802; GFX10-CU:       ; %bb.0: ; %entry
8803; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8804; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8805; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8806; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8807; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8808; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8809; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8810; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8811; GFX10-CU-NEXT:    s_endpgm
8812;
8813; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8814; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8815; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8816; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8817; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8818; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8819; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8820; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8821; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8822; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8823; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8824; SKIP-CACHE-INV-NEXT:    s_endpgm
8825;
8826; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8827; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8828; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8829; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8830; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8831; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8832; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8833; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8834; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8835; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8836; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8837;
8838; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8839; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8840; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8841; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8842; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8843; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8844; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8845; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8846; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8847; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8848; GFX90A-TGSPLIT-NEXT:    s_endpgm
8849;
8850; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8851; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8852; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8853; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8854; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8855; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8856; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8857; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8858; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8859; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8860; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8861;
8862; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_acquire_ret_cmpxchg:
8863; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8864; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8865; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8866; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8867; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8868; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8869; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8870; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8871; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8872; GFX940-TGSPLIT-NEXT:    s_endpgm
8873    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8874entry:
8875  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8876  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire acquire
8877  %val0 = extractvalue { i32, i1 } %val, 0
8878  store i32 %val0, i32 addrspace(3)* %out, align 4
8879  ret void
8880}
8881
8882define amdgpu_kernel void @local_singlethread_one_as_release_acquire_ret_cmpxchg(
8883; GFX6-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8884; GFX6:       ; %bb.0: ; %entry
8885; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
8886; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
8887; GFX6-NEXT:    s_mov_b32 m0, -1
8888; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8889; GFX6-NEXT:    v_mov_b32_e32 v0, s2
8890; GFX6-NEXT:    v_mov_b32_e32 v1, s1
8891; GFX6-NEXT:    v_mov_b32_e32 v2, s0
8892; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8893; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
8894; GFX6-NEXT:    ds_write_b32 v0, v1
8895; GFX6-NEXT:    s_endpgm
8896;
8897; GFX7-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8898; GFX7:       ; %bb.0: ; %entry
8899; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8900; GFX7-NEXT:    s_mov_b32 m0, -1
8901; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8902; GFX7-NEXT:    v_mov_b32_e32 v0, s0
8903; GFX7-NEXT:    v_mov_b32_e32 v1, s2
8904; GFX7-NEXT:    v_mov_b32_e32 v2, s1
8905; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8906; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
8907; GFX7-NEXT:    ds_write_b32 v0, v1
8908; GFX7-NEXT:    s_endpgm
8909;
8910; GFX10-WGP-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8911; GFX10-WGP:       ; %bb.0: ; %entry
8912; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8913; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8914; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
8915; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
8916; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
8917; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8918; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
8919; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
8920; GFX10-WGP-NEXT:    s_endpgm
8921;
8922; GFX10-CU-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8923; GFX10-CU:       ; %bb.0: ; %entry
8924; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8925; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8926; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
8927; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
8928; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
8929; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8930; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
8931; GFX10-CU-NEXT:    ds_write_b32 v0, v1
8932; GFX10-CU-NEXT:    s_endpgm
8933;
8934; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8935; SKIP-CACHE-INV:       ; %bb.0: ; %entry
8936; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8937; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
8938; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8939; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
8940; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
8941; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
8942; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8943; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
8944; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
8945; SKIP-CACHE-INV-NEXT:    s_endpgm
8946;
8947; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8948; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
8949; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8950; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8951; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8952; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8953; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8954; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8955; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8956; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8957; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
8958;
8959; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8960; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
8961; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
8962; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8963; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8964; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8965; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8966; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8967; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8968; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8969; GFX90A-TGSPLIT-NEXT:    s_endpgm
8970;
8971; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8972; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
8973; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8974; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8975; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8976; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8977; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8978; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8979; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8980; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
8981; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
8982;
8983; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_acquire_ret_cmpxchg:
8984; GFX940-TGSPLIT:       ; %bb.0: ; %entry
8985; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
8986; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8987; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
8988; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
8989; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
8990; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
8991; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
8992; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
8993; GFX940-TGSPLIT-NEXT:    s_endpgm
8994    i32 addrspace(3)* %out, i32 %in, i32 %old) {
8995entry:
8996  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
8997  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release acquire
8998  %val0 = extractvalue { i32, i1 } %val, 0
8999  store i32 %val0, i32 addrspace(3)* %out, align 4
9000  ret void
9001}
9002
9003define amdgpu_kernel void @local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg(
9004; GFX6-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9005; GFX6:       ; %bb.0: ; %entry
9006; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9007; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9008; GFX6-NEXT:    s_mov_b32 m0, -1
9009; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9010; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9011; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9012; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9013; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9014; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9015; GFX6-NEXT:    ds_write_b32 v0, v1
9016; GFX6-NEXT:    s_endpgm
9017;
9018; GFX7-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9019; GFX7:       ; %bb.0: ; %entry
9020; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9021; GFX7-NEXT:    s_mov_b32 m0, -1
9022; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9023; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9024; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9025; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9026; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9027; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9028; GFX7-NEXT:    ds_write_b32 v0, v1
9029; GFX7-NEXT:    s_endpgm
9030;
9031; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9032; GFX10-WGP:       ; %bb.0: ; %entry
9033; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9034; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9035; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9036; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9037; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9038; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9039; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9040; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9041; GFX10-WGP-NEXT:    s_endpgm
9042;
9043; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9044; GFX10-CU:       ; %bb.0: ; %entry
9045; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9046; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9047; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9048; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9049; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9050; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9051; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9052; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9053; GFX10-CU-NEXT:    s_endpgm
9054;
9055; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9056; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9057; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9058; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9059; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9060; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9061; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9062; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9063; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9064; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9065; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9066; SKIP-CACHE-INV-NEXT:    s_endpgm
9067;
9068; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9069; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9070; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9071; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9072; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9073; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9074; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9075; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9076; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9077; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9078; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9079;
9080; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9081; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9082; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9083; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9084; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9085; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9086; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9087; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9088; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9089; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9090; GFX90A-TGSPLIT-NEXT:    s_endpgm
9091;
9092; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9093; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9094; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9095; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9096; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9097; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9098; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9099; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9100; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9101; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9102; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9103;
9104; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_acquire_ret_cmpxchg:
9105; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9106; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9107; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9108; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9109; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9110; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9111; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9112; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9113; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9114; GFX940-TGSPLIT-NEXT:    s_endpgm
9115    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9116entry:
9117  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9118  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel acquire
9119  %val0 = extractvalue { i32, i1 } %val, 0
9120  store i32 %val0, i32 addrspace(3)* %out, align 4
9121  ret void
9122}
9123
9124define amdgpu_kernel void @local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg(
9125; GFX6-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9126; GFX6:       ; %bb.0: ; %entry
9127; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9128; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9129; GFX6-NEXT:    s_mov_b32 m0, -1
9130; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9131; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9132; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9133; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9134; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9135; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9136; GFX6-NEXT:    ds_write_b32 v0, v1
9137; GFX6-NEXT:    s_endpgm
9138;
9139; GFX7-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9140; GFX7:       ; %bb.0: ; %entry
9141; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9142; GFX7-NEXT:    s_mov_b32 m0, -1
9143; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9144; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9145; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9146; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9147; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9148; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9149; GFX7-NEXT:    ds_write_b32 v0, v1
9150; GFX7-NEXT:    s_endpgm
9151;
9152; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9153; GFX10-WGP:       ; %bb.0: ; %entry
9154; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9155; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9156; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9157; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9158; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9159; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9160; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9161; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9162; GFX10-WGP-NEXT:    s_endpgm
9163;
9164; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9165; GFX10-CU:       ; %bb.0: ; %entry
9166; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9167; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9168; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9169; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9170; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9171; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9172; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9173; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9174; GFX10-CU-NEXT:    s_endpgm
9175;
9176; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9177; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9178; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9179; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9180; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9181; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9182; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9183; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9184; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9185; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9186; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9187; SKIP-CACHE-INV-NEXT:    s_endpgm
9188;
9189; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9190; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9191; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9192; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9193; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9194; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9195; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9196; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9197; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9198; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9199; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9200;
9201; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9202; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9203; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9204; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9205; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9206; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9207; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9208; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9209; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9210; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9211; GFX90A-TGSPLIT-NEXT:    s_endpgm
9212;
9213; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9214; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9215; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9216; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9217; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9218; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9219; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9220; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9221; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9222; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9223; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9224;
9225; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_acquire_ret_cmpxchg:
9226; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9227; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9228; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9229; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9230; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9231; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9232; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9233; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9234; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9235; GFX940-TGSPLIT-NEXT:    s_endpgm
9236    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9237entry:
9238  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9239  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst acquire
9240  %val0 = extractvalue { i32, i1 } %val, 0
9241  store i32 %val0, i32 addrspace(3)* %out, align 4
9242  ret void
9243}
9244
9245define amdgpu_kernel void @local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg(
9246; GFX6-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9247; GFX6:       ; %bb.0: ; %entry
9248; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9249; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9250; GFX6-NEXT:    s_mov_b32 m0, -1
9251; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9252; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9253; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9254; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9255; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9256; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9257; GFX6-NEXT:    ds_write_b32 v0, v1
9258; GFX6-NEXT:    s_endpgm
9259;
9260; GFX7-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9261; GFX7:       ; %bb.0: ; %entry
9262; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9263; GFX7-NEXT:    s_mov_b32 m0, -1
9264; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9265; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9266; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9267; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9268; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9269; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9270; GFX7-NEXT:    ds_write_b32 v0, v1
9271; GFX7-NEXT:    s_endpgm
9272;
9273; GFX10-WGP-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9274; GFX10-WGP:       ; %bb.0: ; %entry
9275; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9276; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9277; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9278; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9279; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9280; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9281; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9282; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9283; GFX10-WGP-NEXT:    s_endpgm
9284;
9285; GFX10-CU-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9286; GFX10-CU:       ; %bb.0: ; %entry
9287; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9288; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9289; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9290; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9291; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9292; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9293; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9294; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9295; GFX10-CU-NEXT:    s_endpgm
9296;
9297; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9298; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9299; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9300; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9301; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9302; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9303; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9304; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9305; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9306; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9307; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9308; SKIP-CACHE-INV-NEXT:    s_endpgm
9309;
9310; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9311; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9312; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9313; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9314; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9315; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9316; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9317; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9318; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9319; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9320; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9321;
9322; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9323; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9324; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9325; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9326; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9327; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9328; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9329; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9330; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9331; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9332; GFX90A-TGSPLIT-NEXT:    s_endpgm
9333;
9334; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9335; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9336; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9337; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9338; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9339; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9340; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9341; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9342; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9343; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9344; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9345;
9346; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_monotonic_seq_cst_ret_cmpxchg:
9347; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9348; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9349; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9350; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9351; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9352; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9353; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9354; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9355; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9356; GFX940-TGSPLIT-NEXT:    s_endpgm
9357    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9358entry:
9359  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9360  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") monotonic seq_cst
9361  %val0 = extractvalue { i32, i1 } %val, 0
9362  store i32 %val0, i32 addrspace(3)* %out, align 4
9363  ret void
9364}
9365
9366define amdgpu_kernel void @local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg(
9367; GFX6-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9368; GFX6:       ; %bb.0: ; %entry
9369; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9370; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9371; GFX6-NEXT:    s_mov_b32 m0, -1
9372; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9373; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9374; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9375; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9376; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9377; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9378; GFX6-NEXT:    ds_write_b32 v0, v1
9379; GFX6-NEXT:    s_endpgm
9380;
9381; GFX7-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9382; GFX7:       ; %bb.0: ; %entry
9383; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9384; GFX7-NEXT:    s_mov_b32 m0, -1
9385; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9386; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9387; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9388; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9389; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9390; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9391; GFX7-NEXT:    ds_write_b32 v0, v1
9392; GFX7-NEXT:    s_endpgm
9393;
9394; GFX10-WGP-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9395; GFX10-WGP:       ; %bb.0: ; %entry
9396; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9397; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9398; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9399; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9400; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9401; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9402; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9403; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9404; GFX10-WGP-NEXT:    s_endpgm
9405;
9406; GFX10-CU-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9407; GFX10-CU:       ; %bb.0: ; %entry
9408; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9409; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9410; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9411; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9412; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9413; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9414; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9415; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9416; GFX10-CU-NEXT:    s_endpgm
9417;
9418; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9419; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9420; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9421; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9422; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9423; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9424; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9425; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9426; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9427; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9428; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9429; SKIP-CACHE-INV-NEXT:    s_endpgm
9430;
9431; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9432; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9433; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9434; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9435; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9436; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9437; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9438; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9439; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9440; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9441; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9442;
9443; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9444; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9445; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9446; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9447; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9448; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9449; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9450; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9451; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9452; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9453; GFX90A-TGSPLIT-NEXT:    s_endpgm
9454;
9455; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9456; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9457; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9458; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9459; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9460; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9461; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9462; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9463; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9464; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9465; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9466;
9467; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acquire_seq_cst_ret_cmpxchg:
9468; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9469; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9470; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9471; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9472; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9473; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9474; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9475; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9476; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9477; GFX940-TGSPLIT-NEXT:    s_endpgm
9478    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9479entry:
9480  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9481  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acquire seq_cst
9482  %val0 = extractvalue { i32, i1 } %val, 0
9483  store i32 %val0, i32 addrspace(3)* %out, align 4
9484  ret void
9485}
9486
9487define amdgpu_kernel void @local_singlethread_one_as_release_seq_cst_ret_cmpxchg(
9488; GFX6-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9489; GFX6:       ; %bb.0: ; %entry
9490; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9491; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9492; GFX6-NEXT:    s_mov_b32 m0, -1
9493; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9494; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9495; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9496; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9497; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9498; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9499; GFX6-NEXT:    ds_write_b32 v0, v1
9500; GFX6-NEXT:    s_endpgm
9501;
9502; GFX7-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9503; GFX7:       ; %bb.0: ; %entry
9504; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9505; GFX7-NEXT:    s_mov_b32 m0, -1
9506; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9507; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9508; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9509; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9510; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9511; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9512; GFX7-NEXT:    ds_write_b32 v0, v1
9513; GFX7-NEXT:    s_endpgm
9514;
9515; GFX10-WGP-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9516; GFX10-WGP:       ; %bb.0: ; %entry
9517; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9518; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9519; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9520; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9521; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9522; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9523; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9524; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9525; GFX10-WGP-NEXT:    s_endpgm
9526;
9527; GFX10-CU-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9528; GFX10-CU:       ; %bb.0: ; %entry
9529; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9530; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9531; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9532; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9533; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9534; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9535; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9536; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9537; GFX10-CU-NEXT:    s_endpgm
9538;
9539; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9540; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9541; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9542; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9543; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9544; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9545; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9546; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9547; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9548; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9549; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9550; SKIP-CACHE-INV-NEXT:    s_endpgm
9551;
9552; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9553; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9554; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9555; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9556; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9557; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9558; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9559; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9560; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9561; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9562; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9563;
9564; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9565; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9566; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9567; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9568; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9569; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9570; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9571; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9572; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9573; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9574; GFX90A-TGSPLIT-NEXT:    s_endpgm
9575;
9576; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9577; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9578; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9579; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9580; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9581; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9582; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9583; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9584; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9585; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9586; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9587;
9588; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_release_seq_cst_ret_cmpxchg:
9589; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9590; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9591; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9592; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9593; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9594; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9595; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9596; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9597; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9598; GFX940-TGSPLIT-NEXT:    s_endpgm
9599    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9600entry:
9601  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9602  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") release seq_cst
9603  %val0 = extractvalue { i32, i1 } %val, 0
9604  store i32 %val0, i32 addrspace(3)* %out, align 4
9605  ret void
9606}
9607
9608define amdgpu_kernel void @local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg(
9609; GFX6-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9610; GFX6:       ; %bb.0: ; %entry
9611; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9612; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9613; GFX6-NEXT:    s_mov_b32 m0, -1
9614; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9615; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9616; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9617; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9618; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9619; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9620; GFX6-NEXT:    ds_write_b32 v0, v1
9621; GFX6-NEXT:    s_endpgm
9622;
9623; GFX7-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9624; GFX7:       ; %bb.0: ; %entry
9625; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9626; GFX7-NEXT:    s_mov_b32 m0, -1
9627; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9628; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9629; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9630; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9631; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9632; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9633; GFX7-NEXT:    ds_write_b32 v0, v1
9634; GFX7-NEXT:    s_endpgm
9635;
9636; GFX10-WGP-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9637; GFX10-WGP:       ; %bb.0: ; %entry
9638; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9639; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9640; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9641; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9642; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9643; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9644; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9645; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9646; GFX10-WGP-NEXT:    s_endpgm
9647;
9648; GFX10-CU-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9649; GFX10-CU:       ; %bb.0: ; %entry
9650; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9651; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9652; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9653; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9654; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9655; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9656; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9657; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9658; GFX10-CU-NEXT:    s_endpgm
9659;
9660; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9661; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9662; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9663; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9664; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9665; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9666; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9667; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9668; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9669; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9670; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9671; SKIP-CACHE-INV-NEXT:    s_endpgm
9672;
9673; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9674; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9675; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9676; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9677; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9678; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9679; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9680; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9681; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9682; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9683; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9684;
9685; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9686; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9687; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9688; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9689; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9690; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9691; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9692; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9693; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9694; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9695; GFX90A-TGSPLIT-NEXT:    s_endpgm
9696;
9697; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9698; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9699; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9700; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9701; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9702; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9703; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9704; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9705; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9706; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9707; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9708;
9709; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_acq_rel_seq_cst_ret_cmpxchg:
9710; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9711; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9712; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9713; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9714; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9715; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9716; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9717; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9718; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9719; GFX940-TGSPLIT-NEXT:    s_endpgm
9720    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9721entry:
9722  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9723  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") acq_rel seq_cst
9724  %val0 = extractvalue { i32, i1 } %val, 0
9725  store i32 %val0, i32 addrspace(3)* %out, align 4
9726  ret void
9727}
9728
9729define amdgpu_kernel void @local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg(
9730; GFX6-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9731; GFX6:       ; %bb.0: ; %entry
9732; GFX6-NEXT:    s_load_dword s2, s[4:5], 0x0
9733; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x1
9734; GFX6-NEXT:    s_mov_b32 m0, -1
9735; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9736; GFX6-NEXT:    v_mov_b32_e32 v0, s2
9737; GFX6-NEXT:    v_mov_b32_e32 v1, s1
9738; GFX6-NEXT:    v_mov_b32_e32 v2, s0
9739; GFX6-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9740; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
9741; GFX6-NEXT:    ds_write_b32 v0, v1
9742; GFX6-NEXT:    s_endpgm
9743;
9744; GFX7-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9745; GFX7:       ; %bb.0: ; %entry
9746; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9747; GFX7-NEXT:    s_mov_b32 m0, -1
9748; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9749; GFX7-NEXT:    v_mov_b32_e32 v0, s0
9750; GFX7-NEXT:    v_mov_b32_e32 v1, s2
9751; GFX7-NEXT:    v_mov_b32_e32 v2, s1
9752; GFX7-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9753; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
9754; GFX7-NEXT:    ds_write_b32 v0, v1
9755; GFX7-NEXT:    s_endpgm
9756;
9757; GFX10-WGP-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9758; GFX10-WGP:       ; %bb.0: ; %entry
9759; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9760; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9761; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
9762; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
9763; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
9764; GFX10-WGP-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9765; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
9766; GFX10-WGP-NEXT:    ds_write_b32 v0, v1
9767; GFX10-WGP-NEXT:    s_endpgm
9768;
9769; GFX10-CU-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9770; GFX10-CU:       ; %bb.0: ; %entry
9771; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9772; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9773; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
9774; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
9775; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
9776; GFX10-CU-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9777; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
9778; GFX10-CU-NEXT:    ds_write_b32 v0, v1
9779; GFX10-CU-NEXT:    s_endpgm
9780;
9781; SKIP-CACHE-INV-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9782; SKIP-CACHE-INV:       ; %bb.0: ; %entry
9783; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9784; SKIP-CACHE-INV-NEXT:    s_mov_b32 m0, -1
9785; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9786; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
9787; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s2
9788; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
9789; SKIP-CACHE-INV-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9790; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
9791; SKIP-CACHE-INV-NEXT:    ds_write_b32 v0, v1
9792; SKIP-CACHE-INV-NEXT:    s_endpgm
9793;
9794; GFX90A-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9795; GFX90A-NOTTGSPLIT:       ; %bb.0: ; %entry
9796; GFX90A-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9797; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9798; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9799; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9800; GFX90A-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9801; GFX90A-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9802; GFX90A-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9803; GFX90A-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9804; GFX90A-NOTTGSPLIT-NEXT:    s_endpgm
9805;
9806; GFX90A-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9807; GFX90A-TGSPLIT:       ; %bb.0: ; %entry
9808; GFX90A-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
9809; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9810; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9811; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9812; GFX90A-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9813; GFX90A-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9814; GFX90A-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9815; GFX90A-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9816; GFX90A-TGSPLIT-NEXT:    s_endpgm
9817;
9818; GFX940-NOTTGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9819; GFX940-NOTTGSPLIT:       ; %bb.0: ; %entry
9820; GFX940-NOTTGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9821; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9822; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9823; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9824; GFX940-NOTTGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9825; GFX940-NOTTGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9826; GFX940-NOTTGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9827; GFX940-NOTTGSPLIT-NEXT:    ds_write_b32 v0, v1
9828; GFX940-NOTTGSPLIT-NEXT:    s_endpgm
9829;
9830; GFX940-TGSPLIT-LABEL: local_singlethread_one_as_seq_cst_seq_cst_ret_cmpxchg:
9831; GFX940-TGSPLIT:       ; %bb.0: ; %entry
9832; GFX940-TGSPLIT-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
9833; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9834; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v0, s0
9835; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v1, s2
9836; GFX940-TGSPLIT-NEXT:    v_mov_b32_e32 v2, s1
9837; GFX940-TGSPLIT-NEXT:    ds_cmpst_rtn_b32 v1, v0, v1, v2 offset:16
9838; GFX940-TGSPLIT-NEXT:    s_waitcnt lgkmcnt(0)
9839; GFX940-TGSPLIT-NEXT:    ds_write_b32 v0, v1
9840; GFX940-TGSPLIT-NEXT:    s_endpgm
9841    i32 addrspace(3)* %out, i32 %in, i32 %old) {
9842entry:
9843  %gep = getelementptr i32, i32 addrspace(3)* %out, i32 4
9844  %val = cmpxchg volatile i32 addrspace(3)* %gep, i32 %old, i32 %in syncscope("singlethread-one-as") seq_cst seq_cst
9845  %val0 = extractvalue { i32, i1 } %val, 0
9846  store i32 %val0, i32 addrspace(3)* %out, align 4
9847  ret void
9848}
9849
9850