Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memory-legalizer-global-volatile.ll
blobfa87daac9880cc03292b191673316703308c384c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd- -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=gfx1100 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11-WGP %s
8 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX11-CU %s
10 define amdgpu_kernel void @global_volatile_load_0(
11 ; GFX6-LABEL: global_volatile_load_0:
12 ; GFX6:       ; %bb.0: ; %entry
13 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
14 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
15 ; GFX6-NEXT:    s_mov_b32 s6, -1
16 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
17 ; GFX6-NEXT:    s_mov_b32 s4, s0
18 ; GFX6-NEXT:    s_mov_b32 s5, s1
19 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
20 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
21 ; GFX6-NEXT:    s_mov_b32 s4, s2
22 ; GFX6-NEXT:    s_mov_b32 s5, s3
23 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
24 ; GFX6-NEXT:    s_endpgm
26 ; GFX7-LABEL: global_volatile_load_0:
27 ; GFX7:       ; %bb.0: ; %entry
28 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
29 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
30 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
31 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
32 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
33 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
34 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
35 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
36 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
37 ; GFX7-NEXT:    s_endpgm
39 ; GFX10-WGP-LABEL: global_volatile_load_0:
40 ; GFX10-WGP:       ; %bb.0: ; %entry
41 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
42 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
43 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
44 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
45 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
46 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
47 ; GFX10-WGP-NEXT:    s_endpgm
49 ; GFX10-CU-LABEL: global_volatile_load_0:
50 ; GFX10-CU:       ; %bb.0: ; %entry
51 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
52 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
53 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
54 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1] glc dlc
55 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
56 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
57 ; GFX10-CU-NEXT:    s_endpgm
59 ; SKIP-CACHE-INV-LABEL: global_volatile_load_0:
60 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
61 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
62 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
63 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
64 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
65 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
66 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
67 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
68 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
69 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
70 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
71 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
72 ; SKIP-CACHE-INV-NEXT:    s_endpgm
74 ; GFX11-WGP-LABEL: global_volatile_load_0:
75 ; GFX11-WGP:       ; %bb.0: ; %entry
76 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
77 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
78 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
79 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc dlc
80 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
81 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
82 ; GFX11-WGP-NEXT:    s_endpgm
84 ; GFX11-CU-LABEL: global_volatile_load_0:
85 ; GFX11-CU:       ; %bb.0: ; %entry
86 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
87 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
88 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
89 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1] glc dlc
90 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
91 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
92 ; GFX11-CU-NEXT:    s_endpgm
93     i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
94 entry:
95   %val = load volatile i32, i32 addrspace(1)* %in, align 4
96   store i32 %val, i32 addrspace(1)* %out
97   ret void
100 define amdgpu_kernel void @global_volatile_load_1(
101 ; GFX6-LABEL: global_volatile_load_1:
102 ; GFX6:       ; %bb.0: ; %entry
103 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
104 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
105 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
106 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
107 ; GFX6-NEXT:    s_mov_b32 s6, -1
108 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
109 ; GFX6-NEXT:    s_mov_b32 s4, s2
110 ; GFX6-NEXT:    s_mov_b32 s5, s3
111 ; GFX6-NEXT:    s_mov_b32 s2, 0
112 ; GFX6-NEXT:    s_mov_b32 s3, s7
113 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
114 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
115 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
116 ; GFX6-NEXT:    s_endpgm
118 ; GFX7-LABEL: global_volatile_load_1:
119 ; GFX7:       ; %bb.0: ; %entry
120 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
121 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
122 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
123 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
124 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s0, v0
125 ; GFX7-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
126 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
127 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
128 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
129 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
130 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
131 ; GFX7-NEXT:    s_endpgm
133 ; GFX10-WGP-LABEL: global_volatile_load_1:
134 ; GFX10-WGP:       ; %bb.0: ; %entry
135 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
136 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
137 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, 0
138 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
139 ; GFX10-WGP-NEXT:    global_load_dword v0, v0, s[0:1] glc dlc
140 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
141 ; GFX10-WGP-NEXT:    global_store_dword v1, v0, s[2:3]
142 ; GFX10-WGP-NEXT:    s_endpgm
144 ; GFX10-CU-LABEL: global_volatile_load_1:
145 ; GFX10-CU:       ; %bb.0: ; %entry
146 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
147 ; GFX10-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
148 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, 0
149 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
150 ; GFX10-CU-NEXT:    global_load_dword v0, v0, s[0:1] glc dlc
151 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
152 ; GFX10-CU-NEXT:    global_store_dword v1, v0, s[2:3]
153 ; GFX10-CU-NEXT:    s_endpgm
155 ; SKIP-CACHE-INV-LABEL: global_volatile_load_1:
156 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
157 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
158 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
159 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
160 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, 0
161 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
162 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
163 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
164 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
165 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, 0
166 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s7
167 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, v[0:1], s[0:3], 0 addr64 glc
168 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
169 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
170 ; SKIP-CACHE-INV-NEXT:    s_endpgm
172 ; GFX11-WGP-LABEL: global_volatile_load_1:
173 ; GFX11-WGP:       ; %bb.0: ; %entry
174 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
175 ; GFX11-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
176 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, 0
177 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
178 ; GFX11-WGP-NEXT:    global_load_b32 v0, v0, s[0:1] glc dlc
179 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
180 ; GFX11-WGP-NEXT:    global_store_b32 v1, v0, s[2:3]
181 ; GFX11-WGP-NEXT:    s_endpgm
183 ; GFX11-CU-LABEL: global_volatile_load_1:
184 ; GFX11-CU:       ; %bb.0: ; %entry
185 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
186 ; GFX11-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
187 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, 0
188 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
189 ; GFX11-CU-NEXT:    global_load_b32 v0, v0, s[0:1] glc dlc
190 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
191 ; GFX11-CU-NEXT:    global_store_b32 v1, v0, s[2:3]
192 ; GFX11-CU-NEXT:    s_endpgm
193     i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
194 entry:
195   %tid = call i32 @llvm.amdgcn.workitem.id.x()
196   %val.gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i32 %tid
197   %val = load volatile i32, i32 addrspace(1)* %val.gep, align 4
198   store i32 %val, i32 addrspace(1)* %out
199   ret void
202 define amdgpu_kernel void @global_volatile_store_0(
203 ; GFX6-LABEL: global_volatile_store_0:
204 ; GFX6:       ; %bb.0: ; %entry
205 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
206 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
207 ; GFX6-NEXT:    s_mov_b32 s6, -1
208 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
209 ; GFX6-NEXT:    s_load_dword s0, s[0:1], 0x0
210 ; GFX6-NEXT:    s_mov_b32 s4, s2
211 ; GFX6-NEXT:    s_mov_b32 s5, s3
212 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
213 ; GFX6-NEXT:    v_mov_b32_e32 v0, s0
214 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
215 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
216 ; GFX6-NEXT:    s_endpgm
218 ; GFX7-LABEL: global_volatile_store_0:
219 ; GFX7:       ; %bb.0: ; %entry
220 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
221 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
222 ; GFX7-NEXT:    s_load_dword s0, s[0:1], 0x0
223 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
224 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
225 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
226 ; GFX7-NEXT:    v_mov_b32_e32 v2, s0
227 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
228 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
229 ; GFX7-NEXT:    s_endpgm
231 ; GFX10-WGP-LABEL: global_volatile_store_0:
232 ; GFX10-WGP:       ; %bb.0: ; %entry
233 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
234 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
235 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
236 ; GFX10-WGP-NEXT:    s_load_dword s0, s[0:1], 0x0
237 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
238 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
239 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
240 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
241 ; GFX10-WGP-NEXT:    s_endpgm
243 ; GFX10-CU-LABEL: global_volatile_store_0:
244 ; GFX10-CU:       ; %bb.0: ; %entry
245 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
246 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
247 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
248 ; GFX10-CU-NEXT:    s_load_dword s0, s[0:1], 0x0
249 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
250 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
251 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
252 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
253 ; GFX10-CU-NEXT:    s_endpgm
255 ; SKIP-CACHE-INV-LABEL: global_volatile_store_0:
256 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
257 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
258 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
259 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
260 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
261 ; SKIP-CACHE-INV-NEXT:    s_load_dword s0, s[0:1], 0x0
262 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
263 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
264 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
265 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s0
266 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
267 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
268 ; SKIP-CACHE-INV-NEXT:    s_endpgm
270 ; GFX11-WGP-LABEL: global_volatile_store_0:
271 ; GFX11-WGP:       ; %bb.0: ; %entry
272 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
273 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
274 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
275 ; GFX11-WGP-NEXT:    s_load_b32 s0, s[0:1], 0x0
276 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
277 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s0
278 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3] dlc
279 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
280 ; GFX11-WGP-NEXT:    s_endpgm
282 ; GFX11-CU-LABEL: global_volatile_store_0:
283 ; GFX11-CU:       ; %bb.0: ; %entry
284 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
285 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
286 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
287 ; GFX11-CU-NEXT:    s_load_b32 s0, s[0:1], 0x0
288 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
289 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s0
290 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3] dlc
291 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
292 ; GFX11-CU-NEXT:    s_endpgm
293     i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
294 entry:
295   %val = load i32, i32 addrspace(1)* %in, align 4
296   store volatile i32 %val, i32 addrspace(1)* %out
297   ret void
300 define amdgpu_kernel void @global_volatile_store_1(
301 ; GFX6-LABEL: global_volatile_store_1:
302 ; GFX6:       ; %bb.0: ; %entry
303 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
304 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
305 ; GFX6-NEXT:    s_mov_b32 s6, 0
306 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
307 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0
308 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
309 ; GFX6-NEXT:    s_load_dword s0, s[0:1], 0x0
310 ; GFX6-NEXT:    s_mov_b64 s[4:5], s[2:3]
311 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
312 ; GFX6-NEXT:    v_mov_b32_e32 v2, s0
313 ; GFX6-NEXT:    buffer_store_dword v2, v[0:1], s[4:7], 0 addr64
314 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
315 ; GFX6-NEXT:    s_endpgm
317 ; GFX7-LABEL: global_volatile_store_1:
318 ; GFX7:       ; %bb.0: ; %entry
319 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
320 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
321 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
322 ; GFX7-NEXT:    s_load_dword s0, s[0:1], 0x0
323 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
324 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
325 ; GFX7-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
326 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
327 ; GFX7-NEXT:    v_mov_b32_e32 v2, s0
328 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
329 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
330 ; GFX7-NEXT:    s_endpgm
332 ; GFX10-WGP-LABEL: global_volatile_store_1:
333 ; GFX10-WGP:       ; %bb.0: ; %entry
334 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
335 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
336 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
337 ; GFX10-WGP-NEXT:    s_load_dword s0, s[0:1], 0x0
338 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
339 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
340 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
341 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
342 ; GFX10-WGP-NEXT:    s_endpgm
344 ; GFX10-CU-LABEL: global_volatile_store_1:
345 ; GFX10-CU:       ; %bb.0: ; %entry
346 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
347 ; GFX10-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
348 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
349 ; GFX10-CU-NEXT:    s_load_dword s0, s[0:1], 0x0
350 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
351 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
352 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
353 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
354 ; GFX10-CU-NEXT:    s_endpgm
356 ; SKIP-CACHE-INV-LABEL: global_volatile_store_1:
357 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
358 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
359 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
360 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, 0
361 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
362 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, 0
363 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
364 ; SKIP-CACHE-INV-NEXT:    s_load_dword s0, s[0:1], 0x0
365 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[4:5], s[2:3]
366 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
367 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, s0
368 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v2, v[0:1], s[4:7], 0 addr64
369 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
370 ; SKIP-CACHE-INV-NEXT:    s_endpgm
372 ; GFX11-WGP-LABEL: global_volatile_store_1:
373 ; GFX11-WGP:       ; %bb.0: ; %entry
374 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
375 ; GFX11-WGP-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
376 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
377 ; GFX11-WGP-NEXT:    s_load_b32 s0, s[0:1], 0x0
378 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
379 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s0
380 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3] dlc
381 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
382 ; GFX11-WGP-NEXT:    s_endpgm
384 ; GFX11-CU-LABEL: global_volatile_store_1:
385 ; GFX11-CU:       ; %bb.0: ; %entry
386 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
387 ; GFX11-CU-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
388 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
389 ; GFX11-CU-NEXT:    s_load_b32 s0, s[0:1], 0x0
390 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
391 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s0
392 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3] dlc
393 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
394 ; GFX11-CU-NEXT:    s_endpgm
395     i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
396 entry:
397   %tid = call i32 @llvm.amdgcn.workitem.id.x()
398   %val = load i32, i32 addrspace(1)* %in, align 4
399   %out.gep = getelementptr inbounds i32, i32 addrspace(1)* %out, i32 %tid
400   store volatile i32 %val, i32 addrspace(1)* %out.gep
401   ret void
404 define amdgpu_kernel void @global_volatile_workgroup_acquire_load(
405 ; GFX6-LABEL: global_volatile_workgroup_acquire_load:
406 ; GFX6:       ; %bb.0: ; %entry
407 ; GFX6-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x9
408 ; GFX6-NEXT:    s_mov_b32 s7, 0xf000
409 ; GFX6-NEXT:    s_mov_b32 s6, -1
410 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
411 ; GFX6-NEXT:    s_mov_b32 s4, s0
412 ; GFX6-NEXT:    s_mov_b32 s5, s1
413 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0
414 ; GFX6-NEXT:    s_mov_b32 s4, s2
415 ; GFX6-NEXT:    s_mov_b32 s5, s3
416 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
417 ; GFX6-NEXT:    buffer_store_dword v0, off, s[4:7], 0
418 ; GFX6-NEXT:    s_endpgm
420 ; GFX7-LABEL: global_volatile_workgroup_acquire_load:
421 ; GFX7:       ; %bb.0: ; %entry
422 ; GFX7-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
423 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
424 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
425 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
426 ; GFX7-NEXT:    flat_load_dword v2, v[0:1]
427 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
428 ; GFX7-NEXT:    v_mov_b32_e32 v1, s3
429 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
430 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
431 ; GFX7-NEXT:    s_endpgm
433 ; GFX10-WGP-LABEL: global_volatile_workgroup_acquire_load:
434 ; GFX10-WGP:       ; %bb.0: ; %entry
435 ; GFX10-WGP-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
436 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
437 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
438 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[0:1] glc
439 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
440 ; GFX10-WGP-NEXT:    buffer_gl0_inv
441 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[2:3]
442 ; GFX10-WGP-NEXT:    s_endpgm
444 ; GFX10-CU-LABEL: global_volatile_workgroup_acquire_load:
445 ; GFX10-CU:       ; %bb.0: ; %entry
446 ; GFX10-CU-NEXT:    s_load_dwordx4 s[0:3], s[4:5], 0x0
447 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
448 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
449 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[0:1]
450 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
451 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[2:3]
452 ; GFX10-CU-NEXT:    s_endpgm
454 ; SKIP-CACHE-INV-LABEL: global_volatile_workgroup_acquire_load:
455 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
456 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x0
457 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, 0xf000
458 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
459 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
460 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
461 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s1
462 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0
463 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s2
464 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s3
465 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
466 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[4:7], 0
467 ; SKIP-CACHE-INV-NEXT:    s_endpgm
469 ; GFX11-WGP-LABEL: global_volatile_workgroup_acquire_load:
470 ; GFX11-WGP:       ; %bb.0: ; %entry
471 ; GFX11-WGP-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
472 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
473 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
474 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[0:1] glc
475 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
476 ; GFX11-WGP-NEXT:    buffer_gl0_inv
477 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[2:3]
478 ; GFX11-WGP-NEXT:    s_endpgm
480 ; GFX11-CU-LABEL: global_volatile_workgroup_acquire_load:
481 ; GFX11-CU:       ; %bb.0: ; %entry
482 ; GFX11-CU-NEXT:    s_load_b128 s[0:3], s[0:1], 0x0
483 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
484 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
485 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[0:1]
486 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
487 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[2:3]
488 ; GFX11-CU-NEXT:    s_endpgm
489     i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
490 entry:
491   %val = load atomic volatile i32, i32 addrspace(1)* %in syncscope("workgroup") acquire, align 4
492   store i32 %val, i32 addrspace(1)* %out
493   ret void
496 define amdgpu_kernel void @global_volatile_workgroup_release_store(
497 ; GFX6-LABEL: global_volatile_workgroup_release_store:
498 ; GFX6:       ; %bb.0: ; %entry
499 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0x9
500 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
501 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
502 ; GFX6-NEXT:    s_mov_b32 s2, -1
503 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
504 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
505 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
506 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
507 ; GFX6-NEXT:    s_endpgm
509 ; GFX7-LABEL: global_volatile_workgroup_release_store:
510 ; GFX7:       ; %bb.0: ; %entry
511 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
512 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
513 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
514 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
515 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
516 ; GFX7-NEXT:    v_mov_b32_e32 v2, s2
517 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
518 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
519 ; GFX7-NEXT:    s_endpgm
521 ; GFX10-WGP-LABEL: global_volatile_workgroup_release_store:
522 ; GFX10-WGP:       ; %bb.0: ; %entry
523 ; GFX10-WGP-NEXT:    s_clause 0x1
524 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
525 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
526 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
527 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
528 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
529 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
530 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
531 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[0:1]
532 ; GFX10-WGP-NEXT:    s_endpgm
534 ; GFX10-CU-LABEL: global_volatile_workgroup_release_store:
535 ; GFX10-CU:       ; %bb.0: ; %entry
536 ; GFX10-CU-NEXT:    s_clause 0x1
537 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
538 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
539 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
540 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
541 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
542 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
543 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[0:1]
544 ; GFX10-CU-NEXT:    s_endpgm
546 ; SKIP-CACHE-INV-LABEL: global_volatile_workgroup_release_store:
547 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
548 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
549 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
550 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
551 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
552 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
553 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
554 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
555 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
556 ; SKIP-CACHE-INV-NEXT:    s_endpgm
558 ; GFX11-WGP-LABEL: global_volatile_workgroup_release_store:
559 ; GFX11-WGP:       ; %bb.0: ; %entry
560 ; GFX11-WGP-NEXT:    s_clause 0x1
561 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
562 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
563 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
564 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
565 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s2
566 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
567 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
568 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
569 ; GFX11-WGP-NEXT:    s_endpgm
571 ; GFX11-CU-LABEL: global_volatile_workgroup_release_store:
572 ; GFX11-CU:       ; %bb.0: ; %entry
573 ; GFX11-CU-NEXT:    s_clause 0x1
574 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
575 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
576 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
577 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
578 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s2
579 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
580 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
581 ; GFX11-CU-NEXT:    s_endpgm
582    i32 %in, i32 addrspace(1)* %out) {
583 entry:
584   store atomic volatile i32 %in, i32 addrspace(1)* %out syncscope("workgroup") release, align 4
585   ret void
588 declare i32 @llvm.amdgcn.workitem.id.x()