[OpenACC] Create AST nodes for 'data' constructs
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memory-legalizer-global-volatile.ll
blob2bf2e03cb0bd79dba8bf48bea8d90c286619d321
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd- -O0 -mcpu=gfx600 < %s | FileCheck --check-prefixes=GFX6 %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx700 < %s | FileCheck --check-prefixes=GFX7 %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1010 < %s | FileCheck --check-prefixes=GFX10-WGP %s
5 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1010 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX10-CU %s
6 ; RUN: llc -mtriple=amdgcn-amd-amdpal -O0 -mcpu=gfx700 -amdgcn-skip-cache-invalidations < %s | FileCheck --check-prefixes=SKIP-CACHE-INV %s
7 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1100 < %s | FileCheck --check-prefixes=GFX11-WGP %s
8 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1100 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX11-CU %s
9 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1200 < %s | FileCheck --check-prefixes=GFX12-WGP %s
10 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -O0 -mcpu=gfx1200 -mattr=+cumode < %s | FileCheck --check-prefixes=GFX12-CU %s
12 define amdgpu_kernel void @global_volatile_load_0(
13 ; GFX6-LABEL: global_volatile_load_0:
14 ; GFX6:       ; %bb.0: ; %entry
15 ; GFX6-NEXT:    s_mov_b64 s[0:1], s[4:5]
16 ; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
17 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
18 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
19 ; GFX6-NEXT:    s_mov_b32 s2, s5
20 ; GFX6-NEXT:    ; kill: def $sgpr4 killed $sgpr4 killed $sgpr4_sgpr5
21 ; GFX6-NEXT:    s_mov_b32 s8, 0xf000
22 ; GFX6-NEXT:    s_mov_b32 s9, -1
23 ; GFX6-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5_sgpr6_sgpr7
24 ; GFX6-NEXT:    s_mov_b32 s5, s2
25 ; GFX6-NEXT:    s_mov_b32 s6, s9
26 ; GFX6-NEXT:    s_mov_b32 s7, s8
27 ; GFX6-NEXT:    s_mov_b32 s10, s1
28 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
29 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
30 ; GFX6-NEXT:    s_mov_b32 s1, s10
31 ; GFX6-NEXT:    s_mov_b32 s2, s9
32 ; GFX6-NEXT:    s_mov_b32 s3, s8
33 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
34 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
35 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
36 ; GFX6-NEXT:    s_endpgm
38 ; GFX7-LABEL: global_volatile_load_0:
39 ; GFX7:       ; %bb.0: ; %entry
40 ; GFX7-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
41 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x2
42 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
43 ; GFX7-NEXT:    v_mov_b32_e32 v0, s6
44 ; GFX7-NEXT:    v_mov_b32_e32 v1, s7
45 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
46 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
47 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
48 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
49 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
50 ; GFX7-NEXT:    s_endpgm
52 ; GFX10-WGP-LABEL: global_volatile_load_0:
53 ; GFX10-WGP:       ; %bb.0: ; %entry
54 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
55 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
56 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
57 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
58 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[6:7] glc dlc
59 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
60 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
61 ; GFX10-WGP-NEXT:    s_endpgm
63 ; GFX10-CU-LABEL: global_volatile_load_0:
64 ; GFX10-CU:       ; %bb.0: ; %entry
65 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
66 ; GFX10-CU-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
67 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
68 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
69 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[6:7] glc dlc
70 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
71 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
72 ; GFX10-CU-NEXT:    s_endpgm
74 ; SKIP-CACHE-INV-LABEL: global_volatile_load_0:
75 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
76 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[0:1], s[4:5]
77 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
78 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
79 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
80 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s5
81 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr4 killed $sgpr4 killed $sgpr4_sgpr5
82 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, 0xf000
83 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s9, -1
84 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5_sgpr6_sgpr7
85 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s2
86 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, s9
87 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, s8
88 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s10, s1
89 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
90 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
91 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s1, s10
92 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s9
93 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s8
94 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0 glc
95 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
96 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
97 ; SKIP-CACHE-INV-NEXT:    s_endpgm
99 ; GFX11-WGP-LABEL: global_volatile_load_0:
100 ; GFX11-WGP:       ; %bb.0: ; %entry
101 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
102 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
103 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
104 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
105 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[2:3] glc dlc
106 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
107 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
108 ; GFX11-WGP-NEXT:    s_endpgm
110 ; GFX11-CU-LABEL: global_volatile_load_0:
111 ; GFX11-CU:       ; %bb.0: ; %entry
112 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
113 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
114 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
115 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
116 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[2:3] glc dlc
117 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
118 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
119 ; GFX11-CU-NEXT:    s_endpgm
121 ; GFX12-WGP-LABEL: global_volatile_load_0:
122 ; GFX12-WGP:       ; %bb.0: ; %entry
123 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v0, 0
124 ; GFX12-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
125 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
126 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
127 ; GFX12-WGP-NEXT:    global_load_b32 v1, v0, s[2:3] scope:SCOPE_SYS
128 ; GFX12-WGP-NEXT:    s_wait_bvhcnt 0x0
129 ; GFX12-WGP-NEXT:    s_wait_samplecnt 0x0
130 ; GFX12-WGP-NEXT:    s_wait_loadcnt 0x0
131 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
132 ; GFX12-WGP-NEXT:    s_endpgm
134 ; GFX12-CU-LABEL: global_volatile_load_0:
135 ; GFX12-CU:       ; %bb.0: ; %entry
136 ; GFX12-CU-NEXT:    v_mov_b32_e32 v0, 0
137 ; GFX12-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
138 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
139 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
140 ; GFX12-CU-NEXT:    global_load_b32 v1, v0, s[2:3] scope:SCOPE_SYS
141 ; GFX12-CU-NEXT:    s_wait_bvhcnt 0x0
142 ; GFX12-CU-NEXT:    s_wait_samplecnt 0x0
143 ; GFX12-CU-NEXT:    s_wait_loadcnt 0x0
144 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
145 ; GFX12-CU-NEXT:    s_endpgm
146     ptr addrspace(1) %in, ptr addrspace(1) %out) {
147 entry:
148   %val = load volatile i32, ptr addrspace(1) %in, align 4
149   store i32 %val, ptr addrspace(1) %out
150   ret void
153 define amdgpu_kernel void @global_volatile_load_1(
154 ; GFX6-LABEL: global_volatile_load_1:
155 ; GFX6:       ; %bb.0: ; %entry
156 ; GFX6-NEXT:    s_mov_b64 s[0:1], s[4:5]
157 ; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
158 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
159 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
160 ; GFX6-NEXT:    s_mov_b32 s8, s1
161 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
162 ; GFX6-NEXT:    s_mov_b32 s6, 0xf000
163 ; GFX6-NEXT:    s_mov_b32 s7, -1
164 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
165 ; GFX6-NEXT:    s_mov_b32 s1, s8
166 ; GFX6-NEXT:    s_mov_b32 s2, s7
167 ; GFX6-NEXT:    s_mov_b32 s3, s6
168 ; GFX6-NEXT:    s_mov_b32 s8, 0
169 ; GFX6-NEXT:    ; kill: def $sgpr8 killed $sgpr8 def $sgpr8_sgpr9
170 ; GFX6-NEXT:    s_mov_b32 s9, s6
171 ; GFX6-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
172 ; GFX6-NEXT:    s_mov_b64 s[6:7], s[8:9]
173 ; GFX6-NEXT:    s_mov_b32 s8, 2
174 ; GFX6-NEXT:    v_lshlrev_b32_e64 v0, s8, v0
175 ; GFX6-NEXT:    s_mov_b32 s8, 0
176 ; GFX6-NEXT:    ; implicit-def: $sgpr8
177 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0
178 ; GFX6-NEXT:    ; kill: def $vgpr0 killed $vgpr0 def $vgpr0_vgpr1 killed $exec
179 ; GFX6-NEXT:    v_mov_b32_e32 v1, v2
180 ; GFX6-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 glc
181 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
182 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
183 ; GFX6-NEXT:    s_endpgm
185 ; GFX7-LABEL: global_volatile_load_1:
186 ; GFX7:       ; %bb.0: ; %entry
187 ; GFX7-NEXT:    s_mov_b64 s[4:5], s[8:9]
188 ; GFX7-NEXT:    s_load_dwordx2 s[8:9], s[4:5], 0x0
189 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x2
190 ; GFX7-NEXT:    s_mov_b32 s6, 2
191 ; GFX7-NEXT:    v_lshlrev_b32_e64 v1, s6, v0
192 ; GFX7-NEXT:    s_mov_b32 s6, 0
193 ; GFX7-NEXT:    ; implicit-def: $sgpr6
194 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
195 ; GFX7-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
196 ; GFX7-NEXT:    v_mov_b32_e32 v2, v0
197 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
198 ; GFX7-NEXT:    s_mov_b32 s6, s8
199 ; GFX7-NEXT:    v_mov_b32_e32 v0, v1
200 ; GFX7-NEXT:    s_mov_b32 s8, s9
201 ; GFX7-NEXT:    ; kill: def $vgpr2 killed $vgpr2 killed $vgpr1_vgpr2 killed $exec
202 ; GFX7-NEXT:    v_add_i32_e64 v0, s[6:7], s6, v0
203 ; GFX7-NEXT:    v_mov_b32_e32 v1, s8
204 ; GFX7-NEXT:    v_addc_u32_e64 v2, s[6:7], v1, v2, s[6:7]
205 ; GFX7-NEXT:    ; kill: def $vgpr0 killed $vgpr0 def $vgpr0_vgpr1 killed $exec
206 ; GFX7-NEXT:    v_mov_b32_e32 v1, v2
207 ; GFX7-NEXT:    flat_load_dword v2, v[0:1] glc
208 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
209 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
210 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
211 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
212 ; GFX7-NEXT:    s_endpgm
214 ; GFX10-WGP-LABEL: global_volatile_load_1:
215 ; GFX10-WGP:       ; %bb.0: ; %entry
216 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, v0
217 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
218 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
219 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
220 ; GFX10-WGP-NEXT:    s_mov_b32 s8, 2
221 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e64 v1, s8, v1
222 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
223 ; GFX10-WGP-NEXT:    global_load_dword v1, v1, s[6:7] glc dlc
224 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
225 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
226 ; GFX10-WGP-NEXT:    s_endpgm
228 ; GFX10-CU-LABEL: global_volatile_load_1:
229 ; GFX10-CU:       ; %bb.0: ; %entry
230 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, v0
231 ; GFX10-CU-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
232 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
233 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
234 ; GFX10-CU-NEXT:    s_mov_b32 s8, 2
235 ; GFX10-CU-NEXT:    v_lshlrev_b32_e64 v1, s8, v1
236 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
237 ; GFX10-CU-NEXT:    global_load_dword v1, v1, s[6:7] glc dlc
238 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
239 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
240 ; GFX10-CU-NEXT:    s_endpgm
242 ; SKIP-CACHE-INV-LABEL: global_volatile_load_1:
243 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
244 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[0:1], s[4:5]
245 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
246 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
247 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
248 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, s1
249 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
250 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, 0xf000
251 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, -1
252 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
253 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s1, s8
254 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s7
255 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s6
256 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, 0
257 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr8 killed $sgpr8 def $sgpr8_sgpr9
258 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s9, s6
259 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
260 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[6:7], s[8:9]
261 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, 2
262 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e64 v0, s8, v0
263 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, 0
264 ; SKIP-CACHE-INV-NEXT:    ; implicit-def: $sgpr8
265 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, 0
266 ; SKIP-CACHE-INV-NEXT:    ; kill: def $vgpr0 killed $vgpr0 def $vgpr0_vgpr1 killed $exec
267 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, v2
268 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64 glc
269 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
270 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
271 ; SKIP-CACHE-INV-NEXT:    s_endpgm
273 ; GFX11-WGP-LABEL: global_volatile_load_1:
274 ; GFX11-WGP:       ; %bb.0: ; %entry
275 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, v0
276 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
277 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
278 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
279 ; GFX11-WGP-NEXT:    s_mov_b32 s4, 0x3ff
280 ; GFX11-WGP-NEXT:    v_and_b32_e64 v1, v1, s4
281 ; GFX11-WGP-NEXT:    s_mov_b32 s4, 2
282 ; GFX11-WGP-NEXT:    v_lshlrev_b32_e64 v1, s4, v1
283 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
284 ; GFX11-WGP-NEXT:    global_load_b32 v1, v1, s[2:3] glc dlc
285 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
286 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
287 ; GFX11-WGP-NEXT:    s_endpgm
289 ; GFX11-CU-LABEL: global_volatile_load_1:
290 ; GFX11-CU:       ; %bb.0: ; %entry
291 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, v0
292 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
293 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
294 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
295 ; GFX11-CU-NEXT:    s_mov_b32 s4, 0x3ff
296 ; GFX11-CU-NEXT:    v_and_b32_e64 v1, v1, s4
297 ; GFX11-CU-NEXT:    s_mov_b32 s4, 2
298 ; GFX11-CU-NEXT:    v_lshlrev_b32_e64 v1, s4, v1
299 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
300 ; GFX11-CU-NEXT:    global_load_b32 v1, v1, s[2:3] glc dlc
301 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
302 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
303 ; GFX11-CU-NEXT:    s_endpgm
305 ; GFX12-WGP-LABEL: global_volatile_load_1:
306 ; GFX12-WGP:       ; %bb.0: ; %entry
307 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v1, v0
308 ; GFX12-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
309 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
310 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v0, 0
311 ; GFX12-WGP-NEXT:    s_mov_b32 s4, 0x3ff
312 ; GFX12-WGP-NEXT:    s_wait_alu 0xfffe
313 ; GFX12-WGP-NEXT:    v_and_b32_e64 v1, v1, s4
314 ; GFX12-WGP-NEXT:    s_mov_b32 s4, 2
315 ; GFX12-WGP-NEXT:    s_wait_alu 0xfffe
316 ; GFX12-WGP-NEXT:    v_lshlrev_b32_e64 v1, s4, v1
317 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
318 ; GFX12-WGP-NEXT:    global_load_b32 v1, v1, s[2:3] scope:SCOPE_SYS
319 ; GFX12-WGP-NEXT:    s_wait_bvhcnt 0x0
320 ; GFX12-WGP-NEXT:    s_wait_samplecnt 0x0
321 ; GFX12-WGP-NEXT:    s_wait_loadcnt 0x0
322 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
323 ; GFX12-WGP-NEXT:    s_endpgm
325 ; GFX12-CU-LABEL: global_volatile_load_1:
326 ; GFX12-CU:       ; %bb.0: ; %entry
327 ; GFX12-CU-NEXT:    v_mov_b32_e32 v1, v0
328 ; GFX12-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
329 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
330 ; GFX12-CU-NEXT:    v_mov_b32_e32 v0, 0
331 ; GFX12-CU-NEXT:    s_mov_b32 s4, 0x3ff
332 ; GFX12-CU-NEXT:    s_wait_alu 0xfffe
333 ; GFX12-CU-NEXT:    v_and_b32_e64 v1, v1, s4
334 ; GFX12-CU-NEXT:    s_mov_b32 s4, 2
335 ; GFX12-CU-NEXT:    s_wait_alu 0xfffe
336 ; GFX12-CU-NEXT:    v_lshlrev_b32_e64 v1, s4, v1
337 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
338 ; GFX12-CU-NEXT:    global_load_b32 v1, v1, s[2:3] scope:SCOPE_SYS
339 ; GFX12-CU-NEXT:    s_wait_bvhcnt 0x0
340 ; GFX12-CU-NEXT:    s_wait_samplecnt 0x0
341 ; GFX12-CU-NEXT:    s_wait_loadcnt 0x0
342 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
343 ; GFX12-CU-NEXT:    s_endpgm
344     ptr addrspace(1) %in, ptr addrspace(1) %out) {
345 entry:
346   %tid = call i32 @llvm.amdgcn.workitem.id.x()
347   %val.gep = getelementptr inbounds i32, ptr addrspace(1) %in, i32 %tid
348   %val = load volatile i32, ptr addrspace(1) %val.gep, align 4
349   store i32 %val, ptr addrspace(1) %out
350   ret void
353 define amdgpu_kernel void @global_volatile_store_0(
354 ; GFX6-LABEL: global_volatile_store_0:
355 ; GFX6:       ; %bb.0: ; %entry
356 ; GFX6-NEXT:    s_mov_b64 s[0:1], s[4:5]
357 ; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
358 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
359 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
360 ; GFX6-NEXT:    s_mov_b32 s8, s1
361 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
362 ; GFX6-NEXT:    s_mov_b32 s6, 0xf000
363 ; GFX6-NEXT:    s_mov_b32 s7, -1
364 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
365 ; GFX6-NEXT:    s_mov_b32 s1, s8
366 ; GFX6-NEXT:    s_mov_b32 s2, s7
367 ; GFX6-NEXT:    s_mov_b32 s3, s6
368 ; GFX6-NEXT:    s_load_dword s4, s[4:5], 0x0
369 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
370 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
371 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
372 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
373 ; GFX6-NEXT:    s_endpgm
375 ; GFX7-LABEL: global_volatile_store_0:
376 ; GFX7:       ; %bb.0: ; %entry
377 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0
378 ; GFX7-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x2
379 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
380 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
381 ; GFX7-NEXT:    v_mov_b32_e32 v0, s6
382 ; GFX7-NEXT:    v_mov_b32_e32 v1, s7
383 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
384 ; GFX7-NEXT:    v_mov_b32_e32 v2, s4
385 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
386 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
387 ; GFX7-NEXT:    s_endpgm
389 ; GFX10-WGP-LABEL: global_volatile_store_0:
390 ; GFX10-WGP:       ; %bb.0: ; %entry
391 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
392 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
393 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
394 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
395 ; GFX10-WGP-NEXT:    s_load_dword s6, s[6:7], 0x0
396 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
397 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s6
398 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
399 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
400 ; GFX10-WGP-NEXT:    s_endpgm
402 ; GFX10-CU-LABEL: global_volatile_store_0:
403 ; GFX10-CU:       ; %bb.0: ; %entry
404 ; GFX10-CU-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
405 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
406 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
407 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
408 ; GFX10-CU-NEXT:    s_load_dword s6, s[6:7], 0x0
409 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
410 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s6
411 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
412 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
413 ; GFX10-CU-NEXT:    s_endpgm
415 ; SKIP-CACHE-INV-LABEL: global_volatile_store_0:
416 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
417 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[0:1], s[4:5]
418 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
419 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
420 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
421 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, s1
422 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
423 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, 0xf000
424 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, -1
425 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
426 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s1, s8
427 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s7
428 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s6
429 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[4:5], 0x0
430 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
431 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
432 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
433 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
434 ; SKIP-CACHE-INV-NEXT:    s_endpgm
436 ; GFX11-WGP-LABEL: global_volatile_store_0:
437 ; GFX11-WGP:       ; %bb.0: ; %entry
438 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
439 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
440 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
441 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
442 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[2:3], 0x0
443 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
444 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s2
445 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1] dlc
446 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
447 ; GFX11-WGP-NEXT:    s_endpgm
449 ; GFX11-CU-LABEL: global_volatile_store_0:
450 ; GFX11-CU:       ; %bb.0: ; %entry
451 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
452 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
453 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
454 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
455 ; GFX11-CU-NEXT:    s_load_b32 s2, s[2:3], 0x0
456 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
457 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s2
458 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1] dlc
459 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
460 ; GFX11-CU-NEXT:    s_endpgm
462 ; GFX12-WGP-LABEL: global_volatile_store_0:
463 ; GFX12-WGP:       ; %bb.0: ; %entry
464 ; GFX12-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
465 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
466 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v0, 0
467 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
468 ; GFX12-WGP-NEXT:    s_load_b32 s2, s[2:3], 0x0
469 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
470 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v1, s2
471 ; GFX12-WGP-NEXT:    s_wait_loadcnt 0x0
472 ; GFX12-WGP-NEXT:    s_wait_samplecnt 0x0
473 ; GFX12-WGP-NEXT:    s_wait_bvhcnt 0x0
474 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
475 ; GFX12-WGP-NEXT:    s_wait_storecnt 0x0
476 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1] scope:SCOPE_SYS
477 ; GFX12-WGP-NEXT:    s_wait_storecnt 0x0
478 ; GFX12-WGP-NEXT:    s_endpgm
480 ; GFX12-CU-LABEL: global_volatile_store_0:
481 ; GFX12-CU:       ; %bb.0: ; %entry
482 ; GFX12-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
483 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
484 ; GFX12-CU-NEXT:    v_mov_b32_e32 v0, 0
485 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
486 ; GFX12-CU-NEXT:    s_load_b32 s2, s[2:3], 0x0
487 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
488 ; GFX12-CU-NEXT:    v_mov_b32_e32 v1, s2
489 ; GFX12-CU-NEXT:    s_wait_loadcnt 0x0
490 ; GFX12-CU-NEXT:    s_wait_samplecnt 0x0
491 ; GFX12-CU-NEXT:    s_wait_bvhcnt 0x0
492 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
493 ; GFX12-CU-NEXT:    s_wait_storecnt 0x0
494 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1] scope:SCOPE_SYS
495 ; GFX12-CU-NEXT:    s_wait_storecnt 0x0
496 ; GFX12-CU-NEXT:    s_endpgm
497     ptr addrspace(1) %in, ptr addrspace(1) %out) {
498 entry:
499   %val = load i32, ptr addrspace(1) %in, align 4
500   store volatile i32 %val, ptr addrspace(1) %out
501   ret void
504 define amdgpu_kernel void @global_volatile_store_1(
505 ; GFX6-LABEL: global_volatile_store_1:
506 ; GFX6:       ; %bb.0: ; %entry
507 ; GFX6-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x9
508 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0xb
509 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
510 ; GFX6-NEXT:    s_load_dword s4, s[2:3], 0x0
511 ; GFX6-NEXT:    s_mov_b32 s2, 0xf000
512 ; GFX6-NEXT:    s_mov_b32 s6, 0
513 ; GFX6-NEXT:    ; kill: def $sgpr6 killed $sgpr6 def $sgpr6_sgpr7
514 ; GFX6-NEXT:    s_mov_b32 s7, s2
515 ; GFX6-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
516 ; GFX6-NEXT:    s_mov_b64 s[2:3], s[6:7]
517 ; GFX6-NEXT:    s_mov_b32 s5, 2
518 ; GFX6-NEXT:    v_lshlrev_b32_e64 v1, s5, v0
519 ; GFX6-NEXT:    s_mov_b32 s5, 0
520 ; GFX6-NEXT:    ; implicit-def: $sgpr5
521 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0
522 ; GFX6-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
523 ; GFX6-NEXT:    v_mov_b32_e32 v2, v0
524 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
525 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
526 ; GFX6-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
527 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
528 ; GFX6-NEXT:    s_endpgm
530 ; GFX7-LABEL: global_volatile_store_1:
531 ; GFX7:       ; %bb.0: ; %entry
532 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0
533 ; GFX7-NEXT:    s_load_dwordx2 s[8:9], s[8:9], 0x2
534 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
535 ; GFX7-NEXT:    s_load_dword s4, s[4:5], 0x0
536 ; GFX7-NEXT:    s_mov_b32 s5, 2
537 ; GFX7-NEXT:    v_lshlrev_b32_e64 v1, s5, v0
538 ; GFX7-NEXT:    s_mov_b32 s5, 0
539 ; GFX7-NEXT:    ; implicit-def: $sgpr5
540 ; GFX7-NEXT:    v_mov_b32_e32 v0, 0
541 ; GFX7-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
542 ; GFX7-NEXT:    v_mov_b32_e32 v2, v0
543 ; GFX7-NEXT:    s_mov_b32 s6, s8
544 ; GFX7-NEXT:    v_mov_b32_e32 v0, v1
545 ; GFX7-NEXT:    s_mov_b32 s5, s9
546 ; GFX7-NEXT:    ; kill: def $vgpr2 killed $vgpr2 killed $vgpr1_vgpr2 killed $exec
547 ; GFX7-NEXT:    v_add_i32_e64 v0, s[6:7], s6, v0
548 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
549 ; GFX7-NEXT:    v_addc_u32_e64 v2, s[6:7], v1, v2, s[6:7]
550 ; GFX7-NEXT:    ; kill: def $vgpr0 killed $vgpr0 def $vgpr0_vgpr1 killed $exec
551 ; GFX7-NEXT:    v_mov_b32_e32 v1, v2
552 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
553 ; GFX7-NEXT:    v_mov_b32_e32 v2, s4
554 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
555 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
556 ; GFX7-NEXT:    s_endpgm
558 ; GFX10-WGP-LABEL: global_volatile_store_1:
559 ; GFX10-WGP:       ; %bb.0: ; %entry
560 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
561 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
562 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
563 ; GFX10-WGP-NEXT:    s_load_dword s6, s[6:7], 0x0
564 ; GFX10-WGP-NEXT:    s_mov_b32 s7, 2
565 ; GFX10-WGP-NEXT:    v_lshlrev_b32_e64 v0, s7, v0
566 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
567 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s6
568 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
569 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
570 ; GFX10-WGP-NEXT:    s_endpgm
572 ; GFX10-CU-LABEL: global_volatile_store_1:
573 ; GFX10-CU:       ; %bb.0: ; %entry
574 ; GFX10-CU-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
575 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
576 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
577 ; GFX10-CU-NEXT:    s_load_dword s6, s[6:7], 0x0
578 ; GFX10-CU-NEXT:    s_mov_b32 s7, 2
579 ; GFX10-CU-NEXT:    v_lshlrev_b32_e64 v0, s7, v0
580 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
581 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s6
582 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
583 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
584 ; GFX10-CU-NEXT:    s_endpgm
586 ; SKIP-CACHE-INV-LABEL: global_volatile_store_1:
587 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
588 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[2:3], s[4:5], 0x0
589 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
590 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
591 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[2:3], 0x0
592 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, 0xf000
593 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, 0
594 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr6 killed $sgpr6 def $sgpr6_sgpr7
595 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, s2
596 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
597 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[2:3], s[6:7]
598 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, 2
599 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e64 v1, s5, v0
600 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, 0
601 ; SKIP-CACHE-INV-NEXT:    ; implicit-def: $sgpr5
602 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, 0
603 ; SKIP-CACHE-INV-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
604 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v2, v0
605 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
606 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
607 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
608 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
609 ; SKIP-CACHE-INV-NEXT:    s_endpgm
611 ; GFX11-WGP-LABEL: global_volatile_store_1:
612 ; GFX11-WGP:       ; %bb.0: ; %entry
613 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
614 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
615 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
616 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[2:3], 0x0
617 ; GFX11-WGP-NEXT:    s_mov_b32 s3, 0x3ff
618 ; GFX11-WGP-NEXT:    v_and_b32_e64 v0, v0, s3
619 ; GFX11-WGP-NEXT:    s_mov_b32 s3, 2
620 ; GFX11-WGP-NEXT:    v_lshlrev_b32_e64 v0, s3, v0
621 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
622 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s2
623 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1] dlc
624 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
625 ; GFX11-WGP-NEXT:    s_endpgm
627 ; GFX11-CU-LABEL: global_volatile_store_1:
628 ; GFX11-CU:       ; %bb.0: ; %entry
629 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
630 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
631 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
632 ; GFX11-CU-NEXT:    s_load_b32 s2, s[2:3], 0x0
633 ; GFX11-CU-NEXT:    s_mov_b32 s3, 0x3ff
634 ; GFX11-CU-NEXT:    v_and_b32_e64 v0, v0, s3
635 ; GFX11-CU-NEXT:    s_mov_b32 s3, 2
636 ; GFX11-CU-NEXT:    v_lshlrev_b32_e64 v0, s3, v0
637 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
638 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s2
639 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1] dlc
640 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
641 ; GFX11-CU-NEXT:    s_endpgm
643 ; GFX12-WGP-LABEL: global_volatile_store_1:
644 ; GFX12-WGP:       ; %bb.0: ; %entry
645 ; GFX12-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
646 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
647 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
648 ; GFX12-WGP-NEXT:    s_load_b32 s2, s[2:3], 0x0
649 ; GFX12-WGP-NEXT:    s_mov_b32 s3, 0x3ff
650 ; GFX12-WGP-NEXT:    s_wait_alu 0xfffe
651 ; GFX12-WGP-NEXT:    v_and_b32_e64 v0, v0, s3
652 ; GFX12-WGP-NEXT:    s_mov_b32 s3, 2
653 ; GFX12-WGP-NEXT:    s_wait_alu 0xfffe
654 ; GFX12-WGP-NEXT:    v_lshlrev_b32_e64 v0, s3, v0
655 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
656 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v1, s2
657 ; GFX12-WGP-NEXT:    s_wait_loadcnt 0x0
658 ; GFX12-WGP-NEXT:    s_wait_samplecnt 0x0
659 ; GFX12-WGP-NEXT:    s_wait_bvhcnt 0x0
660 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
661 ; GFX12-WGP-NEXT:    s_wait_storecnt 0x0
662 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1] scope:SCOPE_SYS
663 ; GFX12-WGP-NEXT:    s_wait_storecnt 0x0
664 ; GFX12-WGP-NEXT:    s_endpgm
666 ; GFX12-CU-LABEL: global_volatile_store_1:
667 ; GFX12-CU:       ; %bb.0: ; %entry
668 ; GFX12-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
669 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
670 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
671 ; GFX12-CU-NEXT:    s_load_b32 s2, s[2:3], 0x0
672 ; GFX12-CU-NEXT:    s_mov_b32 s3, 0x3ff
673 ; GFX12-CU-NEXT:    s_wait_alu 0xfffe
674 ; GFX12-CU-NEXT:    v_and_b32_e64 v0, v0, s3
675 ; GFX12-CU-NEXT:    s_mov_b32 s3, 2
676 ; GFX12-CU-NEXT:    s_wait_alu 0xfffe
677 ; GFX12-CU-NEXT:    v_lshlrev_b32_e64 v0, s3, v0
678 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
679 ; GFX12-CU-NEXT:    v_mov_b32_e32 v1, s2
680 ; GFX12-CU-NEXT:    s_wait_loadcnt 0x0
681 ; GFX12-CU-NEXT:    s_wait_samplecnt 0x0
682 ; GFX12-CU-NEXT:    s_wait_bvhcnt 0x0
683 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
684 ; GFX12-CU-NEXT:    s_wait_storecnt 0x0
685 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1] scope:SCOPE_SYS
686 ; GFX12-CU-NEXT:    s_wait_storecnt 0x0
687 ; GFX12-CU-NEXT:    s_endpgm
688     ptr addrspace(1) %in, ptr addrspace(1) %out) {
689 entry:
690   %tid = call i32 @llvm.amdgcn.workitem.id.x()
691   %val = load i32, ptr addrspace(1) %in, align 4
692   %out.gep = getelementptr inbounds i32, ptr addrspace(1) %out, i32 %tid
693   store volatile i32 %val, ptr addrspace(1) %out.gep
694   ret void
697 define amdgpu_kernel void @global_volatile_workgroup_acquire_load(
698 ; GFX6-LABEL: global_volatile_workgroup_acquire_load:
699 ; GFX6:       ; %bb.0: ; %entry
700 ; GFX6-NEXT:    s_mov_b64 s[0:1], s[4:5]
701 ; GFX6-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x9
702 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
703 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
704 ; GFX6-NEXT:    s_mov_b32 s2, s5
705 ; GFX6-NEXT:    ; kill: def $sgpr4 killed $sgpr4 killed $sgpr4_sgpr5
706 ; GFX6-NEXT:    s_mov_b32 s8, 0xf000
707 ; GFX6-NEXT:    s_mov_b32 s9, -1
708 ; GFX6-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5_sgpr6_sgpr7
709 ; GFX6-NEXT:    s_mov_b32 s5, s2
710 ; GFX6-NEXT:    s_mov_b32 s6, s9
711 ; GFX6-NEXT:    s_mov_b32 s7, s8
712 ; GFX6-NEXT:    s_mov_b32 s10, s1
713 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
714 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
715 ; GFX6-NEXT:    s_mov_b32 s1, s10
716 ; GFX6-NEXT:    s_mov_b32 s2, s9
717 ; GFX6-NEXT:    s_mov_b32 s3, s8
718 ; GFX6-NEXT:    buffer_load_dword v0, off, s[4:7], 0
719 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
720 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
721 ; GFX6-NEXT:    s_endpgm
723 ; GFX7-LABEL: global_volatile_workgroup_acquire_load:
724 ; GFX7:       ; %bb.0: ; %entry
725 ; GFX7-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
726 ; GFX7-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x2
727 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
728 ; GFX7-NEXT:    v_mov_b32_e32 v0, s6
729 ; GFX7-NEXT:    v_mov_b32_e32 v1, s7
730 ; GFX7-NEXT:    flat_load_dword v2, v[0:1]
731 ; GFX7-NEXT:    v_mov_b32_e32 v0, s4
732 ; GFX7-NEXT:    v_mov_b32_e32 v1, s5
733 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
734 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
735 ; GFX7-NEXT:    s_endpgm
737 ; GFX10-WGP-LABEL: global_volatile_workgroup_acquire_load:
738 ; GFX10-WGP:       ; %bb.0: ; %entry
739 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
740 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
741 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
742 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
743 ; GFX10-WGP-NEXT:    global_load_dword v1, v0, s[6:7] glc
744 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
745 ; GFX10-WGP-NEXT:    buffer_gl0_inv
746 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
747 ; GFX10-WGP-NEXT:    s_endpgm
749 ; GFX10-CU-LABEL: global_volatile_workgroup_acquire_load:
750 ; GFX10-CU:       ; %bb.0: ; %entry
751 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
752 ; GFX10-CU-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x0
753 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
754 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
755 ; GFX10-CU-NEXT:    global_load_dword v1, v0, s[6:7]
756 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
757 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
758 ; GFX10-CU-NEXT:    s_endpgm
760 ; SKIP-CACHE-INV-LABEL: global_volatile_workgroup_acquire_load:
761 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
762 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[0:1], s[4:5]
763 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x0
764 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
765 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
766 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s5
767 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr4 killed $sgpr4 killed $sgpr4_sgpr5
768 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s8, 0xf000
769 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s9, -1
770 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5_sgpr6_sgpr7
771 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, s2
772 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, s9
773 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, s8
774 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s10, s1
775 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
776 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
777 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s1, s10
778 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s9
779 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s8
780 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, off, s[4:7], 0
781 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
782 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
783 ; SKIP-CACHE-INV-NEXT:    s_endpgm
785 ; GFX11-WGP-LABEL: global_volatile_workgroup_acquire_load:
786 ; GFX11-WGP:       ; %bb.0: ; %entry
787 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
788 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
789 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
790 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
791 ; GFX11-WGP-NEXT:    global_load_b32 v1, v0, s[2:3] glc
792 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
793 ; GFX11-WGP-NEXT:    buffer_gl0_inv
794 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
795 ; GFX11-WGP-NEXT:    s_endpgm
797 ; GFX11-CU-LABEL: global_volatile_workgroup_acquire_load:
798 ; GFX11-CU:       ; %bb.0: ; %entry
799 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
800 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
801 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
802 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
803 ; GFX11-CU-NEXT:    global_load_b32 v1, v0, s[2:3]
804 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
805 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
806 ; GFX11-CU-NEXT:    s_endpgm
808 ; GFX12-WGP-LABEL: global_volatile_workgroup_acquire_load:
809 ; GFX12-WGP:       ; %bb.0: ; %entry
810 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v0, 0
811 ; GFX12-WGP-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
812 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
813 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
814 ; GFX12-WGP-NEXT:    global_load_b32 v1, v0, s[2:3] scope:SCOPE_SE
815 ; GFX12-WGP-NEXT:    s_wait_loadcnt 0x0
816 ; GFX12-WGP-NEXT:    global_inv scope:SCOPE_SE
817 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
818 ; GFX12-WGP-NEXT:    s_endpgm
820 ; GFX12-CU-LABEL: global_volatile_workgroup_acquire_load:
821 ; GFX12-CU:       ; %bb.0: ; %entry
822 ; GFX12-CU-NEXT:    v_mov_b32_e32 v0, 0
823 ; GFX12-CU-NEXT:    s_load_b64 s[2:3], s[4:5], 0x0
824 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
825 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
826 ; GFX12-CU-NEXT:    global_load_b32 v1, v0, s[2:3]
827 ; GFX12-CU-NEXT:    s_wait_loadcnt 0x0
828 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
829 ; GFX12-CU-NEXT:    s_endpgm
830     ptr addrspace(1) %in, ptr addrspace(1) %out) {
831 entry:
832   %val = load atomic volatile i32, ptr addrspace(1) %in syncscope("workgroup") acquire, align 4
833   store i32 %val, ptr addrspace(1) %out
834   ret void
837 define amdgpu_kernel void @global_volatile_workgroup_release_store(
838 ; GFX6-LABEL: global_volatile_workgroup_release_store:
839 ; GFX6:       ; %bb.0: ; %entry
840 ; GFX6-NEXT:    s_mov_b64 s[0:1], s[4:5]
841 ; GFX6-NEXT:    s_load_dword s4, s[0:1], 0x9
842 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
843 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
844 ; GFX6-NEXT:    s_mov_b32 s7, s1
845 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
846 ; GFX6-NEXT:    s_mov_b32 s5, 0xf000
847 ; GFX6-NEXT:    s_mov_b32 s6, -1
848 ; GFX6-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
849 ; GFX6-NEXT:    s_mov_b32 s1, s7
850 ; GFX6-NEXT:    s_mov_b32 s2, s6
851 ; GFX6-NEXT:    s_mov_b32 s3, s5
852 ; GFX6-NEXT:    v_mov_b32_e32 v0, s4
853 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
854 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
855 ; GFX6-NEXT:    s_endpgm
857 ; GFX7-LABEL: global_volatile_workgroup_release_store:
858 ; GFX7:       ; %bb.0: ; %entry
859 ; GFX7-NEXT:    s_load_dword s4, s[8:9], 0x0
860 ; GFX7-NEXT:    s_load_dwordx2 s[6:7], s[8:9], 0x2
861 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
862 ; GFX7-NEXT:    v_mov_b32_e32 v0, s6
863 ; GFX7-NEXT:    v_mov_b32_e32 v1, s7
864 ; GFX7-NEXT:    v_mov_b32_e32 v2, s4
865 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
866 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
867 ; GFX7-NEXT:    s_endpgm
869 ; GFX10-WGP-LABEL: global_volatile_workgroup_release_store:
870 ; GFX10-WGP:       ; %bb.0: ; %entry
871 ; GFX10-WGP-NEXT:    s_load_dword s6, s[8:9], 0x0
872 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
873 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, 0
874 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
875 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s6
876 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
877 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
878 ; GFX10-WGP-NEXT:    global_store_dword v0, v1, s[4:5]
879 ; GFX10-WGP-NEXT:    s_endpgm
881 ; GFX10-CU-LABEL: global_volatile_workgroup_release_store:
882 ; GFX10-CU:       ; %bb.0: ; %entry
883 ; GFX10-CU-NEXT:    s_load_dword s6, s[8:9], 0x0
884 ; GFX10-CU-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x8
885 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, 0
886 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
887 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s6
888 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
889 ; GFX10-CU-NEXT:    global_store_dword v0, v1, s[4:5]
890 ; GFX10-CU-NEXT:    s_endpgm
892 ; SKIP-CACHE-INV-LABEL: global_volatile_workgroup_release_store:
893 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
894 ; SKIP-CACHE-INV-NEXT:    s_mov_b64 s[0:1], s[4:5]
895 ; SKIP-CACHE-INV-NEXT:    s_load_dword s4, s[0:1], 0x0
896 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
897 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
898 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s7, s1
899 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 killed $sgpr0_sgpr1
900 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s5, 0xf000
901 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s6, -1
902 ; SKIP-CACHE-INV-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1_sgpr2_sgpr3
903 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s1, s7
904 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, s6
905 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, s5
906 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s4
907 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
908 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
909 ; SKIP-CACHE-INV-NEXT:    s_endpgm
911 ; GFX11-WGP-LABEL: global_volatile_workgroup_release_store:
912 ; GFX11-WGP:       ; %bb.0: ; %entry
913 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[4:5], 0x0
914 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
915 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, 0
916 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
917 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s2
918 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
919 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
920 ; GFX11-WGP-NEXT:    global_store_b32 v0, v1, s[0:1]
921 ; GFX11-WGP-NEXT:    s_endpgm
923 ; GFX11-CU-LABEL: global_volatile_workgroup_release_store:
924 ; GFX11-CU:       ; %bb.0: ; %entry
925 ; GFX11-CU-NEXT:    s_load_b32 s2, s[4:5], 0x0
926 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
927 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, 0
928 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
929 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s2
930 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
931 ; GFX11-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
932 ; GFX11-CU-NEXT:    s_endpgm
934 ; GFX12-WGP-LABEL: global_volatile_workgroup_release_store:
935 ; GFX12-WGP:       ; %bb.0: ; %entry
936 ; GFX12-WGP-NEXT:    s_load_b32 s2, s[4:5], 0x0
937 ; GFX12-WGP-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
938 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v0, 0
939 ; GFX12-WGP-NEXT:    s_wait_kmcnt 0x0
940 ; GFX12-WGP-NEXT:    v_mov_b32_e32 v1, s2
941 ; GFX12-WGP-NEXT:    s_wait_bvhcnt 0x0
942 ; GFX12-WGP-NEXT:    s_wait_samplecnt 0x0
943 ; GFX12-WGP-NEXT:    s_wait_storecnt 0x0
944 ; GFX12-WGP-NEXT:    s_wait_loadcnt_dscnt 0x0
945 ; GFX12-WGP-NEXT:    global_store_b32 v0, v1, s[0:1] scope:SCOPE_SE
946 ; GFX12-WGP-NEXT:    s_endpgm
948 ; GFX12-CU-LABEL: global_volatile_workgroup_release_store:
949 ; GFX12-CU:       ; %bb.0: ; %entry
950 ; GFX12-CU-NEXT:    s_load_b32 s2, s[4:5], 0x0
951 ; GFX12-CU-NEXT:    s_load_b64 s[0:1], s[4:5], 0x8
952 ; GFX12-CU-NEXT:    v_mov_b32_e32 v0, 0
953 ; GFX12-CU-NEXT:    s_wait_kmcnt 0x0
954 ; GFX12-CU-NEXT:    v_mov_b32_e32 v1, s2
955 ; GFX12-CU-NEXT:    s_wait_dscnt 0x0
956 ; GFX12-CU-NEXT:    global_store_b32 v0, v1, s[0:1]
957 ; GFX12-CU-NEXT:    s_endpgm
958    i32 %in, ptr addrspace(1) %out) {
959 entry:
960   store atomic volatile i32 %in, ptr addrspace(1) %out syncscope("workgroup") release, align 4
961   ret void
964 declare i32 @llvm.amdgcn.workitem.id.x()