[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / lds-global-non-entry-func.ll
blob7ba4b314ebdb86c6d77438394ba2a79c85115f77
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -o - -amdgpu-enable-lower-module-lds=false %s 2> %t | FileCheck -check-prefixes=GFX8,GFX8-SDAG %s
3 ; RUN: FileCheck -check-prefix=ERR %s < %t
5 ; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -o - -amdgpu-enable-lower-module-lds=false %s 2> %t | FileCheck -check-prefixes=GFX8,GFX8-GISEL %s
6 ; RUN: FileCheck -check-prefix=ERR %s < %t
8 ; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -o - -amdgpu-enable-lower-module-lds=false %s 2> %t | FileCheck -check-prefixes=GFX9,GFX9-SDAG %s
9 ; RUN: FileCheck -check-prefix=ERR %s < %t
11 ; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -o - -amdgpu-enable-lower-module-lds=false %s 2> %t | FileCheck -check-prefixes=GFX9,GFX9-GISEL %s
12 ; RUN: FileCheck -check-prefix=ERR %s < %t
14 ; Test there's no verifier error if a function directly uses LDS and
15 ; we emit a trap. The s_endpgm needs to be emitted in a terminator
16 ; position.
18 ; RUN: llc -global-isel=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s 2> %t | FileCheck -check-prefixes=CHECK,SDAG %s
19 ; RUN: FileCheck -check-prefix=ERR %s < %t
21 ; RUN: llc -global-isel=1 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -verify-machineinstrs < %s 2> %t | FileCheck -check-prefixes=CHECK,GISEL %s
22 ; RUN: FileCheck -check-prefix=ERR %s < %t
25 @lds = internal addrspace(3) global float poison, align 4
27 ; FIXME: The DAG should probably move the trap before the access.
29 ; ERR: warning: <unknown>:0:0: in function func_use_lds_global void (): local memory global used by non-kernel function
30 define void @func_use_lds_global() {
31 ; GFX8-SDAG-LABEL: func_use_lds_global:
32 ; GFX8-SDAG:       ; %bb.0:
33 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, 0
35 ; GFX8-SDAG-NEXT:    s_mov_b32 m0, -1
36 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v0
37 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
38 ; GFX8-SDAG-NEXT:    s_trap 2
39 ; GFX8-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
40 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
42 ; GFX8-GISEL-LABEL: func_use_lds_global:
43 ; GFX8-GISEL:       ; %bb.0:
44 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
45 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v0, 0
46 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
47 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
48 ; GFX8-GISEL-NEXT:    s_trap 2
49 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v0
50 ; GFX8-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
51 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
53 ; GFX9-SDAG-LABEL: func_use_lds_global:
54 ; GFX9-SDAG:       ; %bb.0:
55 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
56 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, 0
57 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v0
58 ; GFX9-SDAG-NEXT:    s_trap 2
59 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
60 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
62 ; GFX9-GISEL-LABEL: func_use_lds_global:
63 ; GFX9-GISEL:       ; %bb.0:
64 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
65 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v0, 0
66 ; GFX9-GISEL-NEXT:    s_trap 2
67 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v0
68 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
69 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
71 ; SDAG-LABEL: func_use_lds_global:
72 ; SDAG:       ; %bb.0:
73 ; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
74 ; SDAG-NEXT:    v_mov_b32_e32 v0, 0
75 ; SDAG-NEXT:    ds_write_b32 v0, v0
76 ; SDAG-NEXT:    s_cbranch_execnz .LBB0_2
77 ; SDAG-NEXT:  ; %bb.1:
78 ; SDAG-NEXT:    s_waitcnt lgkmcnt(0)
79 ; SDAG-NEXT:    s_setpc_b64 s[30:31]
80 ; SDAG-NEXT:  .LBB0_2:
81 ; SDAG-NEXT:    s_endpgm
83 ; GISEL-LABEL: func_use_lds_global:
84 ; GISEL:       ; %bb.0:
85 ; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
86 ; GISEL-NEXT:    s_cbranch_execnz .LBB0_2
87 ; GISEL-NEXT:  ; %bb.1:
88 ; GISEL-NEXT:    v_mov_b32_e32 v0, 0
89 ; GISEL-NEXT:    ds_write_b32 v0, v0
90 ; GISEL-NEXT:    s_waitcnt lgkmcnt(0)
91 ; GISEL-NEXT:    s_setpc_b64 s[30:31]
92 ; GISEL-NEXT:  .LBB0_2:
93 ; GISEL-NEXT:    s_endpgm
94   store volatile float 0.0, ptr addrspace(3) @lds, align 4
95   ret void
98 ; ERR: warning: <unknown>:0:0: in function func_use_lds_global_constexpr_cast void (): local memory global used by non-kernel function
99 define void @func_use_lds_global_constexpr_cast() {
100 ; GFX8-SDAG-LABEL: func_use_lds_global_constexpr_cast:
101 ; GFX8-SDAG:       ; %bb.0:
102 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
103 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
104 ; GFX8-SDAG-NEXT:    s_trap 2
105 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
107 ; GFX8-GISEL-LABEL: func_use_lds_global_constexpr_cast:
108 ; GFX8-GISEL:       ; %bb.0:
109 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
110 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
111 ; GFX8-GISEL-NEXT:    s_trap 2
112 ; GFX8-GISEL-NEXT:    flat_store_dword v[0:1], v0
113 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0)
114 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
116 ; GFX9-SDAG-LABEL: func_use_lds_global_constexpr_cast:
117 ; GFX9-SDAG:       ; %bb.0:
118 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
119 ; GFX9-SDAG-NEXT:    s_trap 2
120 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
122 ; GFX9-GISEL-LABEL: func_use_lds_global_constexpr_cast:
123 ; GFX9-GISEL:       ; %bb.0:
124 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
125 ; GFX9-GISEL-NEXT:    s_trap 2
126 ; GFX9-GISEL-NEXT:    global_store_dword v[0:1], v0, off
127 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
128 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
130 ; SDAG-LABEL: func_use_lds_global_constexpr_cast:
131 ; SDAG:       ; %bb.0:
132 ; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
133 ; SDAG-NEXT:    s_cbranch_execnz .LBB1_2
134 ; SDAG-NEXT:  ; %bb.1:
135 ; SDAG-NEXT:    s_setpc_b64 s[30:31]
136 ; SDAG-NEXT:  .LBB1_2:
137 ; SDAG-NEXT:    s_endpgm
139 ; GISEL-LABEL: func_use_lds_global_constexpr_cast:
140 ; GISEL:       ; %bb.0:
141 ; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
142 ; GISEL-NEXT:    s_cbranch_execnz .LBB1_2
143 ; GISEL-NEXT:  ; %bb.1:
144 ; GISEL-NEXT:    global_store_dword v[0:1], v0, off
145 ; GISEL-NEXT:    s_waitcnt vmcnt(0)
146 ; GISEL-NEXT:    s_setpc_b64 s[30:31]
147 ; GISEL-NEXT:  .LBB1_2:
148 ; GISEL-NEXT:    s_endpgm
149   store volatile i32 ptrtoint (ptr addrspace(3) @lds to i32), ptr addrspace(1) poison, align 4
150   ret void
153 ; ERR: warning: <unknown>:0:0: in function func_uses_lds_multi void (i1): local memory global used by non-kernel function
154 define void @func_uses_lds_multi(i1 %cond) {
155 ; GFX8-SDAG-LABEL: func_uses_lds_multi:
156 ; GFX8-SDAG:       ; %bb.0: ; %entry
157 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
158 ; GFX8-SDAG-NEXT:    v_and_b32_e32 v0, 1, v0
159 ; GFX8-SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
160 ; GFX8-SDAG-NEXT:    s_xor_b64 s[4:5], vcc, -1
161 ; GFX8-SDAG-NEXT:    s_mov_b32 m0, -1
162 ; GFX8-SDAG-NEXT:    s_and_saveexec_b64 s[8:9], s[4:5]
163 ; GFX8-SDAG-NEXT:    s_xor_b64 s[4:5], exec, s[8:9]
164 ; GFX8-SDAG-NEXT:    s_cbranch_execz .LBB2_2
165 ; GFX8-SDAG-NEXT:  ; %bb.1: ; %bb1
166 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, 1
167 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v0
168 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
169 ; GFX8-SDAG-NEXT:    s_trap 2
170 ; GFX8-SDAG-NEXT:  .LBB2_2: ; %Flow
171 ; GFX8-SDAG-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
172 ; GFX8-SDAG-NEXT:    s_cbranch_execz .LBB2_4
173 ; GFX8-SDAG-NEXT:  ; %bb.3: ; %bb0
174 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, 0
175 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v0
176 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
177 ; GFX8-SDAG-NEXT:    s_trap 2
178 ; GFX8-SDAG-NEXT:  .LBB2_4: ; %ret
179 ; GFX8-SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
180 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, 2
181 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v0
182 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
183 ; GFX8-SDAG-NEXT:    s_trap 2
184 ; GFX8-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
185 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
187 ; GFX8-GISEL-LABEL: func_uses_lds_multi:
188 ; GFX8-GISEL:       ; %bb.0: ; %entry
189 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
190 ; GFX8-GISEL-NEXT:    v_and_b32_e32 v0, 1, v0
191 ; GFX8-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
192 ; GFX8-GISEL-NEXT:    s_xor_b64 s[4:5], vcc, -1
193 ; GFX8-GISEL-NEXT:    s_and_saveexec_b64 s[8:9], s[4:5]
194 ; GFX8-GISEL-NEXT:    s_xor_b64 s[4:5], exec, s[8:9]
195 ; GFX8-GISEL-NEXT:    s_cbranch_execz .LBB2_2
196 ; GFX8-GISEL-NEXT:  ; %bb.1: ; %bb1
197 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v0, 1
198 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
199 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
200 ; GFX8-GISEL-NEXT:    s_trap 2
201 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v0
202 ; GFX8-GISEL-NEXT:  .LBB2_2: ; %Flow
203 ; GFX8-GISEL-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
204 ; GFX8-GISEL-NEXT:    s_cbranch_execz .LBB2_4
205 ; GFX8-GISEL-NEXT:  ; %bb.3: ; %bb0
206 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v0, 0
207 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
208 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
209 ; GFX8-GISEL-NEXT:    s_trap 2
210 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v0
211 ; GFX8-GISEL-NEXT:  .LBB2_4: ; %ret
212 ; GFX8-GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
213 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v0, 2
214 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
215 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
216 ; GFX8-GISEL-NEXT:    s_trap 2
217 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v0
218 ; GFX8-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
219 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
221 ; GFX9-SDAG-LABEL: func_uses_lds_multi:
222 ; GFX9-SDAG:       ; %bb.0: ; %entry
223 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
224 ; GFX9-SDAG-NEXT:    v_and_b32_e32 v0, 1, v0
225 ; GFX9-SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
226 ; GFX9-SDAG-NEXT:    s_xor_b64 s[4:5], vcc, -1
227 ; GFX9-SDAG-NEXT:    s_and_saveexec_b64 s[6:7], s[4:5]
228 ; GFX9-SDAG-NEXT:    s_xor_b64 s[4:5], exec, s[6:7]
229 ; GFX9-SDAG-NEXT:    s_cbranch_execz .LBB2_2
230 ; GFX9-SDAG-NEXT:  ; %bb.1: ; %bb1
231 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, 1
232 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v0
233 ; GFX9-SDAG-NEXT:    s_trap 2
234 ; GFX9-SDAG-NEXT:  .LBB2_2: ; %Flow
235 ; GFX9-SDAG-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
236 ; GFX9-SDAG-NEXT:    s_cbranch_execz .LBB2_4
237 ; GFX9-SDAG-NEXT:  ; %bb.3: ; %bb0
238 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, 0
239 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v0
240 ; GFX9-SDAG-NEXT:    s_trap 2
241 ; GFX9-SDAG-NEXT:  .LBB2_4: ; %ret
242 ; GFX9-SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
243 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, 2
244 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v0
245 ; GFX9-SDAG-NEXT:    s_trap 2
246 ; GFX9-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
247 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
249 ; GFX9-GISEL-LABEL: func_uses_lds_multi:
250 ; GFX9-GISEL:       ; %bb.0: ; %entry
251 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
252 ; GFX9-GISEL-NEXT:    v_and_b32_e32 v0, 1, v0
253 ; GFX9-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
254 ; GFX9-GISEL-NEXT:    s_xor_b64 s[4:5], vcc, -1
255 ; GFX9-GISEL-NEXT:    s_and_saveexec_b64 s[6:7], s[4:5]
256 ; GFX9-GISEL-NEXT:    s_xor_b64 s[4:5], exec, s[6:7]
257 ; GFX9-GISEL-NEXT:    s_cbranch_execz .LBB2_2
258 ; GFX9-GISEL-NEXT:  ; %bb.1: ; %bb1
259 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v0, 1
260 ; GFX9-GISEL-NEXT:    s_trap 2
261 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v0
262 ; GFX9-GISEL-NEXT:  .LBB2_2: ; %Flow
263 ; GFX9-GISEL-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
264 ; GFX9-GISEL-NEXT:    s_cbranch_execz .LBB2_4
265 ; GFX9-GISEL-NEXT:  ; %bb.3: ; %bb0
266 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v0, 0
267 ; GFX9-GISEL-NEXT:    s_trap 2
268 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v0
269 ; GFX9-GISEL-NEXT:  .LBB2_4: ; %ret
270 ; GFX9-GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
271 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v0, 2
272 ; GFX9-GISEL-NEXT:    s_trap 2
273 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v0
274 ; GFX9-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
275 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
277 ; SDAG-LABEL: func_uses_lds_multi:
278 ; SDAG:       ; %bb.0: ; %entry
279 ; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
280 ; SDAG-NEXT:    v_and_b32_e32 v0, 1, v0
281 ; SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
282 ; SDAG-NEXT:    s_xor_b64 s[4:5], vcc, -1
283 ; SDAG-NEXT:    s_and_saveexec_b64 s[6:7], s[4:5]
284 ; SDAG-NEXT:    s_xor_b64 s[4:5], exec, s[6:7]
285 ; SDAG-NEXT:    s_cbranch_execz .LBB2_2
286 ; SDAG-NEXT:  ; %bb.1: ; %bb1
287 ; SDAG-NEXT:    v_mov_b32_e32 v0, 1
288 ; SDAG-NEXT:    ds_write_b32 v0, v0
289 ; SDAG-NEXT:    s_cbranch_execnz .LBB2_6
290 ; SDAG-NEXT:  .LBB2_2: ; %Flow
291 ; SDAG-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
292 ; SDAG-NEXT:    s_cbranch_execz .LBB2_4
293 ; SDAG-NEXT:  ; %bb.3: ; %bb0
294 ; SDAG-NEXT:    v_mov_b32_e32 v0, 0
295 ; SDAG-NEXT:    ds_write_b32 v0, v0
296 ; SDAG-NEXT:    s_cbranch_execnz .LBB2_6
297 ; SDAG-NEXT:  .LBB2_4: ; %ret
298 ; SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
299 ; SDAG-NEXT:    v_mov_b32_e32 v0, 2
300 ; SDAG-NEXT:    ds_write_b32 v0, v0
301 ; SDAG-NEXT:    s_cbranch_execnz .LBB2_6
302 ; SDAG-NEXT:  ; %bb.5: ; %ret
303 ; SDAG-NEXT:    s_waitcnt lgkmcnt(0)
304 ; SDAG-NEXT:    s_setpc_b64 s[30:31]
305 ; SDAG-NEXT:  .LBB2_6:
306 ; SDAG-NEXT:    s_endpgm
308 ; GISEL-LABEL: func_uses_lds_multi:
309 ; GISEL:       ; %bb.0: ; %entry
310 ; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
311 ; GISEL-NEXT:    v_and_b32_e32 v0, 1, v0
312 ; GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v0
313 ; GISEL-NEXT:    s_xor_b64 s[4:5], vcc, -1
314 ; GISEL-NEXT:    s_and_saveexec_b64 s[6:7], s[4:5]
315 ; GISEL-NEXT:    s_xor_b64 s[4:5], exec, s[6:7]
316 ; GISEL-NEXT:    s_cbranch_execz .LBB2_3
317 ; GISEL-NEXT:  ; %bb.1: ; %bb1
318 ; GISEL-NEXT:    s_cbranch_execnz .LBB2_8
319 ; GISEL-NEXT:  ; %bb.2: ; %bb1
320 ; GISEL-NEXT:    v_mov_b32_e32 v0, 1
321 ; GISEL-NEXT:    ds_write_b32 v0, v0
322 ; GISEL-NEXT:  .LBB2_3: ; %Flow
323 ; GISEL-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
324 ; GISEL-NEXT:    s_cbranch_execz .LBB2_6
325 ; GISEL-NEXT:  ; %bb.4: ; %bb0
326 ; GISEL-NEXT:    s_cbranch_execnz .LBB2_8
327 ; GISEL-NEXT:  ; %bb.5: ; %bb0
328 ; GISEL-NEXT:    v_mov_b32_e32 v0, 0
329 ; GISEL-NEXT:    ds_write_b32 v0, v0
330 ; GISEL-NEXT:  .LBB2_6: ; %ret
331 ; GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
332 ; GISEL-NEXT:    s_cbranch_execnz .LBB2_8
333 ; GISEL-NEXT:  ; %bb.7: ; %ret
334 ; GISEL-NEXT:    v_mov_b32_e32 v0, 2
335 ; GISEL-NEXT:    ds_write_b32 v0, v0
336 ; GISEL-NEXT:    s_waitcnt lgkmcnt(0)
337 ; GISEL-NEXT:    s_setpc_b64 s[30:31]
338 ; GISEL-NEXT:  .LBB2_8:
339 ; GISEL-NEXT:    s_endpgm
340 entry:
341   br i1 %cond, label %bb0, label %bb1
343 bb0:
344   store volatile i32 0, ptr addrspace(3) @lds, align 4
345   br label %ret
347 bb1:
348   store volatile i32 1, ptr addrspace(3) @lds, align 4
349   br label %ret
351 ret:
352   store volatile i32 2, ptr addrspace(3) @lds, align 4
353   ret void
356 ; ERR: warning: <unknown>:0:0: in function func_uses_lds_code_after void (ptr addrspace(1)): local memory global used by non-kernel function
357 define void @func_uses_lds_code_after(ptr addrspace(1) %ptr) {
358 ; GFX8-SDAG-LABEL: func_uses_lds_code_after:
359 ; GFX8-SDAG:       ; %bb.0:
360 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
361 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v2, 0
362 ; GFX8-SDAG-NEXT:    s_mov_b32 m0, -1
363 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v2
364 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v2, 1
365 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
366 ; GFX8-SDAG-NEXT:    s_trap 2
367 ; GFX8-SDAG-NEXT:    flat_store_dword v[0:1], v2
368 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
369 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
371 ; GFX8-GISEL-LABEL: func_uses_lds_code_after:
372 ; GFX8-GISEL:       ; %bb.0:
373 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
374 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v2, 0
375 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
376 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
377 ; GFX8-GISEL-NEXT:    s_trap 2
378 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v2
379 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v2, 1
380 ; GFX8-GISEL-NEXT:    flat_store_dword v[0:1], v2
381 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
382 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
384 ; GFX9-SDAG-LABEL: func_uses_lds_code_after:
385 ; GFX9-SDAG:       ; %bb.0:
386 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
387 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v2, 0
388 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v2
389 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v2, 1
390 ; GFX9-SDAG-NEXT:    s_trap 2
391 ; GFX9-SDAG-NEXT:    global_store_dword v[0:1], v2, off
392 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
393 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
395 ; GFX9-GISEL-LABEL: func_uses_lds_code_after:
396 ; GFX9-GISEL:       ; %bb.0:
397 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
398 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0
399 ; GFX9-GISEL-NEXT:    s_trap 2
400 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v2
401 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 1
402 ; GFX9-GISEL-NEXT:    global_store_dword v[0:1], v2, off
403 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
404 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
406 ; SDAG-LABEL: func_uses_lds_code_after:
407 ; SDAG:       ; %bb.0:
408 ; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
409 ; SDAG-NEXT:    v_mov_b32_e32 v2, 0
410 ; SDAG-NEXT:    ds_write_b32 v0, v2
411 ; SDAG-NEXT:    s_cbranch_execnz .LBB3_2
412 ; SDAG-NEXT:  ; %bb.1:
413 ; SDAG-NEXT:    v_mov_b32_e32 v2, 1
414 ; SDAG-NEXT:    global_store_dword v[0:1], v2, off
415 ; SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
416 ; SDAG-NEXT:    s_setpc_b64 s[30:31]
417 ; SDAG-NEXT:  .LBB3_2:
418 ; SDAG-NEXT:    s_endpgm
420 ; GISEL-LABEL: func_uses_lds_code_after:
421 ; GISEL:       ; %bb.0:
422 ; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
423 ; GISEL-NEXT:    s_cbranch_execnz .LBB3_2
424 ; GISEL-NEXT:  ; %bb.1:
425 ; GISEL-NEXT:    v_mov_b32_e32 v2, 0
426 ; GISEL-NEXT:    ds_write_b32 v0, v2
427 ; GISEL-NEXT:    v_mov_b32_e32 v2, 1
428 ; GISEL-NEXT:    global_store_dword v[0:1], v2, off
429 ; GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
430 ; GISEL-NEXT:    s_setpc_b64 s[30:31]
431 ; GISEL-NEXT:  .LBB3_2:
432 ; GISEL-NEXT:    s_endpgm
433   store volatile i32 0, ptr addrspace(3) @lds, align 4
434   store volatile i32 1, ptr addrspace(1) %ptr, align 4
435   ret void
438 ; ERR: warning: <unknown>:0:0: in function func_uses_lds_phi_after i32 (i1, ptr addrspace(1)): local memory global used by non-kernel function
439 define i32 @func_uses_lds_phi_after(i1 %cond, ptr addrspace(1) %ptr) {
440 ; GFX8-SDAG-LABEL: func_uses_lds_phi_after:
441 ; GFX8-SDAG:       ; %bb.0: ; %entry
442 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
443 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v3, v0
444 ; GFX8-SDAG-NEXT:    flat_load_dword v0, v[1:2] glc
445 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0)
446 ; GFX8-SDAG-NEXT:    v_and_b32_e32 v3, 1, v3
447 ; GFX8-SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
448 ; GFX8-SDAG-NEXT:    s_and_saveexec_b64 s[4:5], vcc
449 ; GFX8-SDAG-NEXT:    s_cbranch_execz .LBB4_2
450 ; GFX8-SDAG-NEXT:  ; %bb.1: ; %use.bb
451 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v0, 0
452 ; GFX8-SDAG-NEXT:    s_mov_b32 m0, -1
453 ; GFX8-SDAG-NEXT:    ds_write_b32 v0, v0
454 ; GFX8-SDAG-NEXT:    s_mov_b64 s[0:1], s[6:7]
455 ; GFX8-SDAG-NEXT:    s_trap 2
456 ; GFX8-SDAG-NEXT:    flat_load_dword v0, v[1:2] glc
457 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0)
458 ; GFX8-SDAG-NEXT:  .LBB4_2: ; %ret
459 ; GFX8-SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
460 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
461 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
463 ; GFX8-GISEL-LABEL: func_uses_lds_phi_after:
464 ; GFX8-GISEL:       ; %bb.0: ; %entry
465 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
466 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v3, v0
467 ; GFX8-GISEL-NEXT:    flat_load_dword v0, v[1:2] glc
468 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0)
469 ; GFX8-GISEL-NEXT:    v_and_b32_e32 v3, 1, v3
470 ; GFX8-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v3
471 ; GFX8-GISEL-NEXT:    s_and_saveexec_b64 s[4:5], vcc
472 ; GFX8-GISEL-NEXT:    s_cbranch_execz .LBB4_2
473 ; GFX8-GISEL-NEXT:  ; %bb.1: ; %use.bb
474 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v0, 0
475 ; GFX8-GISEL-NEXT:    s_mov_b32 m0, -1
476 ; GFX8-GISEL-NEXT:    s_mov_b64 s[0:1], s[6:7]
477 ; GFX8-GISEL-NEXT:    s_trap 2
478 ; GFX8-GISEL-NEXT:    ds_write_b32 v0, v0
479 ; GFX8-GISEL-NEXT:    flat_load_dword v0, v[1:2] glc
480 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0)
481 ; GFX8-GISEL-NEXT:  .LBB4_2: ; %ret
482 ; GFX8-GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
483 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
484 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
486 ; GFX9-SDAG-LABEL: func_uses_lds_phi_after:
487 ; GFX9-SDAG:       ; %bb.0: ; %entry
488 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
489 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v3, v0
490 ; GFX9-SDAG-NEXT:    global_load_dword v0, v[1:2], off glc
491 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
492 ; GFX9-SDAG-NEXT:    v_and_b32_e32 v3, 1, v3
493 ; GFX9-SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
494 ; GFX9-SDAG-NEXT:    s_and_saveexec_b64 s[4:5], vcc
495 ; GFX9-SDAG-NEXT:    s_cbranch_execz .LBB4_2
496 ; GFX9-SDAG-NEXT:  ; %bb.1: ; %use.bb
497 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v0, 0
498 ; GFX9-SDAG-NEXT:    ds_write_b32 v0, v0
499 ; GFX9-SDAG-NEXT:    s_trap 2
500 ; GFX9-SDAG-NEXT:    global_load_dword v0, v[1:2], off glc
501 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0)
502 ; GFX9-SDAG-NEXT:  .LBB4_2: ; %ret
503 ; GFX9-SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
504 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
505 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
507 ; GFX9-GISEL-LABEL: func_uses_lds_phi_after:
508 ; GFX9-GISEL:       ; %bb.0: ; %entry
509 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
510 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v3, v0
511 ; GFX9-GISEL-NEXT:    global_load_dword v0, v[1:2], off glc
512 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
513 ; GFX9-GISEL-NEXT:    v_and_b32_e32 v3, 1, v3
514 ; GFX9-GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v3
515 ; GFX9-GISEL-NEXT:    s_and_saveexec_b64 s[4:5], vcc
516 ; GFX9-GISEL-NEXT:    s_cbranch_execz .LBB4_2
517 ; GFX9-GISEL-NEXT:  ; %bb.1: ; %use.bb
518 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v0, 0
519 ; GFX9-GISEL-NEXT:    s_trap 2
520 ; GFX9-GISEL-NEXT:    ds_write_b32 v0, v0
521 ; GFX9-GISEL-NEXT:    global_load_dword v0, v[1:2], off glc
522 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0)
523 ; GFX9-GISEL-NEXT:  .LBB4_2: ; %ret
524 ; GFX9-GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
525 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
526 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
528 ; SDAG-LABEL: func_uses_lds_phi_after:
529 ; SDAG:       ; %bb.0: ; %entry
530 ; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
531 ; SDAG-NEXT:    v_mov_b32_e32 v3, v0
532 ; SDAG-NEXT:    global_load_dword v0, v[1:2], off glc
533 ; SDAG-NEXT:    s_waitcnt vmcnt(0)
534 ; SDAG-NEXT:    v_and_b32_e32 v3, 1, v3
535 ; SDAG-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v3
536 ; SDAG-NEXT:    s_and_saveexec_b64 s[4:5], vcc
537 ; SDAG-NEXT:    s_cbranch_execz .LBB4_3
538 ; SDAG-NEXT:  ; %bb.1: ; %use.bb
539 ; SDAG-NEXT:    v_mov_b32_e32 v0, 0
540 ; SDAG-NEXT:    ds_write_b32 v0, v0
541 ; SDAG-NEXT:    s_cbranch_execnz .LBB4_4
542 ; SDAG-NEXT:  ; %bb.2: ; %use.bb
543 ; SDAG-NEXT:    global_load_dword v0, v[1:2], off glc
544 ; SDAG-NEXT:    s_waitcnt vmcnt(0)
545 ; SDAG-NEXT:  .LBB4_3: ; %ret
546 ; SDAG-NEXT:    s_or_b64 exec, exec, s[4:5]
547 ; SDAG-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
548 ; SDAG-NEXT:    s_setpc_b64 s[30:31]
549 ; SDAG-NEXT:  .LBB4_4:
550 ; SDAG-NEXT:    s_endpgm
552 ; GISEL-LABEL: func_uses_lds_phi_after:
553 ; GISEL:       ; %bb.0: ; %entry
554 ; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
555 ; GISEL-NEXT:    v_mov_b32_e32 v3, v0
556 ; GISEL-NEXT:    global_load_dword v0, v[1:2], off glc
557 ; GISEL-NEXT:    s_waitcnt vmcnt(0)
558 ; GISEL-NEXT:    v_and_b32_e32 v3, 1, v3
559 ; GISEL-NEXT:    v_cmp_ne_u32_e32 vcc, 0, v3
560 ; GISEL-NEXT:    s_and_saveexec_b64 s[4:5], vcc
561 ; GISEL-NEXT:    s_cbranch_execz .LBB4_3
562 ; GISEL-NEXT:  ; %bb.1: ; %use.bb
563 ; GISEL-NEXT:    s_cbranch_execnz .LBB4_4
564 ; GISEL-NEXT:  ; %bb.2: ; %use.bb
565 ; GISEL-NEXT:    v_mov_b32_e32 v0, 0
566 ; GISEL-NEXT:    ds_write_b32 v0, v0
567 ; GISEL-NEXT:    global_load_dword v0, v[1:2], off glc
568 ; GISEL-NEXT:    s_waitcnt vmcnt(0)
569 ; GISEL-NEXT:  .LBB4_3: ; %ret
570 ; GISEL-NEXT:    s_or_b64 exec, exec, s[4:5]
571 ; GISEL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
572 ; GISEL-NEXT:    s_setpc_b64 s[30:31]
573 ; GISEL-NEXT:  .LBB4_4:
574 ; GISEL-NEXT:    s_endpgm
575 entry:
576   %entry.load = load volatile i32, ptr addrspace(1) %ptr
577   br i1 %cond, label %use.bb, label %ret
579 use.bb:
580   store volatile i32 0, ptr addrspace(3) @lds, align 4
581   %use.bb.load = load volatile i32, ptr addrspace(1) %ptr
582   br label %ret
584 ret:
585   %phi = phi i32 [ %entry.load, %entry ], [ %use.bb.load, %use.bb ]
586   ret i32 %phi
589 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
590 ; CHECK: {{.*}}
591 ; GFX8: {{.*}}
592 ; GFX9: {{.*}}