[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memory-legalizer-flat-volatile.ll
blob0cd6ea793d88e1b5fb7dea2fd0dcde5b146afe38
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX7 %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-WGP %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+cumode -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-CU %s
5 ; RUN: llc -mtriple=amdgcn-amd-amdpal -mcpu=gfx700 -amdgcn-skip-cache-invalidations -verify-machineinstrs < %s | FileCheck --check-prefixes=SKIP-CACHE-INV %s
7 define amdgpu_kernel void @flat_nontemporal_load_0(
8 ; GFX7-LABEL: flat_nontemporal_load_0:
9 ; GFX7:       ; %bb.0: ; %entry
10 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
11 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
12 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
13 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
14 ; GFX7-NEXT:    flat_load_dword v0, v[0:1] glc
15 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
16 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
17 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
18 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
19 ; GFX7-NEXT:    flat_store_dword v[2:3], v0
20 ; GFX7-NEXT:    s_endpgm
22 ; GFX10-WGP-LABEL: flat_nontemporal_load_0:
23 ; GFX10-WGP:       ; %bb.0: ; %entry
24 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
25 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
26 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
27 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
28 ; GFX10-WGP-NEXT:    flat_load_dword v2, v[0:1] glc dlc
29 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
30 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
31 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
32 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
33 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
34 ; GFX10-WGP-NEXT:    s_endpgm
36 ; GFX10-CU-LABEL: flat_nontemporal_load_0:
37 ; GFX10-CU:       ; %bb.0: ; %entry
38 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
39 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
40 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
41 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
42 ; GFX10-CU-NEXT:    flat_load_dword v2, v[0:1] glc dlc
43 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
44 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
45 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
46 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
47 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
48 ; GFX10-CU-NEXT:    s_endpgm
50 ; SKIP-CACHE-INV-LABEL: flat_nontemporal_load_0:
51 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
52 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
53 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
54 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
55 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
56 ; SKIP-CACHE-INV-NEXT:    flat_load_dword v0, v[0:1] glc
57 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
58 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s2
59 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v3, s3
60 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
61 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[2:3], v0
62 ; SKIP-CACHE-INV-NEXT:    s_endpgm
63     i32* %in, i32* %out) {
64 entry:
65   %val = load volatile i32, i32* %in, align 4
66   store i32 %val, i32* %out
67   ret void
70 define amdgpu_kernel void @flat_nontemporal_load_1(
71 ; GFX7-LABEL: flat_nontemporal_load_1:
72 ; GFX7:       ; %bb.0: ; %entry
73 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
74 ; GFX7-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
75 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
76 ; GFX7-NEXT:    v_mov_b32_e32 v3, s1
77 ; GFX7-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
78 ; GFX7-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
79 ; GFX7-NEXT:    flat_load_dword v2, v[2:3] glc
80 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
81 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
82 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
83 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
84 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
85 ; GFX7-NEXT:    s_endpgm
87 ; GFX10-WGP-LABEL: flat_nontemporal_load_1:
88 ; GFX10-WGP:       ; %bb.0: ; %entry
89 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
90 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
91 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
92 ; GFX10-WGP-NEXT:    v_add_co_u32 v0, s0, s0, v0
93 ; GFX10-WGP-NEXT:    v_add_co_ci_u32_e64 v1, s0, s1, 0, s0
94 ; GFX10-WGP-NEXT:    flat_load_dword v2, v[0:1] glc dlc
95 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
96 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
97 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
98 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
99 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
100 ; GFX10-WGP-NEXT:    s_endpgm
102 ; GFX10-CU-LABEL: flat_nontemporal_load_1:
103 ; GFX10-CU:       ; %bb.0: ; %entry
104 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
105 ; GFX10-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
106 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
107 ; GFX10-CU-NEXT:    v_add_co_u32 v0, s0, s0, v0
108 ; GFX10-CU-NEXT:    v_add_co_ci_u32_e64 v1, s0, s1, 0, s0
109 ; GFX10-CU-NEXT:    flat_load_dword v2, v[0:1] glc dlc
110 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
111 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
112 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
113 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
114 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
115 ; GFX10-CU-NEXT:    s_endpgm
117 ; SKIP-CACHE-INV-LABEL: flat_nontemporal_load_1:
118 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
119 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
120 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
121 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
122 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v3, s1
123 ; SKIP-CACHE-INV-NEXT:    v_add_i32_e32 v2, vcc, s0, v2
124 ; SKIP-CACHE-INV-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
125 ; SKIP-CACHE-INV-NEXT:    flat_load_dword v2, v[2:3] glc
126 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
127 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
128 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
129 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
130 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[0:1], v2
131 ; SKIP-CACHE-INV-NEXT:    s_endpgm
132     i32* %in, i32* %out) {
133 entry:
134   %tid = call i32 @llvm.amdgcn.workitem.id.x()
135   %val.gep = getelementptr inbounds i32, i32* %in, i32 %tid
136   %val = load volatile i32, i32* %val.gep, align 4
137   store i32 %val, i32* %out
138   ret void
141 define amdgpu_kernel void @flat_nontemporal_store_0(
142 ; GFX7-LABEL: flat_nontemporal_store_0:
143 ; GFX7:       ; %bb.0: ; %entry
144 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
145 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
146 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
147 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
148 ; GFX7-NEXT:    flat_load_dword v0, v[0:1]
149 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
150 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
151 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
152 ; GFX7-NEXT:    flat_store_dword v[2:3], v0
153 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
154 ; GFX7-NEXT:    s_endpgm
156 ; GFX10-WGP-LABEL: flat_nontemporal_store_0:
157 ; GFX10-WGP:       ; %bb.0: ; %entry
158 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
159 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
160 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
161 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
162 ; GFX10-WGP-NEXT:    flat_load_dword v2, v[0:1]
163 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
164 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
165 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
166 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
167 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
168 ; GFX10-WGP-NEXT:    s_endpgm
170 ; GFX10-CU-LABEL: flat_nontemporal_store_0:
171 ; GFX10-CU:       ; %bb.0: ; %entry
172 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
173 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
174 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
175 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
176 ; GFX10-CU-NEXT:    flat_load_dword v2, v[0:1]
177 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
178 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
179 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
180 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
181 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
182 ; GFX10-CU-NEXT:    s_endpgm
184 ; SKIP-CACHE-INV-LABEL: flat_nontemporal_store_0:
185 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
186 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
187 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
188 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
189 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
190 ; SKIP-CACHE-INV-NEXT:    flat_load_dword v0, v[0:1]
191 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s2
192 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v3, s3
193 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
194 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[2:3], v0
195 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
196 ; SKIP-CACHE-INV-NEXT:    s_endpgm
197     i32* %in, i32* %out) {
198 entry:
199   %val = load i32, i32* %in, align 4
200   store volatile i32 %val, i32* %out
201   ret void
204 define amdgpu_kernel void @flat_nontemporal_store_1(
205 ; GFX7-LABEL: flat_nontemporal_store_1:
206 ; GFX7:       ; %bb.0: ; %entry
207 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
208 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
209 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
210 ; GFX7-NEXT:    v_mov_b32_e32 v1, s0
211 ; GFX7-NEXT:    v_mov_b32_e32 v2, s1
212 ; GFX7-NEXT:    flat_load_dword v2, v[1:2]
213 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
214 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
215 ; GFX7-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
216 ; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
217 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
218 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
219 ; GFX7-NEXT:    s_endpgm
221 ; GFX10-WGP-LABEL: flat_nontemporal_store_1:
222 ; GFX10-WGP:       ; %bb.0: ; %entry
223 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
224 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
225 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
227 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s1
228 ; GFX10-WGP-NEXT:    v_add_co_u32 v0, s0, s2, v0
229 ; GFX10-WGP-NEXT:    flat_load_dword v2, v[1:2]
230 ; GFX10-WGP-NEXT:    v_add_co_ci_u32_e64 v1, s0, s3, 0, s0
231 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
232 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
233 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
234 ; GFX10-WGP-NEXT:    s_endpgm
236 ; GFX10-CU-LABEL: flat_nontemporal_store_1:
237 ; GFX10-CU:       ; %bb.0: ; %entry
238 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
239 ; GFX10-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
240 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
241 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
242 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s1
243 ; GFX10-CU-NEXT:    v_add_co_u32 v0, s0, s2, v0
244 ; GFX10-CU-NEXT:    flat_load_dword v2, v[1:2]
245 ; GFX10-CU-NEXT:    v_add_co_ci_u32_e64 v1, s0, s3, 0, s0
246 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
247 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
248 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
249 ; GFX10-CU-NEXT:    s_endpgm
251 ; SKIP-CACHE-INV-LABEL: flat_nontemporal_store_1:
252 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
253 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
254 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
255 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
256 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
257 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s1
258 ; SKIP-CACHE-INV-NEXT:    flat_load_dword v2, v[1:2]
259 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s3
260 ; SKIP-CACHE-INV-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
261 ; SKIP-CACHE-INV-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
262 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
263 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[0:1], v2
264 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
265 ; SKIP-CACHE-INV-NEXT:    s_endpgm
266     i32* %in, i32* %out) {
267 entry:
268   %tid = call i32 @llvm.amdgcn.workitem.id.x()
269   %val = load i32, i32* %in, align 4
270   %out.gep = getelementptr inbounds i32, i32* %out, i32 %tid
271   store volatile i32 %val, i32* %out.gep
272   ret void
275 define amdgpu_kernel void @flat_volatile_workgroup_acquire_load(
276 ; GFX7-LABEL: flat_volatile_workgroup_acquire_load:
277 ; GFX7:       ; %bb.0: ; %entry
278 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
279 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
280 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
281 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
282 ; GFX7-NEXT:    flat_load_dword v0, v[0:1]
283 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
284 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
285 ; GFX7-NEXT:    v_mov_b32_e32 v3, s3
286 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
287 ; GFX7-NEXT:    flat_store_dword v[2:3], v0
288 ; GFX7-NEXT:    s_endpgm
290 ; GFX10-WGP-LABEL: flat_volatile_workgroup_acquire_load:
291 ; GFX10-WGP:       ; %bb.0: ; %entry
292 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
293 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
294 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
295 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
296 ; GFX10-WGP-NEXT:    flat_load_dword v2, v[0:1] glc
297 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
298 ; GFX10-WGP-NEXT:    buffer_gl0_inv
299 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
300 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s3
301 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
302 ; GFX10-WGP-NEXT:    s_endpgm
304 ; GFX10-CU-LABEL: flat_volatile_workgroup_acquire_load:
305 ; GFX10-CU:       ; %bb.0: ; %entry
306 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
307 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
308 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
309 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
310 ; GFX10-CU-NEXT:    flat_load_dword v2, v[0:1]
311 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
312 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
313 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s3
314 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
315 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
316 ; GFX10-CU-NEXT:    s_endpgm
318 ; SKIP-CACHE-INV-LABEL: flat_volatile_workgroup_acquire_load:
319 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
320 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
321 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
322 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
323 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
324 ; SKIP-CACHE-INV-NEXT:    flat_load_dword v0, v[0:1]
325 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
326 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s2
327 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v3, s3
328 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
329 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[2:3], v0
330 ; SKIP-CACHE-INV-NEXT:    s_endpgm
331     i32* %in, i32* %out) {
332 entry:
333   %val = load atomic volatile i32, i32* %in syncscope("workgroup") acquire, align 4
334   store i32 %val, i32* %out
335   ret void
338 define amdgpu_kernel void @flat_volatile_workgroup_release_store(
339 ; GFX7-LABEL: flat_volatile_workgroup_release_store:
340 ; GFX7:       ; %bb.0: ; %entry
341 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
342 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
343 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
344 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
345 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
346 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
347 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
348 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
349 ; GFX7-NEXT:    s_endpgm
351 ; GFX10-WGP-LABEL: flat_volatile_workgroup_release_store:
352 ; GFX10-WGP:       ; %bb.0: ; %entry
353 ; GFX10-WGP-NEXT:    s_clause 0x1
354 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
355 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
356 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
357 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
358 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s1
359 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v2, s2
360 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
361 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
362 ; GFX10-WGP-NEXT:    flat_store_dword v[0:1], v2
363 ; GFX10-WGP-NEXT:    s_endpgm
365 ; GFX10-CU-LABEL: flat_volatile_workgroup_release_store:
366 ; GFX10-CU:       ; %bb.0: ; %entry
367 ; GFX10-CU-NEXT:    s_clause 0x1
368 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
369 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
370 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
371 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
372 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s1
373 ; GFX10-CU-NEXT:    v_mov_b32_e32 v2, s2
374 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
375 ; GFX10-CU-NEXT:    flat_store_dword v[0:1], v2
376 ; GFX10-CU-NEXT:    s_endpgm
378 ; SKIP-CACHE-INV-LABEL: flat_volatile_workgroup_release_store:
379 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
380 ; SKIP-CACHE-INV-NEXT:    s_load_dword s2, s[0:1], 0x9
381 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
382 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
383 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s2
384 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
385 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
386 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
387 ; SKIP-CACHE-INV-NEXT:    flat_store_dword v[0:1], v2
388 ; SKIP-CACHE-INV-NEXT:    s_endpgm
389    i32 %in, i32* %out) {
390 entry:
391   store atomic volatile i32 %in, i32* %out syncscope("workgroup") release, align 4
392   ret void
395 declare i32 @llvm.amdgcn.workitem.id.x()