Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memory-legalizer-private-volatile.ll
blob5b4a1059aee0468c7e608d5960d3207487a7cdaa
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 @private_volatile_load_0(
11 ; GFX6-LABEL: private_volatile_load_0:
12 ; GFX6:       ; %bb.0: ; %entry
13 ; GFX6-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
14 ; GFX6-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
15 ; GFX6-NEXT:    s_load_dword s2, s[0:1], 0x9
16 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
17 ; GFX6-NEXT:    s_mov_b32 s6, -1
18 ; GFX6-NEXT:    s_mov_b32 s7, 0xe8f000
19 ; GFX6-NEXT:    s_add_u32 s4, s4, s3
20 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
21 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
22 ; GFX6-NEXT:    v_mov_b32_e32 v0, s2
23 ; GFX6-NEXT:    buffer_load_dword v0, v0, s[4:7], 0 offen glc
24 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
25 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
26 ; GFX6-NEXT:    s_mov_b32 s2, -1
27 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
28 ; GFX6-NEXT:    s_endpgm
30 ; GFX7-LABEL: private_volatile_load_0:
31 ; GFX7:       ; %bb.0: ; %entry
32 ; GFX7-NEXT:    s_mov_b64 s[10:11], s[2:3]
33 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[0:1]
34 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
35 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
36 ; GFX7-NEXT:    s_add_u32 s8, s8, s7
37 ; GFX7-NEXT:    s_addc_u32 s9, s9, 0
38 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
39 ; GFX7-NEXT:    v_mov_b32_e32 v0, s2
40 ; GFX7-NEXT:    buffer_load_dword v2, v0, s[8:11], 0 offen glc
41 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
42 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
43 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
44 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
45 ; GFX7-NEXT:    s_endpgm
47 ; GFX10-WGP-LABEL: private_volatile_load_0:
48 ; GFX10-WGP:       ; %bb.0: ; %entry
49 ; GFX10-WGP-NEXT:    s_mov_b64 s[10:11], s[2:3]
50 ; GFX10-WGP-NEXT:    s_mov_b64 s[8:9], s[0:1]
51 ; GFX10-WGP-NEXT:    s_clause 0x1
52 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
53 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
54 ; GFX10-WGP-NEXT:    s_add_u32 s8, s8, s7
55 ; GFX10-WGP-NEXT:    s_addc_u32 s9, s9, 0
56 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, 0
57 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
58 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s2
59 ; GFX10-WGP-NEXT:    buffer_load_dword v0, v0, s[8:11], 0 offen glc dlc
60 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
61 ; GFX10-WGP-NEXT:    global_store_dword v1, v0, s[0:1]
62 ; GFX10-WGP-NEXT:    s_endpgm
64 ; GFX10-CU-LABEL: private_volatile_load_0:
65 ; GFX10-CU:       ; %bb.0: ; %entry
66 ; GFX10-CU-NEXT:    s_mov_b64 s[10:11], s[2:3]
67 ; GFX10-CU-NEXT:    s_mov_b64 s[8:9], s[0:1]
68 ; GFX10-CU-NEXT:    s_clause 0x1
69 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
70 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
71 ; GFX10-CU-NEXT:    s_add_u32 s8, s8, s7
72 ; GFX10-CU-NEXT:    s_addc_u32 s9, s9, 0
73 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, 0
74 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
75 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s2
76 ; GFX10-CU-NEXT:    buffer_load_dword v0, v0, s[8:11], 0 offen glc dlc
77 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
78 ; GFX10-CU-NEXT:    global_store_dword v1, v0, s[0:1]
79 ; GFX10-CU-NEXT:    s_endpgm
81 ; SKIP-CACHE-INV-LABEL: private_volatile_load_0:
82 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
83 ; SKIP-CACHE-INV-NEXT:    s_getpc_b64 s[4:5]
84 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
85 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
86 ; SKIP-CACHE-INV-NEXT:    s_load_dword s2, s[0:1], 0x0
87 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
88 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
89 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s2
90 ; SKIP-CACHE-INV-NEXT:    s_add_u32 s4, s4, s3
91 ; SKIP-CACHE-INV-NEXT:    s_addc_u32 s5, s5, 0
92 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, v0, s[4:7], 0 offen glc
93 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
94 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
95 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
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: private_volatile_load_0:
100 ; GFX11-WGP:       ; %bb.0: ; %entry
101 ; GFX11-WGP-NEXT:    s_clause 0x1
102 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
103 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
104 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, 0
105 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
106 ; GFX11-WGP-NEXT:    scratch_load_b32 v0, off, s2 glc dlc
107 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
108 ; GFX11-WGP-NEXT:    global_store_b32 v1, v0, s[0:1]
109 ; GFX11-WGP-NEXT:    s_nop 0
110 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
111 ; GFX11-WGP-NEXT:    s_endpgm
113 ; GFX11-CU-LABEL: private_volatile_load_0:
114 ; GFX11-CU:       ; %bb.0: ; %entry
115 ; GFX11-CU-NEXT:    s_clause 0x1
116 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
117 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
118 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, 0
119 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
120 ; GFX11-CU-NEXT:    scratch_load_b32 v0, off, s2 glc dlc
121 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
122 ; GFX11-CU-NEXT:    global_store_b32 v1, v0, s[0:1]
123 ; GFX11-CU-NEXT:    s_nop 0
124 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
125 ; GFX11-CU-NEXT:    s_endpgm
126     ptr addrspace(5) %in, ptr addrspace(1) %out) {
127 entry:
128   %val = load volatile i32, ptr addrspace(5) %in, align 4
129   store i32 %val, ptr addrspace(1) %out
130   ret void
133 define amdgpu_kernel void @private_volatile_load_1(
134 ; GFX6-LABEL: private_volatile_load_1:
135 ; GFX6:       ; %bb.0: ; %entry
136 ; GFX6-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
137 ; GFX6-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
138 ; GFX6-NEXT:    s_load_dword s2, s[0:1], 0x9
139 ; GFX6-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0xb
140 ; GFX6-NEXT:    s_mov_b32 s6, -1
141 ; GFX6-NEXT:    s_mov_b32 s7, 0xe8f000
142 ; GFX6-NEXT:    s_add_u32 s4, s4, s3
143 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
144 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
145 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
146 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
147 ; GFX6-NEXT:    buffer_load_dword v0, v0, s[4:7], 0 offen glc
148 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
149 ; GFX6-NEXT:    s_mov_b32 s3, 0xf000
150 ; GFX6-NEXT:    s_mov_b32 s2, -1
151 ; GFX6-NEXT:    buffer_store_dword v0, off, s[0:3], 0
152 ; GFX6-NEXT:    s_endpgm
154 ; GFX7-LABEL: private_volatile_load_1:
155 ; GFX7:       ; %bb.0: ; %entry
156 ; GFX7-NEXT:    s_mov_b64 s[10:11], s[2:3]
157 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[0:1]
158 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x0
159 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
160 ; GFX7-NEXT:    s_add_u32 s8, s8, s7
161 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
162 ; GFX7-NEXT:    s_addc_u32 s9, s9, 0
163 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
164 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
165 ; GFX7-NEXT:    buffer_load_dword v2, v0, s[8:11], 0 offen glc
166 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
167 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
168 ; GFX7-NEXT:    v_mov_b32_e32 v1, s1
169 ; GFX7-NEXT:    flat_store_dword v[0:1], v2
170 ; GFX7-NEXT:    s_endpgm
172 ; GFX10-WGP-LABEL: private_volatile_load_1:
173 ; GFX10-WGP:       ; %bb.0: ; %entry
174 ; GFX10-WGP-NEXT:    s_mov_b64 s[10:11], s[2:3]
175 ; GFX10-WGP-NEXT:    s_mov_b64 s[8:9], s[0:1]
176 ; GFX10-WGP-NEXT:    s_clause 0x1
177 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x0
178 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
179 ; GFX10-WGP-NEXT:    s_add_u32 s8, s8, s7
180 ; GFX10-WGP-NEXT:    s_addc_u32 s9, s9, 0
181 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, 0
182 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
183 ; GFX10-WGP-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
184 ; GFX10-WGP-NEXT:    buffer_load_dword v0, v0, s[8:11], 0 offen glc dlc
185 ; GFX10-WGP-NEXT:    s_waitcnt vmcnt(0)
186 ; GFX10-WGP-NEXT:    global_store_dword v1, v0, s[0:1]
187 ; GFX10-WGP-NEXT:    s_endpgm
189 ; GFX10-CU-LABEL: private_volatile_load_1:
190 ; GFX10-CU:       ; %bb.0: ; %entry
191 ; GFX10-CU-NEXT:    s_mov_b64 s[10:11], s[2:3]
192 ; GFX10-CU-NEXT:    s_mov_b64 s[8:9], s[0:1]
193 ; GFX10-CU-NEXT:    s_clause 0x1
194 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x0
195 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x8
196 ; GFX10-CU-NEXT:    s_add_u32 s8, s8, s7
197 ; GFX10-CU-NEXT:    s_addc_u32 s9, s9, 0
198 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, 0
199 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
200 ; GFX10-CU-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
201 ; GFX10-CU-NEXT:    buffer_load_dword v0, v0, s[8:11], 0 offen glc dlc
202 ; GFX10-CU-NEXT:    s_waitcnt vmcnt(0)
203 ; GFX10-CU-NEXT:    global_store_dword v1, v0, s[0:1]
204 ; GFX10-CU-NEXT:    s_endpgm
206 ; SKIP-CACHE-INV-LABEL: private_volatile_load_1:
207 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
208 ; SKIP-CACHE-INV-NEXT:    s_getpc_b64 s[4:5]
209 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
210 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
211 ; SKIP-CACHE-INV-NEXT:    s_load_dword s2, s[0:1], 0x0
212 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x2
213 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
214 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
215 ; SKIP-CACHE-INV-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
216 ; SKIP-CACHE-INV-NEXT:    s_add_u32 s4, s4, s3
217 ; SKIP-CACHE-INV-NEXT:    s_addc_u32 s5, s5, 0
218 ; SKIP-CACHE-INV-NEXT:    buffer_load_dword v0, v0, s[4:7], 0 offen glc
219 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
220 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s3, 0xf000
221 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s2, -1
222 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, off, s[0:3], 0
223 ; SKIP-CACHE-INV-NEXT:    s_endpgm
225 ; GFX11-WGP-LABEL: private_volatile_load_1:
226 ; GFX11-WGP:       ; %bb.0: ; %entry
227 ; GFX11-WGP-NEXT:    s_clause 0x1
228 ; GFX11-WGP-NEXT:    s_load_b32 s2, s[0:1], 0x0
229 ; GFX11-WGP-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
230 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, 0
231 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
232 ; GFX11-WGP-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
233 ; GFX11-WGP-NEXT:    scratch_load_b32 v0, v0, off glc dlc
234 ; GFX11-WGP-NEXT:    s_waitcnt vmcnt(0)
235 ; GFX11-WGP-NEXT:    global_store_b32 v1, v0, s[0:1]
236 ; GFX11-WGP-NEXT:    s_nop 0
237 ; GFX11-WGP-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
238 ; GFX11-WGP-NEXT:    s_endpgm
240 ; GFX11-CU-LABEL: private_volatile_load_1:
241 ; GFX11-CU:       ; %bb.0: ; %entry
242 ; GFX11-CU-NEXT:    s_clause 0x1
243 ; GFX11-CU-NEXT:    s_load_b32 s2, s[0:1], 0x0
244 ; GFX11-CU-NEXT:    s_load_b64 s[0:1], s[0:1], 0x8
245 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, 0
246 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
247 ; GFX11-CU-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
248 ; GFX11-CU-NEXT:    scratch_load_b32 v0, v0, off glc dlc
249 ; GFX11-CU-NEXT:    s_waitcnt vmcnt(0)
250 ; GFX11-CU-NEXT:    global_store_b32 v1, v0, s[0:1]
251 ; GFX11-CU-NEXT:    s_nop 0
252 ; GFX11-CU-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
253 ; GFX11-CU-NEXT:    s_endpgm
254     ptr addrspace(5) %in, ptr addrspace(1) %out) {
255 entry:
256   %tid = call i32 @llvm.amdgcn.workitem.id.x()
257   %val.gep = getelementptr inbounds i32, ptr addrspace(5) %in, i32 %tid
258   %val = load volatile i32, ptr addrspace(5) %val.gep, align 4
259   store i32 %val, ptr addrspace(1) %out
260   ret void
263 define amdgpu_kernel void @private_volatile_store_0(
264 ; GFX6-LABEL: private_volatile_store_0:
265 ; GFX6:       ; %bb.0: ; %entry
266 ; GFX6-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
267 ; GFX6-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
268 ; GFX6-NEXT:    s_mov_b32 s6, -1
269 ; GFX6-NEXT:    s_mov_b32 s7, 0xe8f000
270 ; GFX6-NEXT:    s_add_u32 s4, s4, s3
271 ; GFX6-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x9
272 ; GFX6-NEXT:    s_load_dword s0, s[0:1], 0xb
273 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
274 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
275 ; GFX6-NEXT:    s_load_dword s1, s[2:3], 0x0
276 ; GFX6-NEXT:    v_mov_b32_e32 v1, s0
277 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
278 ; GFX6-NEXT:    v_mov_b32_e32 v0, s1
279 ; GFX6-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
280 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
281 ; GFX6-NEXT:    s_endpgm
283 ; GFX7-LABEL: private_volatile_store_0:
284 ; GFX7:       ; %bb.0: ; %entry
285 ; GFX7-NEXT:    s_mov_b64 s[10:11], s[2:3]
286 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[0:1]
287 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
288 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
289 ; GFX7-NEXT:    s_add_u32 s8, s8, s7
290 ; GFX7-NEXT:    s_addc_u32 s9, s9, 0
291 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
292 ; GFX7-NEXT:    s_load_dword s0, s[0:1], 0x0
293 ; GFX7-NEXT:    v_mov_b32_e32 v1, s2
294 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
295 ; GFX7-NEXT:    v_mov_b32_e32 v0, s0
296 ; GFX7-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
297 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
298 ; GFX7-NEXT:    s_endpgm
300 ; GFX10-WGP-LABEL: private_volatile_store_0:
301 ; GFX10-WGP:       ; %bb.0: ; %entry
302 ; GFX10-WGP-NEXT:    s_mov_b64 s[10:11], s[2:3]
303 ; GFX10-WGP-NEXT:    s_mov_b64 s[8:9], s[0:1]
304 ; GFX10-WGP-NEXT:    s_clause 0x1
305 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
306 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
307 ; GFX10-WGP-NEXT:    s_add_u32 s8, s8, s7
308 ; GFX10-WGP-NEXT:    s_addc_u32 s9, s9, 0
309 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
310 ; GFX10-WGP-NEXT:    s_load_dword s0, s[0:1], 0x0
311 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s2
312 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
313 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v0, s0
314 ; GFX10-WGP-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
315 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
316 ; GFX10-WGP-NEXT:    s_endpgm
318 ; GFX10-CU-LABEL: private_volatile_store_0:
319 ; GFX10-CU:       ; %bb.0: ; %entry
320 ; GFX10-CU-NEXT:    s_mov_b64 s[10:11], s[2:3]
321 ; GFX10-CU-NEXT:    s_mov_b64 s[8:9], s[0:1]
322 ; GFX10-CU-NEXT:    s_clause 0x1
323 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
324 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
325 ; GFX10-CU-NEXT:    s_add_u32 s8, s8, s7
326 ; GFX10-CU-NEXT:    s_addc_u32 s9, s9, 0
327 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
328 ; GFX10-CU-NEXT:    s_load_dword s0, s[0:1], 0x0
329 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s2
330 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
331 ; GFX10-CU-NEXT:    v_mov_b32_e32 v0, s0
332 ; GFX10-CU-NEXT:    buffer_store_dword v0, v1, s[8:11], 0 offen
333 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
334 ; GFX10-CU-NEXT:    s_endpgm
336 ; SKIP-CACHE-INV-LABEL: private_volatile_store_0:
337 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
338 ; SKIP-CACHE-INV-NEXT:    s_getpc_b64 s[4:5]
339 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
340 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
341 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
342 ; SKIP-CACHE-INV-NEXT:    s_add_u32 s4, s4, s3
343 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
344 ; SKIP-CACHE-INV-NEXT:    s_load_dword s0, s[0:1], 0x2
345 ; SKIP-CACHE-INV-NEXT:    s_addc_u32 s5, s5, 0
346 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
347 ; SKIP-CACHE-INV-NEXT:    s_load_dword s1, s[2:3], 0x0
348 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s0
349 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
350 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v0, s1
351 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v0, v1, s[4:7], 0 offen
352 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
353 ; SKIP-CACHE-INV-NEXT:    s_endpgm
355 ; GFX11-WGP-LABEL: private_volatile_store_0:
356 ; GFX11-WGP:       ; %bb.0: ; %entry
357 ; GFX11-WGP-NEXT:    s_clause 0x1
358 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[0:1], 0x0
359 ; GFX11-WGP-NEXT:    s_load_b32 s0, s[0:1], 0x8
360 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
361 ; GFX11-WGP-NEXT:    s_load_b32 s1, s[2:3], 0x0
362 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
363 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v0, s1
364 ; GFX11-WGP-NEXT:    scratch_store_b32 off, v0, s0 dlc
365 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
366 ; GFX11-WGP-NEXT:    s_endpgm
368 ; GFX11-CU-LABEL: private_volatile_store_0:
369 ; GFX11-CU:       ; %bb.0: ; %entry
370 ; GFX11-CU-NEXT:    s_clause 0x1
371 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[0:1], 0x0
372 ; GFX11-CU-NEXT:    s_load_b32 s0, s[0:1], 0x8
373 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
374 ; GFX11-CU-NEXT:    s_load_b32 s1, s[2:3], 0x0
375 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
376 ; GFX11-CU-NEXT:    v_mov_b32_e32 v0, s1
377 ; GFX11-CU-NEXT:    scratch_store_b32 off, v0, s0 dlc
378 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
379 ; GFX11-CU-NEXT:    s_endpgm
380     ptr addrspace(1) %in, ptr addrspace(5) %out) {
381 entry:
382   %val = load i32, ptr addrspace(1) %in, align 4
383   store volatile i32 %val, ptr addrspace(5) %out
384   ret void
387 define amdgpu_kernel void @private_volatile_store_1(
388 ; GFX6-LABEL: private_volatile_store_1:
389 ; GFX6:       ; %bb.0: ; %entry
390 ; GFX6-NEXT:    s_mov_b32 s4, SCRATCH_RSRC_DWORD0
391 ; GFX6-NEXT:    s_mov_b32 s5, SCRATCH_RSRC_DWORD1
392 ; GFX6-NEXT:    s_mov_b32 s6, -1
393 ; GFX6-NEXT:    s_mov_b32 s7, 0xe8f000
394 ; GFX6-NEXT:    s_add_u32 s4, s4, s3
395 ; GFX6-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x9
396 ; GFX6-NEXT:    s_load_dword s0, s[0:1], 0xb
397 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
398 ; GFX6-NEXT:    s_addc_u32 s5, s5, 0
399 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
400 ; GFX6-NEXT:    s_load_dword s1, s[2:3], 0x0
401 ; GFX6-NEXT:    v_add_i32_e32 v0, vcc, s0, v0
402 ; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
403 ; GFX6-NEXT:    v_mov_b32_e32 v1, s1
404 ; GFX6-NEXT:    buffer_store_dword v1, v0, s[4:7], 0 offen
405 ; GFX6-NEXT:    s_waitcnt vmcnt(0)
406 ; GFX6-NEXT:    s_endpgm
408 ; GFX7-LABEL: private_volatile_store_1:
409 ; GFX7:       ; %bb.0: ; %entry
410 ; GFX7-NEXT:    s_mov_b64 s[10:11], s[2:3]
411 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[0:1]
412 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
413 ; GFX7-NEXT:    s_load_dword s2, s[4:5], 0x2
414 ; GFX7-NEXT:    s_add_u32 s8, s8, s7
415 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
416 ; GFX7-NEXT:    s_addc_u32 s9, s9, 0
417 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
418 ; GFX7-NEXT:    s_load_dword s0, s[0:1], 0x0
419 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s2, v0
420 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
421 ; GFX7-NEXT:    v_mov_b32_e32 v1, s0
422 ; GFX7-NEXT:    buffer_store_dword v1, v0, s[8:11], 0 offen
423 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
424 ; GFX7-NEXT:    s_endpgm
426 ; GFX10-WGP-LABEL: private_volatile_store_1:
427 ; GFX10-WGP:       ; %bb.0: ; %entry
428 ; GFX10-WGP-NEXT:    s_mov_b64 s[10:11], s[2:3]
429 ; GFX10-WGP-NEXT:    s_mov_b64 s[8:9], s[0:1]
430 ; GFX10-WGP-NEXT:    s_clause 0x1
431 ; GFX10-WGP-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
432 ; GFX10-WGP-NEXT:    s_load_dword s2, s[4:5], 0x8
433 ; GFX10-WGP-NEXT:    s_add_u32 s8, s8, s7
434 ; GFX10-WGP-NEXT:    s_addc_u32 s9, s9, 0
435 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
436 ; GFX10-WGP-NEXT:    s_load_dword s0, s[0:1], 0x0
437 ; GFX10-WGP-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
438 ; GFX10-WGP-NEXT:    s_waitcnt lgkmcnt(0)
439 ; GFX10-WGP-NEXT:    v_mov_b32_e32 v1, s0
440 ; GFX10-WGP-NEXT:    buffer_store_dword v1, v0, s[8:11], 0 offen
441 ; GFX10-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
442 ; GFX10-WGP-NEXT:    s_endpgm
444 ; GFX10-CU-LABEL: private_volatile_store_1:
445 ; GFX10-CU:       ; %bb.0: ; %entry
446 ; GFX10-CU-NEXT:    s_mov_b64 s[10:11], s[2:3]
447 ; GFX10-CU-NEXT:    s_mov_b64 s[8:9], s[0:1]
448 ; GFX10-CU-NEXT:    s_clause 0x1
449 ; GFX10-CU-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
450 ; GFX10-CU-NEXT:    s_load_dword s2, s[4:5], 0x8
451 ; GFX10-CU-NEXT:    s_add_u32 s8, s8, s7
452 ; GFX10-CU-NEXT:    s_addc_u32 s9, s9, 0
453 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
454 ; GFX10-CU-NEXT:    s_load_dword s0, s[0:1], 0x0
455 ; GFX10-CU-NEXT:    v_lshl_add_u32 v0, v0, 2, s2
456 ; GFX10-CU-NEXT:    s_waitcnt lgkmcnt(0)
457 ; GFX10-CU-NEXT:    v_mov_b32_e32 v1, s0
458 ; GFX10-CU-NEXT:    buffer_store_dword v1, v0, s[8:11], 0 offen
459 ; GFX10-CU-NEXT:    s_waitcnt_vscnt null, 0x0
460 ; GFX10-CU-NEXT:    s_endpgm
462 ; SKIP-CACHE-INV-LABEL: private_volatile_store_1:
463 ; SKIP-CACHE-INV:       ; %bb.0: ; %entry
464 ; SKIP-CACHE-INV-NEXT:    s_getpc_b64 s[4:5]
465 ; SKIP-CACHE-INV-NEXT:    s_mov_b32 s4, s0
466 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx4 s[4:7], s[4:5], 0x0
467 ; SKIP-CACHE-INV-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
468 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
469 ; SKIP-CACHE-INV-NEXT:    s_add_u32 s4, s4, s3
470 ; SKIP-CACHE-INV-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x0
471 ; SKIP-CACHE-INV-NEXT:    s_load_dword s0, s[0:1], 0x2
472 ; SKIP-CACHE-INV-NEXT:    s_addc_u32 s5, s5, 0
473 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
474 ; SKIP-CACHE-INV-NEXT:    s_load_dword s1, s[2:3], 0x0
475 ; SKIP-CACHE-INV-NEXT:    v_add_i32_e32 v0, vcc, s0, v0
476 ; SKIP-CACHE-INV-NEXT:    s_waitcnt lgkmcnt(0)
477 ; SKIP-CACHE-INV-NEXT:    v_mov_b32_e32 v1, s1
478 ; SKIP-CACHE-INV-NEXT:    buffer_store_dword v1, v0, s[4:7], 0 offen
479 ; SKIP-CACHE-INV-NEXT:    s_waitcnt vmcnt(0)
480 ; SKIP-CACHE-INV-NEXT:    s_endpgm
482 ; GFX11-WGP-LABEL: private_volatile_store_1:
483 ; GFX11-WGP:       ; %bb.0: ; %entry
484 ; GFX11-WGP-NEXT:    s_clause 0x1
485 ; GFX11-WGP-NEXT:    s_load_b64 s[2:3], s[0:1], 0x0
486 ; GFX11-WGP-NEXT:    s_load_b32 s0, s[0:1], 0x8
487 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
488 ; GFX11-WGP-NEXT:    s_load_b32 s1, s[2:3], 0x0
489 ; GFX11-WGP-NEXT:    v_lshl_add_u32 v0, v0, 2, s0
490 ; GFX11-WGP-NEXT:    s_waitcnt lgkmcnt(0)
491 ; GFX11-WGP-NEXT:    v_mov_b32_e32 v1, s1
492 ; GFX11-WGP-NEXT:    scratch_store_b32 v0, v1, off dlc
493 ; GFX11-WGP-NEXT:    s_waitcnt_vscnt null, 0x0
494 ; GFX11-WGP-NEXT:    s_endpgm
496 ; GFX11-CU-LABEL: private_volatile_store_1:
497 ; GFX11-CU:       ; %bb.0: ; %entry
498 ; GFX11-CU-NEXT:    s_clause 0x1
499 ; GFX11-CU-NEXT:    s_load_b64 s[2:3], s[0:1], 0x0
500 ; GFX11-CU-NEXT:    s_load_b32 s0, s[0:1], 0x8
501 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
502 ; GFX11-CU-NEXT:    s_load_b32 s1, s[2:3], 0x0
503 ; GFX11-CU-NEXT:    v_lshl_add_u32 v0, v0, 2, s0
504 ; GFX11-CU-NEXT:    s_waitcnt lgkmcnt(0)
505 ; GFX11-CU-NEXT:    v_mov_b32_e32 v1, s1
506 ; GFX11-CU-NEXT:    scratch_store_b32 v0, v1, off dlc
507 ; GFX11-CU-NEXT:    s_waitcnt_vscnt null, 0x0
508 ; GFX11-CU-NEXT:    s_endpgm
509     ptr addrspace(1) %in, ptr addrspace(5) %out) {
510 entry:
511   %tid = call i32 @llvm.amdgcn.workitem.id.x()
512   %val = load i32, ptr addrspace(1) %in, align 4
513   %out.gep = getelementptr inbounds i32, ptr addrspace(5) %out, i32 %tid
514   store volatile i32 %val, ptr addrspace(5) %out.gep
515   ret void
518 declare i32 @llvm.amdgcn.workitem.id.x()