[clang] Fix crashes when passing VLA to va_arg (#119563)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / collapse-endcf.ll
blob50c9c0cb64ccd60fb52b27dd9c1b976207dd6879
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -mcpu=tahiti -verify-machineinstrs -amdgpu-remove-redundant-endcf -amdgpu-codegenprepare-break-large-phis=0 < %s | FileCheck -enable-var-scope -check-prefix=GCN %s
4 ; Disabled endcf collapse at -O0.
5 ; RUN: llc -mtriple=amdgcn -mcpu=tahiti -verify-machineinstrs -O0 -amdgpu-remove-redundant-endcf -amdgpu-codegenprepare-break-large-phis=0 < %s | FileCheck -enable-var-scope -check-prefix=GCN-O0 %s
7 ; Note: Breaking large PHIs is disabled to branches from being eliminated (in scc_liveness)
9 define amdgpu_kernel void @simple_nested_if(ptr addrspace(1) nocapture %arg) {
10 ; GCN-LABEL: simple_nested_if:
11 ; GCN:       ; %bb.0: ; %bb
12 ; GCN-NEXT:    v_cmp_lt_u32_e32 vcc, 1, v0
13 ; GCN-NEXT:    s_and_saveexec_b64 s[6:7], vcc
14 ; GCN-NEXT:    s_cbranch_execz .LBB0_3
15 ; GCN-NEXT:  ; %bb.1: ; %bb.outer.then
16 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
17 ; GCN-NEXT:    v_lshlrev_b32_e32 v1, 2, v0
18 ; GCN-NEXT:    v_mov_b32_e32 v2, 0
19 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
20 ; GCN-NEXT:    s_mov_b32 s2, 0
21 ; GCN-NEXT:    v_cmp_ne_u32_e32 vcc, 2, v0
22 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
23 ; GCN-NEXT:    buffer_store_dword v2, v[1:2], s[0:3], 0 addr64
24 ; GCN-NEXT:    s_and_b64 exec, exec, vcc
25 ; GCN-NEXT:    s_cbranch_execz .LBB0_3
26 ; GCN-NEXT:  ; %bb.2: ; %bb.inner.then
27 ; GCN-NEXT:    s_waitcnt expcnt(0)
28 ; GCN-NEXT:    v_mov_b32_e32 v2, s1
29 ; GCN-NEXT:    v_add_i32_e32 v0, vcc, s0, v1
30 ; GCN-NEXT:    v_addc_u32_e32 v1, vcc, 0, v2, vcc
31 ; GCN-NEXT:    s_mov_b32 s0, s2
32 ; GCN-NEXT:    s_mov_b32 s1, s2
33 ; GCN-NEXT:    v_mov_b32_e32 v2, 1
34 ; GCN-NEXT:    buffer_store_dword v2, v[0:1], s[0:3], 0 addr64 offset:4
35 ; GCN-NEXT:  .LBB0_3: ; %bb.outer.end
36 ; GCN-NEXT:    s_or_b64 exec, exec, s[6:7]
37 ; GCN-NEXT:    v_mov_b32_e32 v0, 3
38 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
39 ; GCN-NEXT:    s_mov_b32 m0, -1
40 ; GCN-NEXT:    ds_write_b32 v1, v0
41 ; GCN-NEXT:    s_endpgm
43 ; GCN-O0-LABEL: simple_nested_if:
44 ; GCN-O0:       ; %bb.0: ; %bb
45 ; GCN-O0-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
46 ; GCN-O0-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
47 ; GCN-O0-NEXT:    s_mov_b32 s14, -1
48 ; GCN-O0-NEXT:    s_mov_b32 s15, 0xe8f000
49 ; GCN-O0-NEXT:    s_add_u32 s12, s12, s11
50 ; GCN-O0-NEXT:    s_addc_u32 s13, s13, 0
51 ; GCN-O0-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
52 ; GCN-O0-NEXT:    ; implicit-def: $vgpr4 : SGPR spill to VGPR lane
53 ; GCN-O0-NEXT:    s_waitcnt lgkmcnt(0)
54 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 0
55 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 1
56 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
57 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Spill
58 ; GCN-O0-NEXT:    s_mov_b32 s0, 1
59 ; GCN-O0-NEXT:    v_cmp_gt_u32_e64 s[2:3], v0, s0
60 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
61 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 2
62 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 3
63 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
64 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
65 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
66 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
67 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
68 ; GCN-O0-NEXT:    s_cbranch_execz .LBB0_4
69 ; GCN-O0-NEXT:  ; %bb.1: ; %bb.outer.then
70 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
71 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
72 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
73 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
74 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
75 ; GCN-O0-NEXT:    v_readlane_b32 s4, v4, 0
76 ; GCN-O0-NEXT:    v_readlane_b32 s5, v4, 1
77 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
78 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
79 ; GCN-O0-NEXT:    s_mov_b32 s0, 0
80 ; GCN-O0-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1
81 ; GCN-O0-NEXT:    s_mov_b32 s1, s2
82 ; GCN-O0-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
83 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[0:1]
84 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
85 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v0
86 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
87 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
88 ; GCN-O0-NEXT:    s_mov_b32 s0, 2
89 ; GCN-O0-NEXT:    v_lshl_b64 v[2:3], v[1:2], s0
90 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
91 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[4:7], 0 addr64
92 ; GCN-O0-NEXT:    v_cmp_ne_u32_e64 s[2:3], v0, s0
93 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
94 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 4
95 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 5
96 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
97 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
98 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
99 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
100 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
101 ; GCN-O0-NEXT:    s_cbranch_execz .LBB0_3
102 ; GCN-O0-NEXT:  ; %bb.2: ; %bb.inner.then
103 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
104 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
105 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
106 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
107 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
108 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 0
109 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 1
110 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
111 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 1
112 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
113 ; GCN-O0-NEXT:    v_add_i32_e64 v1, s[2:3], v1, v0
114 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v1
115 ; GCN-O0-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
116 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
117 ; GCN-O0-NEXT:    s_mov_b32 s2, 2
118 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[1:2], s2
119 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
120 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
121 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
122 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
123 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
124 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
125 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
126 ; GCN-O0-NEXT:  .LBB0_3: ; %Flow
127 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
128 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
129 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
130 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
131 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
132 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 4
133 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 5
134 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
135 ; GCN-O0-NEXT:  .LBB0_4: ; %bb.outer.end
136 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
137 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
138 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
139 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
140 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
141 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 2
142 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 3
143 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
144 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 3
145 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 0
146 ; GCN-O0-NEXT:    s_mov_b32 m0, -1
147 ; GCN-O0-NEXT:    ds_write_b32 v0, v1
148 ; GCN-O0-NEXT:    s_endpgm
150   %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
151   %tmp1 = icmp ugt i32 %tmp, 1
152   br i1 %tmp1, label %bb.outer.then, label %bb.outer.end
154 bb.outer.then:                                    ; preds = %bb
155   %tmp4 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp
156   store i32 0, ptr addrspace(1) %tmp4, align 4
157   %tmp5 = icmp eq i32 %tmp, 2
158   br i1 %tmp5, label %bb.outer.end, label %bb.inner.then
160 bb.inner.then:                                    ; preds = %bb.outer.then
161   %tmp7 = add i32 %tmp, 1
162   %tmp9 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp7
163   store i32 1, ptr addrspace(1) %tmp9, align 4
164   br label %bb.outer.end
166 bb.outer.end:                                     ; preds = %bb.outer.then, %bb.inner.then, %bb
167   store i32 3, ptr addrspace(3) null
168   ret void
171 define amdgpu_kernel void @uncollapsable_nested_if(ptr addrspace(1) nocapture %arg) {
172 ; GCN-LABEL: uncollapsable_nested_if:
173 ; GCN:       ; %bb.0: ; %bb
174 ; GCN-NEXT:    v_cmp_lt_u32_e32 vcc, 1, v0
175 ; GCN-NEXT:    s_and_saveexec_b64 s[6:7], vcc
176 ; GCN-NEXT:    s_cbranch_execz .LBB1_4
177 ; GCN-NEXT:  ; %bb.1: ; %bb.outer.then
178 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
179 ; GCN-NEXT:    v_lshlrev_b32_e32 v3, 2, v0
180 ; GCN-NEXT:    v_mov_b32_e32 v4, 0
181 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
182 ; GCN-NEXT:    s_mov_b32 s2, 0
183 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
184 ; GCN-NEXT:    v_mov_b32_e32 v2, s1
185 ; GCN-NEXT:    v_add_i32_e32 v1, vcc, s0, v3
186 ; GCN-NEXT:    v_addc_u32_e32 v2, vcc, 0, v2, vcc
187 ; GCN-NEXT:    v_cmp_ne_u32_e32 vcc, 2, v0
188 ; GCN-NEXT:    buffer_store_dword v4, v[3:4], s[0:3], 0 addr64
189 ; GCN-NEXT:    s_and_saveexec_b64 s[4:5], vcc
190 ; GCN-NEXT:    s_cbranch_execz .LBB1_3
191 ; GCN-NEXT:  ; %bb.2: ; %bb.inner.then
192 ; GCN-NEXT:    s_mov_b32 s0, s2
193 ; GCN-NEXT:    s_mov_b32 s1, s2
194 ; GCN-NEXT:    v_mov_b32_e32 v0, 1
195 ; GCN-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64 offset:4
196 ; GCN-NEXT:  .LBB1_3: ; %bb.inner.end
197 ; GCN-NEXT:    s_or_b64 exec, exec, s[4:5]
198 ; GCN-NEXT:    s_mov_b32 s0, s2
199 ; GCN-NEXT:    s_mov_b32 s1, s2
200 ; GCN-NEXT:    s_waitcnt expcnt(0)
201 ; GCN-NEXT:    v_mov_b32_e32 v0, 2
202 ; GCN-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64 offset:8
203 ; GCN-NEXT:  .LBB1_4: ; %Flow
204 ; GCN-NEXT:    s_or_b64 exec, exec, s[6:7]
205 ; GCN-NEXT:    s_waitcnt expcnt(0)
206 ; GCN-NEXT:    v_mov_b32_e32 v0, 3
207 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
208 ; GCN-NEXT:    s_mov_b32 m0, -1
209 ; GCN-NEXT:    ds_write_b32 v1, v0
210 ; GCN-NEXT:    s_endpgm
212 ; GCN-O0-LABEL: uncollapsable_nested_if:
213 ; GCN-O0:       ; %bb.0: ; %bb
214 ; GCN-O0-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
215 ; GCN-O0-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
216 ; GCN-O0-NEXT:    s_mov_b32 s14, -1
217 ; GCN-O0-NEXT:    s_mov_b32 s15, 0xe8f000
218 ; GCN-O0-NEXT:    s_add_u32 s12, s12, s11
219 ; GCN-O0-NEXT:    s_addc_u32 s13, s13, 0
220 ; GCN-O0-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
221 ; GCN-O0-NEXT:    ; implicit-def: $vgpr4 : SGPR spill to VGPR lane
222 ; GCN-O0-NEXT:    s_waitcnt lgkmcnt(0)
223 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 0
224 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 1
225 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
226 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Spill
227 ; GCN-O0-NEXT:    s_mov_b32 s0, 1
228 ; GCN-O0-NEXT:    v_cmp_gt_u32_e64 s[2:3], v0, s0
229 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
230 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 2
231 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 3
232 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
233 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
234 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
235 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
236 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
237 ; GCN-O0-NEXT:    s_cbranch_execz .LBB1_3
238 ; GCN-O0-NEXT:  ; %bb.1: ; %bb.outer.then
239 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
240 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
241 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
242 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
243 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
244 ; GCN-O0-NEXT:    v_readlane_b32 s4, v4, 0
245 ; GCN-O0-NEXT:    v_readlane_b32 s5, v4, 1
246 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
247 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
248 ; GCN-O0-NEXT:    s_mov_b32 s0, 0
249 ; GCN-O0-NEXT:    ; kill: def $sgpr0 killed $sgpr0 def $sgpr0_sgpr1
250 ; GCN-O0-NEXT:    s_mov_b32 s1, s2
251 ; GCN-O0-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
252 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[0:1]
253 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
254 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v0
255 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
256 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
257 ; GCN-O0-NEXT:    s_mov_b32 s0, 2
258 ; GCN-O0-NEXT:    v_lshl_b64 v[2:3], v[1:2], s0
259 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
260 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[4:7], 0 addr64
261 ; GCN-O0-NEXT:    v_cmp_ne_u32_e64 s[2:3], v0, s0
262 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
263 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 4
264 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 5
265 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
266 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
267 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
268 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
269 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
270 ; GCN-O0-NEXT:    s_cbranch_execz .LBB1_4
271 ; GCN-O0-NEXT:  ; %bb.2: ; %bb.inner.then
272 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
273 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
274 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
275 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
276 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
277 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 0
278 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 1
279 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
280 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 1
281 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
282 ; GCN-O0-NEXT:    v_add_i32_e64 v1, s[2:3], v1, v0
283 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v1
284 ; GCN-O0-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
285 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
286 ; GCN-O0-NEXT:    s_mov_b32 s2, 2
287 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[1:2], s2
288 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
289 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
290 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
291 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
292 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
293 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
294 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
295 ; GCN-O0-NEXT:    s_branch .LBB1_4
296 ; GCN-O0-NEXT:  .LBB1_3: ; %Flow
297 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
298 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
299 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
300 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
301 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
302 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 2
303 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 3
304 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
305 ; GCN-O0-NEXT:    s_branch .LBB1_5
306 ; GCN-O0-NEXT:  .LBB1_4: ; %bb.inner.end
307 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
308 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
309 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
310 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
311 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
312 ; GCN-O0-NEXT:    v_readlane_b32 s2, v4, 4
313 ; GCN-O0-NEXT:    v_readlane_b32 s3, v4, 5
314 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[2:3]
315 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 0
316 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 1
317 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
318 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 2
319 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
320 ; GCN-O0-NEXT:    v_add_i32_e64 v1, s[2:3], v1, v0
321 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v1
322 ; GCN-O0-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
323 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
324 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[1:2], v0
325 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
326 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
327 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
328 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
329 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
330 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
331 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
332 ; GCN-O0-NEXT:    s_branch .LBB1_3
333 ; GCN-O0-NEXT:  .LBB1_5: ; %bb.outer.end
334 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 3
335 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 0
336 ; GCN-O0-NEXT:    s_mov_b32 m0, -1
337 ; GCN-O0-NEXT:    ds_write_b32 v0, v1
338 ; GCN-O0-NEXT:    s_endpgm
340   %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
341   %tmp1 = icmp ugt i32 %tmp, 1
342   br i1 %tmp1, label %bb.outer.then, label %bb.outer.end
344 bb.outer.then:                                    ; preds = %bb
345   %tmp4 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp
346   store i32 0, ptr addrspace(1) %tmp4, align 4
347   %tmp5 = icmp eq i32 %tmp, 2
348   br i1 %tmp5, label %bb.inner.end, label %bb.inner.then
350 bb.inner.then:                                    ; preds = %bb.outer.then
351   %tmp7 = add i32 %tmp, 1
352   %tmp8 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp7
353   store i32 1, ptr addrspace(1) %tmp8, align 4
354   br label %bb.inner.end
356 bb.inner.end:                                     ; preds = %bb.inner.then, %bb.outer.then
357   %tmp9 = add i32 %tmp, 2
358   %tmp10 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp9
359   store i32 2, ptr addrspace(1) %tmp10, align 4
360   br label %bb.outer.end
362 bb.outer.end:                                     ; preds = %bb.inner.then, %bb
363   store i32 3, ptr addrspace(3) null
364   ret void
367 define amdgpu_kernel void @nested_if_if_else(ptr addrspace(1) nocapture %arg) {
368 ; GCN-LABEL: nested_if_if_else:
369 ; GCN:       ; %bb.0: ; %bb
370 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
371 ; GCN-NEXT:    v_lshlrev_b32_e32 v1, 2, v0
372 ; GCN-NEXT:    v_mov_b32_e32 v2, 0
373 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
374 ; GCN-NEXT:    s_mov_b32 s2, 0
375 ; GCN-NEXT:    v_cmp_lt_u32_e32 vcc, 1, v0
376 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
377 ; GCN-NEXT:    buffer_store_dword v2, v[1:2], s[0:3], 0 addr64
378 ; GCN-NEXT:    s_and_saveexec_b64 s[2:3], vcc
379 ; GCN-NEXT:    s_cbranch_execz .LBB2_5
380 ; GCN-NEXT:  ; %bb.1: ; %bb.outer.then
381 ; GCN-NEXT:    v_mov_b32_e32 v4, s1
382 ; GCN-NEXT:    v_add_i32_e32 v3, vcc, s0, v1
383 ; GCN-NEXT:    v_addc_u32_e32 v4, vcc, 0, v4, vcc
384 ; GCN-NEXT:    v_cmp_ne_u32_e32 vcc, 2, v0
385 ; GCN-NEXT:    s_and_saveexec_b64 s[0:1], vcc
386 ; GCN-NEXT:    s_xor_b64 s[0:1], exec, s[0:1]
387 ; GCN-NEXT:    s_cbranch_execz .LBB2_3
388 ; GCN-NEXT:  ; %bb.2: ; %bb.else
389 ; GCN-NEXT:    s_mov_b32 s6, 0
390 ; GCN-NEXT:    s_mov_b32 s7, 0xf000
391 ; GCN-NEXT:    s_mov_b32 s4, s6
392 ; GCN-NEXT:    s_mov_b32 s5, s6
393 ; GCN-NEXT:    v_mov_b32_e32 v0, 2
394 ; GCN-NEXT:    buffer_store_dword v0, v[3:4], s[4:7], 0 addr64 offset:8
395 ; GCN-NEXT:    ; implicit-def: $vgpr3_vgpr4
396 ; GCN-NEXT:  .LBB2_3: ; %Flow
397 ; GCN-NEXT:    s_andn2_saveexec_b64 s[0:1], s[0:1]
398 ; GCN-NEXT:    s_cbranch_execz .LBB2_5
399 ; GCN-NEXT:  ; %bb.4: ; %bb.then
400 ; GCN-NEXT:    s_mov_b32 s6, 0
401 ; GCN-NEXT:    s_mov_b32 s7, 0xf000
402 ; GCN-NEXT:    s_mov_b32 s4, s6
403 ; GCN-NEXT:    s_mov_b32 s5, s6
404 ; GCN-NEXT:    s_waitcnt expcnt(0)
405 ; GCN-NEXT:    v_mov_b32_e32 v0, 1
406 ; GCN-NEXT:    buffer_store_dword v0, v[3:4], s[4:7], 0 addr64 offset:4
407 ; GCN-NEXT:  .LBB2_5: ; %bb.outer.end
408 ; GCN-NEXT:    s_or_b64 exec, exec, s[2:3]
409 ; GCN-NEXT:    s_waitcnt expcnt(0)
410 ; GCN-NEXT:    v_mov_b32_e32 v0, 3
411 ; GCN-NEXT:    s_mov_b32 m0, -1
412 ; GCN-NEXT:    ds_write_b32 v2, v0
413 ; GCN-NEXT:    s_endpgm
415 ; GCN-O0-LABEL: nested_if_if_else:
416 ; GCN-O0:       ; %bb.0: ; %bb
417 ; GCN-O0-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
418 ; GCN-O0-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
419 ; GCN-O0-NEXT:    s_mov_b32 s14, -1
420 ; GCN-O0-NEXT:    s_mov_b32 s15, 0xe8f000
421 ; GCN-O0-NEXT:    s_add_u32 s12, s12, s11
422 ; GCN-O0-NEXT:    s_addc_u32 s13, s13, 0
423 ; GCN-O0-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
424 ; GCN-O0-NEXT:    s_waitcnt lgkmcnt(0)
425 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[0:1]
426 ; GCN-O0-NEXT:    ; implicit-def: $vgpr4 : SGPR spill to VGPR lane
427 ; GCN-O0-NEXT:    v_writelane_b32 v4, s2, 0
428 ; GCN-O0-NEXT:    v_writelane_b32 v4, s3, 1
429 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
430 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Spill
431 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
432 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
433 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
434 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
435 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
436 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
437 ; GCN-O0-NEXT:    s_mov_b32 s4, 2
438 ; GCN-O0-NEXT:    v_lshlrev_b32_e64 v2, s4, v0
439 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
440 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
441 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
442 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
443 ; GCN-O0-NEXT:    ; kill: def $vgpr2 killed $vgpr2 def $vgpr2_vgpr3 killed $exec
444 ; GCN-O0-NEXT:    v_mov_b32_e32 v3, v1
445 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
446 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[0:3], 0 addr64
447 ; GCN-O0-NEXT:    s_mov_b32 s0, 1
448 ; GCN-O0-NEXT:    v_cmp_gt_u32_e64 s[2:3], v0, s0
449 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
450 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 2
451 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 3
452 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
453 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
454 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
455 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
456 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
457 ; GCN-O0-NEXT:    s_cbranch_execz .LBB2_6
458 ; GCN-O0-NEXT:  ; %bb.1: ; %bb.outer.then
459 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
460 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
461 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
462 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
463 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
464 ; GCN-O0-NEXT:    s_mov_b32 s0, 2
465 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
466 ; GCN-O0-NEXT:    v_cmp_ne_u32_e64 s[0:1], v0, s0
467 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], exec
468 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[2:3], s[0:1]
469 ; GCN-O0-NEXT:    s_xor_b64 s[2:3], s[0:1], s[2:3]
470 ; GCN-O0-NEXT:    v_writelane_b32 v4, s2, 4
471 ; GCN-O0-NEXT:    v_writelane_b32 v4, s3, 5
472 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
473 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
474 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
475 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
476 ; GCN-O0-NEXT:    s_cbranch_execz .LBB2_2
477 ; GCN-O0-NEXT:    s_branch .LBB2_4
478 ; GCN-O0-NEXT:  .LBB2_2: ; %Flow
479 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
480 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
481 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
482 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
483 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
484 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 4
485 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 5
486 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[0:1], s[0:1]
487 ; GCN-O0-NEXT:    s_and_b64 s[0:1], exec, s[0:1]
488 ; GCN-O0-NEXT:    v_writelane_b32 v4, s0, 6
489 ; GCN-O0-NEXT:    v_writelane_b32 v4, s1, 7
490 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
491 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 ; 4-byte Folded Spill
492 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
493 ; GCN-O0-NEXT:    s_xor_b64 exec, exec, s[0:1]
494 ; GCN-O0-NEXT:    s_cbranch_execz .LBB2_5
495 ; GCN-O0-NEXT:  ; %bb.3: ; %bb.then
496 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
497 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
498 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
499 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
500 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
501 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 0
502 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 1
503 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
504 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 1
505 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
506 ; GCN-O0-NEXT:    v_add_i32_e64 v1, s[2:3], v1, v0
507 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v1
508 ; GCN-O0-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
509 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
510 ; GCN-O0-NEXT:    s_mov_b32 s2, 2
511 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[1:2], s2
512 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
513 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
514 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
515 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
516 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
517 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
518 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
519 ; GCN-O0-NEXT:    s_branch .LBB2_5
520 ; GCN-O0-NEXT:  .LBB2_4: ; %bb.else
521 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
522 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
523 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
524 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
525 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
526 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 0
527 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 1
528 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
529 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 2
530 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
531 ; GCN-O0-NEXT:    v_add_i32_e64 v1, s[2:3], v1, v0
532 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v3, 31, v1
533 ; GCN-O0-NEXT:    ; kill: def $vgpr1 killed $vgpr1 def $vgpr1_vgpr2 killed $exec
534 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, v3
535 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[1:2], v0
536 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
537 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
538 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
539 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
540 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
541 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
542 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
543 ; GCN-O0-NEXT:    s_branch .LBB2_2
544 ; GCN-O0-NEXT:  .LBB2_5: ; %Flow1
545 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
546 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
547 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
548 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
549 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
550 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 6
551 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 7
552 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
553 ; GCN-O0-NEXT:  .LBB2_6: ; %bb.outer.end
554 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
555 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
556 ; GCN-O0-NEXT:    buffer_load_dword v4, off, s[12:15], 0 ; 4-byte Folded Reload
557 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
558 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
559 ; GCN-O0-NEXT:    v_readlane_b32 s0, v4, 2
560 ; GCN-O0-NEXT:    v_readlane_b32 s1, v4, 3
561 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
562 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 3
563 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 0
564 ; GCN-O0-NEXT:    s_mov_b32 m0, -1
565 ; GCN-O0-NEXT:    ds_write_b32 v0, v1
566 ; GCN-O0-NEXT:    s_endpgm
568   %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
569   %tmp1 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp
570   store i32 0, ptr addrspace(1) %tmp1, align 4
571   %tmp2 = icmp ugt i32 %tmp, 1
572   br i1 %tmp2, label %bb.outer.then, label %bb.outer.end
574 bb.outer.then:                                       ; preds = %bb
575   %tmp5 = icmp eq i32 %tmp, 2
576   br i1 %tmp5, label %bb.then, label %bb.else
578 bb.then:                                             ; preds = %bb.outer.then
579   %tmp3 = add i32 %tmp, 1
580   %tmp4 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp3
581   store i32 1, ptr addrspace(1) %tmp4, align 4
582   br label %bb.outer.end
584 bb.else:                                             ; preds = %bb.outer.then
585   %tmp7 = add i32 %tmp, 2
586   %tmp9 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp7
587   store i32 2, ptr addrspace(1) %tmp9, align 4
588   br label %bb.outer.end
590 bb.outer.end:                                        ; preds = %bb, %bb.then, %bb.else
591   store i32 3, ptr addrspace(3) null
592   ret void
595 define amdgpu_kernel void @nested_if_else_if(ptr addrspace(1) nocapture %arg) {
596 ; GCN-LABEL: nested_if_else_if:
597 ; GCN:       ; %bb.0: ; %bb
598 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
599 ; GCN-NEXT:    v_lshlrev_b32_e32 v3, 2, v0
600 ; GCN-NEXT:    v_mov_b32_e32 v4, 0
601 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
602 ; GCN-NEXT:    s_mov_b32 s2, 0
603 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
604 ; GCN-NEXT:    v_mov_b32_e32 v2, s1
605 ; GCN-NEXT:    v_add_i32_e32 v1, vcc, s0, v3
606 ; GCN-NEXT:    v_addc_u32_e32 v2, vcc, 0, v2, vcc
607 ; GCN-NEXT:    v_cmp_gt_u32_e32 vcc, 2, v0
608 ; GCN-NEXT:    buffer_store_dword v4, v[3:4], s[0:3], 0 addr64
609 ; GCN-NEXT:    s_and_saveexec_b64 s[0:1], vcc
610 ; GCN-NEXT:    s_xor_b64 s[4:5], exec, s[0:1]
611 ; GCN-NEXT:    s_cbranch_execz .LBB3_4
612 ; GCN-NEXT:  ; %bb.1: ; %bb.outer.else
613 ; GCN-NEXT:    s_mov_b32 s0, s2
614 ; GCN-NEXT:    s_mov_b32 s1, s2
615 ; GCN-NEXT:    v_mov_b32_e32 v3, 3
616 ; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 0, v0
617 ; GCN-NEXT:    buffer_store_dword v3, v[1:2], s[0:3], 0 addr64 offset:12
618 ; GCN-NEXT:    s_and_saveexec_b64 s[0:1], vcc
619 ; GCN-NEXT:    s_cbranch_execz .LBB3_3
620 ; GCN-NEXT:  ; %bb.2: ; %bb.inner.then2
621 ; GCN-NEXT:    s_mov_b32 s10, 0
622 ; GCN-NEXT:    s_mov_b32 s11, 0xf000
623 ; GCN-NEXT:    s_mov_b32 s8, s10
624 ; GCN-NEXT:    s_mov_b32 s9, s10
625 ; GCN-NEXT:    v_mov_b32_e32 v0, 4
626 ; GCN-NEXT:    buffer_store_dword v0, v[1:2], s[8:11], 0 addr64 offset:16
627 ; GCN-NEXT:  .LBB3_3: ; %Flow
628 ; GCN-NEXT:    s_or_b64 exec, exec, s[0:1]
629 ; GCN-NEXT:    ; implicit-def: $vgpr1_vgpr2
630 ; GCN-NEXT:    ; implicit-def: $vgpr0
631 ; GCN-NEXT:  .LBB3_4: ; %Flow2
632 ; GCN-NEXT:    s_andn2_saveexec_b64 s[4:5], s[4:5]
633 ; GCN-NEXT:    s_cbranch_execz .LBB3_8
634 ; GCN-NEXT:  ; %bb.5: ; %bb.outer.then
635 ; GCN-NEXT:    s_mov_b32 s0, s2
636 ; GCN-NEXT:    s_mov_b32 s1, s2
637 ; GCN-NEXT:    s_waitcnt expcnt(0)
638 ; GCN-NEXT:    v_mov_b32_e32 v3, 1
639 ; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 2, v0
640 ; GCN-NEXT:    buffer_store_dword v3, v[1:2], s[0:3], 0 addr64 offset:4
641 ; GCN-NEXT:    s_and_saveexec_b64 s[6:7], vcc
642 ; GCN-NEXT:    s_cbranch_execz .LBB3_7
643 ; GCN-NEXT:  ; %bb.6: ; %bb.inner.then
644 ; GCN-NEXT:    v_mov_b32_e32 v0, 2
645 ; GCN-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64 offset:8
646 ; GCN-NEXT:  .LBB3_7: ; %Flow1
647 ; GCN-NEXT:    s_or_b64 exec, exec, s[6:7]
648 ; GCN-NEXT:  .LBB3_8: ; %bb.outer.end
649 ; GCN-NEXT:    s_or_b64 exec, exec, s[4:5]
650 ; GCN-NEXT:    s_waitcnt expcnt(0)
651 ; GCN-NEXT:    v_mov_b32_e32 v0, 3
652 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
653 ; GCN-NEXT:    s_mov_b32 m0, -1
654 ; GCN-NEXT:    ds_write_b32 v1, v0
655 ; GCN-NEXT:    s_endpgm
657 ; GCN-O0-LABEL: nested_if_else_if:
658 ; GCN-O0:       ; %bb.0: ; %bb
659 ; GCN-O0-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
660 ; GCN-O0-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
661 ; GCN-O0-NEXT:    s_mov_b32 s14, -1
662 ; GCN-O0-NEXT:    s_mov_b32 s15, 0xe8f000
663 ; GCN-O0-NEXT:    s_add_u32 s12, s12, s11
664 ; GCN-O0-NEXT:    s_addc_u32 s13, s13, 0
665 ; GCN-O0-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9
666 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
667 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[12:15], 0 offset:12 ; 4-byte Folded Spill
668 ; GCN-O0-NEXT:    s_mov_b32 s0, 2
669 ; GCN-O0-NEXT:    v_lshlrev_b32_e64 v2, s0, v0
670 ; GCN-O0-NEXT:    s_mov_b32 s1, 0
671 ; GCN-O0-NEXT:    ; implicit-def: $sgpr1
672 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
673 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
674 ; GCN-O0-NEXT:    ; kill: def $vgpr2 killed $vgpr2 def $vgpr2_vgpr3 killed $exec
675 ; GCN-O0-NEXT:    v_mov_b32_e32 v3, v1
676 ; GCN-O0-NEXT:    s_waitcnt lgkmcnt(0)
677 ; GCN-O0-NEXT:    s_mov_b32 s2, s4
678 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v2
679 ; GCN-O0-NEXT:    s_mov_b32 s1, s5
680 ; GCN-O0-NEXT:    v_mov_b32_e32 v5, v3
681 ; GCN-O0-NEXT:    v_add_i32_e64 v4, s[2:3], s2, v1
682 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, s1
683 ; GCN-O0-NEXT:    v_addc_u32_e64 v1, s[2:3], v1, v5, s[2:3]
684 ; GCN-O0-NEXT:    ; kill: def $vgpr4 killed $vgpr4 def $vgpr4_vgpr5 killed $exec
685 ; GCN-O0-NEXT:    v_mov_b32_e32 v5, v1
686 ; GCN-O0-NEXT:    buffer_store_dword v4, off, s[12:15], 0 offset:4 ; 4-byte Folded Spill
687 ; GCN-O0-NEXT:    buffer_store_dword v5, off, s[12:15], 0 offset:8 ; 4-byte Folded Spill
688 ; GCN-O0-NEXT:    s_mov_b32 s1, 0xf000
689 ; GCN-O0-NEXT:    s_mov_b32 s2, 0
690 ; GCN-O0-NEXT:    ; kill: def $sgpr2 killed $sgpr2 def $sgpr2_sgpr3
691 ; GCN-O0-NEXT:    s_mov_b32 s3, s1
692 ; GCN-O0-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
693 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[2:3]
694 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 0
695 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[4:7], 0 addr64
696 ; GCN-O0-NEXT:    v_cmp_lt_u32_e64 s[0:1], v0, s0
697 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], exec
698 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[2:3], s[0:1]
699 ; GCN-O0-NEXT:    s_xor_b64 s[2:3], s[0:1], s[2:3]
700 ; GCN-O0-NEXT:    ; implicit-def: $vgpr6 : SGPR spill to VGPR lane
701 ; GCN-O0-NEXT:    v_writelane_b32 v6, s2, 0
702 ; GCN-O0-NEXT:    v_writelane_b32 v6, s3, 1
703 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
704 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[12:15], 0 ; 4-byte Folded Spill
705 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
706 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
707 ; GCN-O0-NEXT:    s_cbranch_execz .LBB3_1
708 ; GCN-O0-NEXT:    s_branch .LBB3_4
709 ; GCN-O0-NEXT:  .LBB3_1: ; %Flow2
710 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
711 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
712 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
713 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
714 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
715 ; GCN-O0-NEXT:    v_readlane_b32 s0, v6, 0
716 ; GCN-O0-NEXT:    v_readlane_b32 s1, v6, 1
717 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[0:1], s[0:1]
718 ; GCN-O0-NEXT:    s_and_b64 s[0:1], exec, s[0:1]
719 ; GCN-O0-NEXT:    v_writelane_b32 v6, s0, 2
720 ; GCN-O0-NEXT:    v_writelane_b32 v6, s1, 3
721 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
722 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[12:15], 0 ; 4-byte Folded Spill
723 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
724 ; GCN-O0-NEXT:    s_xor_b64 exec, exec, s[0:1]
725 ; GCN-O0-NEXT:    s_cbranch_execz .LBB3_8
726 ; GCN-O0-NEXT:  ; %bb.2: ; %bb.outer.then
727 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
728 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
729 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
730 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
731 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:12 ; 4-byte Folded Reload
732 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
733 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[12:15], 0 offset:8 ; 4-byte Folded Reload
734 ; GCN-O0-NEXT:    s_mov_b32 s0, 0xf000
735 ; GCN-O0-NEXT:    s_mov_b32 s2, 0
736 ; GCN-O0-NEXT:    s_mov_b32 s4, s2
737 ; GCN-O0-NEXT:    s_mov_b32 s5, s0
738 ; GCN-O0-NEXT:    s_mov_b32 s0, s2
739 ; GCN-O0-NEXT:    s_mov_b32 s1, s2
740 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
741 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
742 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 1
743 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
744 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[0:3], 0 addr64 offset:4
745 ; GCN-O0-NEXT:    s_mov_b32 s0, 2
746 ; GCN-O0-NEXT:    v_cmp_eq_u32_e64 s[2:3], v0, s0
747 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
748 ; GCN-O0-NEXT:    v_writelane_b32 v6, s0, 4
749 ; GCN-O0-NEXT:    v_writelane_b32 v6, s1, 5
750 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
751 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[12:15], 0 ; 4-byte Folded Spill
752 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
753 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
754 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
755 ; GCN-O0-NEXT:    s_cbranch_execz .LBB3_7
756 ; GCN-O0-NEXT:  ; %bb.3: ; %bb.inner.then
757 ; GCN-O0-NEXT:    s_waitcnt expcnt(1)
758 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
759 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[12:15], 0 offset:8 ; 4-byte Folded Reload
760 ; GCN-O0-NEXT:    s_mov_b32 s0, 0xf000
761 ; GCN-O0-NEXT:    s_mov_b32 s2, 0
762 ; GCN-O0-NEXT:    s_mov_b32 s4, s2
763 ; GCN-O0-NEXT:    s_mov_b32 s5, s0
764 ; GCN-O0-NEXT:    s_mov_b32 s0, s2
765 ; GCN-O0-NEXT:    s_mov_b32 s1, s2
766 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
767 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
768 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 2
769 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
770 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64 offset:8
771 ; GCN-O0-NEXT:    s_branch .LBB3_7
772 ; GCN-O0-NEXT:  .LBB3_4: ; %bb.outer.else
773 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
774 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
775 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
776 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
777 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:12 ; 4-byte Folded Reload
778 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
779 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[12:15], 0 offset:8 ; 4-byte Folded Reload
780 ; GCN-O0-NEXT:    s_mov_b32 s1, 0xf000
781 ; GCN-O0-NEXT:    s_mov_b32 s0, 0
782 ; GCN-O0-NEXT:    s_mov_b32 s2, s0
783 ; GCN-O0-NEXT:    s_mov_b32 s3, s1
784 ; GCN-O0-NEXT:    s_mov_b32 s4, s0
785 ; GCN-O0-NEXT:    s_mov_b32 s5, s0
786 ; GCN-O0-NEXT:    ; kill: def $sgpr4_sgpr5 killed $sgpr4_sgpr5 def $sgpr4_sgpr5_sgpr6_sgpr7
787 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[2:3]
788 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 3
789 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
790 ; GCN-O0-NEXT:    buffer_store_dword v1, v[2:3], s[4:7], 0 addr64 offset:12
791 ; GCN-O0-NEXT:    v_cmp_eq_u32_e64 s[2:3], v0, s0
792 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
793 ; GCN-O0-NEXT:    v_writelane_b32 v6, s0, 6
794 ; GCN-O0-NEXT:    v_writelane_b32 v6, s1, 7
795 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
796 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[12:15], 0 ; 4-byte Folded Spill
797 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
798 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
799 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
800 ; GCN-O0-NEXT:    s_cbranch_execz .LBB3_6
801 ; GCN-O0-NEXT:  ; %bb.5: ; %bb.inner.then2
802 ; GCN-O0-NEXT:    s_waitcnt expcnt(1)
803 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
804 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[12:15], 0 offset:8 ; 4-byte Folded Reload
805 ; GCN-O0-NEXT:    s_mov_b32 s0, 0xf000
806 ; GCN-O0-NEXT:    s_mov_b32 s2, 0
807 ; GCN-O0-NEXT:    s_mov_b32 s4, s2
808 ; GCN-O0-NEXT:    s_mov_b32 s5, s0
809 ; GCN-O0-NEXT:    s_mov_b32 s0, s2
810 ; GCN-O0-NEXT:    s_mov_b32 s1, s2
811 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
812 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
813 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 4
814 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
815 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64 offset:16
816 ; GCN-O0-NEXT:  .LBB3_6: ; %Flow
817 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
818 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
819 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
820 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
821 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
822 ; GCN-O0-NEXT:    v_readlane_b32 s0, v6, 6
823 ; GCN-O0-NEXT:    v_readlane_b32 s1, v6, 7
824 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
825 ; GCN-O0-NEXT:    s_branch .LBB3_1
826 ; GCN-O0-NEXT:  .LBB3_7: ; %Flow1
827 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
828 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
829 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
830 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
831 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
832 ; GCN-O0-NEXT:    v_readlane_b32 s0, v6, 4
833 ; GCN-O0-NEXT:    v_readlane_b32 s1, v6, 5
834 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
835 ; GCN-O0-NEXT:  .LBB3_8: ; %bb.outer.end
836 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[8:9], -1
837 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
838 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[12:15], 0 ; 4-byte Folded Reload
839 ; GCN-O0-NEXT:    s_mov_b64 exec, s[8:9]
840 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
841 ; GCN-O0-NEXT:    v_readlane_b32 s0, v6, 2
842 ; GCN-O0-NEXT:    v_readlane_b32 s1, v6, 3
843 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
844 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, 3
845 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 0
846 ; GCN-O0-NEXT:    s_mov_b32 m0, -1
847 ; GCN-O0-NEXT:    ds_write_b32 v0, v1
848 ; GCN-O0-NEXT:    s_endpgm
850   %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
851   %tmp1 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp
852   store i32 0, ptr addrspace(1) %tmp1, align 4
853   %cc1 = icmp ugt i32 %tmp, 1
854   br i1 %cc1, label %bb.outer.then, label %bb.outer.else
856 bb.outer.then:
857   %tmp2 = getelementptr inbounds i32, ptr addrspace(1) %tmp1, i32 1
858   store i32 1, ptr addrspace(1) %tmp2, align 4
859   %cc2 = icmp eq i32 %tmp, 2
860   br i1 %cc2, label %bb.inner.then, label %bb.outer.end
862 bb.inner.then:
863   %tmp3 = getelementptr inbounds i32, ptr addrspace(1) %tmp1, i32 2
864   store i32 2, ptr addrspace(1) %tmp3, align 4
865   br label %bb.outer.end
867 bb.outer.else:
868   %tmp4 = getelementptr inbounds i32, ptr addrspace(1) %tmp1, i32 3
869   store i32 3, ptr addrspace(1) %tmp4, align 4
870   %cc3 = icmp eq i32 %tmp, 0   ; avoid being optimized away through the domination
871   br i1 %cc3, label %bb.inner.then2, label %bb.outer.end
873 bb.inner.then2:
874   %tmp5 = getelementptr inbounds i32, ptr addrspace(1) %tmp1, i32 4
875   store i32 4, ptr addrspace(1) %tmp5, align 4
876   br label %bb.outer.end
878 bb.outer.end:
879   store i32 3, ptr addrspace(3) null
880   ret void
883 define amdgpu_kernel void @s_endpgm_unsafe_barrier(ptr addrspace(1) nocapture %arg) {
884 ; GCN-LABEL: s_endpgm_unsafe_barrier:
885 ; GCN:       ; %bb.0: ; %bb
886 ; GCN-NEXT:    v_cmp_lt_u32_e32 vcc, 1, v0
887 ; GCN-NEXT:    s_and_saveexec_b64 s[0:1], vcc
888 ; GCN-NEXT:    s_cbranch_execz .LBB4_2
889 ; GCN-NEXT:  ; %bb.1: ; %bb.then
890 ; GCN-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x9
891 ; GCN-NEXT:    s_mov_b32 s7, 0xf000
892 ; GCN-NEXT:    s_mov_b32 s6, 0
893 ; GCN-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
894 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
895 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
896 ; GCN-NEXT:    buffer_store_dword v1, v[0:1], s[4:7], 0 addr64
897 ; GCN-NEXT:  .LBB4_2: ; %bb.end
898 ; GCN-NEXT:    s_or_b64 exec, exec, s[0:1]
899 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
900 ; GCN-NEXT:    s_barrier
901 ; GCN-NEXT:    s_endpgm
903 ; GCN-O0-LABEL: s_endpgm_unsafe_barrier:
904 ; GCN-O0:       ; %bb.0: ; %bb
905 ; GCN-O0-NEXT:    s_mov_b32 s12, SCRATCH_RSRC_DWORD0
906 ; GCN-O0-NEXT:    s_mov_b32 s13, SCRATCH_RSRC_DWORD1
907 ; GCN-O0-NEXT:    s_mov_b32 s14, -1
908 ; GCN-O0-NEXT:    s_mov_b32 s15, 0xe8f000
909 ; GCN-O0-NEXT:    s_add_u32 s12, s12, s11
910 ; GCN-O0-NEXT:    s_addc_u32 s13, s13, 0
911 ; GCN-O0-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x9
912 ; GCN-O0-NEXT:    ; implicit-def: $vgpr3 : SGPR spill to VGPR lane
913 ; GCN-O0-NEXT:    s_waitcnt lgkmcnt(0)
914 ; GCN-O0-NEXT:    v_writelane_b32 v3, s0, 0
915 ; GCN-O0-NEXT:    v_writelane_b32 v3, s1, 1
916 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v0
917 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[12:15], 0 offset:4 ; 4-byte Folded Spill
918 ; GCN-O0-NEXT:    s_mov_b32 s0, 1
919 ; GCN-O0-NEXT:    v_cmp_gt_u32_e64 s[2:3], v0, s0
920 ; GCN-O0-NEXT:    s_mov_b64 s[0:1], exec
921 ; GCN-O0-NEXT:    v_writelane_b32 v3, s0, 2
922 ; GCN-O0-NEXT:    v_writelane_b32 v3, s1, 3
923 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
924 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[12:15], 0 ; 4-byte Folded Spill
925 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
926 ; GCN-O0-NEXT:    s_and_b64 s[0:1], s[0:1], s[2:3]
927 ; GCN-O0-NEXT:    s_mov_b64 exec, s[0:1]
928 ; GCN-O0-NEXT:    s_cbranch_execz .LBB4_2
929 ; GCN-O0-NEXT:  ; %bb.1: ; %bb.then
930 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
931 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
932 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[12:15], 0 ; 4-byte Folded Reload
933 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
934 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
935 ; GCN-O0-NEXT:    v_readlane_b32 s0, v3, 0
936 ; GCN-O0-NEXT:    v_readlane_b32 s1, v3, 1
937 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[12:15], 0 offset:4 ; 4-byte Folded Reload
938 ; GCN-O0-NEXT:    s_mov_b32 s2, 0xf000
939 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
940 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5
941 ; GCN-O0-NEXT:    s_mov_b32 s5, s2
942 ; GCN-O0-NEXT:    ; kill: def $sgpr0_sgpr1 killed $sgpr0_sgpr1 def $sgpr0_sgpr1_sgpr2_sgpr3
943 ; GCN-O0-NEXT:    s_mov_b64 s[2:3], s[4:5]
944 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
945 ; GCN-O0-NEXT:    v_ashrrev_i32_e64 v2, 31, v0
946 ; GCN-O0-NEXT:    ; kill: def $vgpr0 killed $vgpr0 def $vgpr0_vgpr1 killed $exec
947 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, v2
948 ; GCN-O0-NEXT:    s_mov_b32 s4, 2
949 ; GCN-O0-NEXT:    v_lshl_b64 v[1:2], v[0:1], s4
950 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, 0
951 ; GCN-O0-NEXT:    buffer_store_dword v0, v[1:2], s[0:3], 0 addr64
952 ; GCN-O0-NEXT:  .LBB4_2: ; %bb.end
953 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[6:7], -1
954 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
955 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[12:15], 0 ; 4-byte Folded Reload
956 ; GCN-O0-NEXT:    s_mov_b64 exec, s[6:7]
957 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
958 ; GCN-O0-NEXT:    v_readlane_b32 s0, v3, 2
959 ; GCN-O0-NEXT:    v_readlane_b32 s1, v3, 3
960 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[0:1]
961 ; GCN-O0-NEXT:    s_barrier
962 ; GCN-O0-NEXT:    s_endpgm
964   %tmp = tail call i32 @llvm.amdgcn.workitem.id.x()
965   %tmp1 = icmp ugt i32 %tmp, 1
966   br i1 %tmp1, label %bb.then, label %bb.end
968 bb.then:                                          ; preds = %bb
969   %tmp4 = getelementptr inbounds i32, ptr addrspace(1) %arg, i32 %tmp
970   store i32 0, ptr addrspace(1) %tmp4, align 4
971   br label %bb.end
973 bb.end:                                           ; preds = %bb.then, %bb
974   call void @llvm.amdgcn.s.barrier()
975   ret void
978 define void @scc_liveness(i32 %arg) local_unnamed_addr #0 {
979 ; GCN-LABEL: scc_liveness:
980 ; GCN:       ; %bb.0: ; %bb
981 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
982 ; GCN-NEXT:    s_movk_i32 s4, 0x207
983 ; GCN-NEXT:    v_cmp_gt_i32_e32 vcc, s4, v0
984 ; GCN-NEXT:    s_mov_b32 s8, 0
985 ; GCN-NEXT:    v_cmp_eq_u32_e64 s[4:5], 0, v0
986 ; GCN-NEXT:    s_mov_b64 s[12:13], 0
987 ; GCN-NEXT:    s_mov_b64 s[6:7], 0
988 ; GCN-NEXT:    s_branch .LBB5_3
989 ; GCN-NEXT:  .LBB5_1: ; %Flow
990 ; GCN-NEXT:    ; in Loop: Header=BB5_3 Depth=1
991 ; GCN-NEXT:    s_or_b64 exec, exec, s[10:11]
992 ; GCN-NEXT:  .LBB5_2: ; %bb10
993 ; GCN-NEXT:    ; in Loop: Header=BB5_3 Depth=1
994 ; GCN-NEXT:    s_or_b64 exec, exec, s[14:15]
995 ; GCN-NEXT:    s_and_b64 s[6:7], exec, s[4:5]
996 ; GCN-NEXT:    s_or_b64 s[12:13], s[6:7], s[12:13]
997 ; GCN-NEXT:    s_mov_b64 s[6:7], 0
998 ; GCN-NEXT:    s_andn2_b64 exec, exec, s[12:13]
999 ; GCN-NEXT:    s_cbranch_execz .LBB5_7
1000 ; GCN-NEXT:  .LBB5_3: ; %bb1
1001 ; GCN-NEXT:    ; =>This Inner Loop Header: Depth=1
1002 ; GCN-NEXT:    s_and_b64 s[10:11], exec, vcc
1003 ; GCN-NEXT:    s_or_b64 s[6:7], s[10:11], s[6:7]
1004 ; GCN-NEXT:    s_andn2_b64 exec, exec, s[6:7]
1005 ; GCN-NEXT:    s_cbranch_execnz .LBB5_3
1006 ; GCN-NEXT:  ; %bb.4: ; %bb2
1007 ; GCN-NEXT:    ; in Loop: Header=BB5_3 Depth=1
1008 ; GCN-NEXT:    s_or_b64 exec, exec, s[6:7]
1009 ; GCN-NEXT:    s_mov_b32 s9, s8
1010 ; GCN-NEXT:    s_mov_b32 s10, s8
1011 ; GCN-NEXT:    s_mov_b32 s11, s8
1012 ; GCN-NEXT:    v_mov_b32_e32 v0, s8
1013 ; GCN-NEXT:    v_mov_b32_e32 v1, s9
1014 ; GCN-NEXT:    v_mov_b32_e32 v2, s10
1015 ; GCN-NEXT:    v_mov_b32_e32 v3, s11
1016 ; GCN-NEXT:    s_and_saveexec_b64 s[14:15], s[4:5]
1017 ; GCN-NEXT:    s_cbranch_execz .LBB5_2
1018 ; GCN-NEXT:  ; %bb.5: ; %bb4
1019 ; GCN-NEXT:    ; in Loop: Header=BB5_3 Depth=1
1020 ; GCN-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
1021 ; GCN-NEXT:    s_waitcnt vmcnt(0)
1022 ; GCN-NEXT:    v_cmp_gt_f32_e64 s[6:7], 0, v0
1023 ; GCN-NEXT:    v_mov_b32_e32 v0, s8
1024 ; GCN-NEXT:    v_mov_b32_e32 v1, s9
1025 ; GCN-NEXT:    v_mov_b32_e32 v2, s10
1026 ; GCN-NEXT:    v_mov_b32_e32 v3, s11
1027 ; GCN-NEXT:    s_and_saveexec_b64 s[10:11], s[6:7]
1028 ; GCN-NEXT:    s_cbranch_execz .LBB5_1
1029 ; GCN-NEXT:  ; %bb.6: ; %bb8
1030 ; GCN-NEXT:    ; in Loop: Header=BB5_3 Depth=1
1031 ; GCN-NEXT:    s_mov_b32 s9, s8
1032 ; GCN-NEXT:    v_mov_b32_e32 v0, s8
1033 ; GCN-NEXT:    v_mov_b32_e32 v1, s9
1034 ; GCN-NEXT:    v_mov_b32_e32 v2, s10
1035 ; GCN-NEXT:    v_mov_b32_e32 v3, s11
1036 ; GCN-NEXT:    s_branch .LBB5_1
1037 ; GCN-NEXT:  .LBB5_7: ; %bb12
1038 ; GCN-NEXT:    s_or_b64 exec, exec, s[12:13]
1039 ; GCN-NEXT:    buffer_store_dword v3, v0, s[0:3], 0 offen
1040 ; GCN-NEXT:    s_waitcnt vmcnt(0)
1041 ; GCN-NEXT:    buffer_store_dword v2, v0, s[0:3], 0 offen
1042 ; GCN-NEXT:    s_waitcnt vmcnt(0)
1043 ; GCN-NEXT:    buffer_store_dword v1, v0, s[0:3], 0 offen
1044 ; GCN-NEXT:    s_waitcnt vmcnt(0)
1045 ; GCN-NEXT:    buffer_store_dword v0, v0, s[0:3], 0 offen
1046 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
1047 ; GCN-NEXT:    s_setpc_b64 s[30:31]
1049 ; GCN-O0-LABEL: scc_liveness:
1050 ; GCN-O0:       ; %bb.0: ; %bb
1051 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1052 ; GCN-O0-NEXT:    s_xor_saveexec_b64 s[4:5], -1
1053 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 offset:72 ; 4-byte Folded Spill
1054 ; GCN-O0-NEXT:    s_mov_b64 exec, s[4:5]
1055 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill
1056 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], 0
1057 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[4:5]
1058 ; GCN-O0-NEXT:    ; implicit-def: $vgpr6 : SGPR spill to VGPR lane
1059 ; GCN-O0-NEXT:    s_waitcnt expcnt(1)
1060 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 0
1061 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 1
1062 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 2
1063 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 3
1064 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1065 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1066 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1067 ; GCN-O0-NEXT:  .LBB5_1: ; %bb1
1068 ; GCN-O0-NEXT:    ; =>This Inner Loop Header: Depth=1
1069 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1070 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1071 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1072 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1073 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1074 ; GCN-O0-NEXT:    v_readlane_b32 s8, v6, 2
1075 ; GCN-O0-NEXT:    v_readlane_b32 s9, v6, 3
1076 ; GCN-O0-NEXT:    v_readlane_b32 s6, v6, 0
1077 ; GCN-O0-NEXT:    v_readlane_b32 s7, v6, 1
1078 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 4
1079 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 5
1080 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload
1081 ; GCN-O0-NEXT:    s_mov_b32 s4, 0x207
1082 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1083 ; GCN-O0-NEXT:    v_cmp_lt_i32_e64 s[4:5], v0, s4
1084 ; GCN-O0-NEXT:    s_or_b64 s[4:5], s[4:5], s[8:9]
1085 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 6
1086 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 7
1087 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 0
1088 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 1
1089 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[4:5]
1090 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 2
1091 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 3
1092 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1093 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1094 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1095 ; GCN-O0-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1096 ; GCN-O0-NEXT:    s_cbranch_execnz .LBB5_1
1097 ; GCN-O0-NEXT:  ; %bb.2: ; %bb2
1098 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1099 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1100 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1101 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1102 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1103 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1104 ; GCN-O0-NEXT:    v_readlane_b32 s4, v6, 6
1105 ; GCN-O0-NEXT:    v_readlane_b32 s5, v6, 7
1106 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[4:5]
1107 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload
1108 ; GCN-O0-NEXT:    s_mov_b32 s6, 0
1109 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1110 ; GCN-O0-NEXT:    v_cmp_ne_u32_e64 s[4:5], v0, s6
1111 ; GCN-O0-NEXT:    v_cmp_eq_u32_e64 s[6:7], v0, s6
1112 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 8
1113 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 9
1114 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
1115 ; GCN-O0-NEXT:    s_mov_b32 s8, s4
1116 ; GCN-O0-NEXT:    s_mov_b32 s9, s4
1117 ; GCN-O0-NEXT:    s_mov_b32 s10, s4
1118 ; GCN-O0-NEXT:    s_mov_b32 s11, s4
1119 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, s8
1120 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, s9
1121 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, s10
1122 ; GCN-O0-NEXT:    v_mov_b32_e32 v3, s11
1123 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill
1124 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill
1125 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill
1126 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill
1127 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], exec
1128 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 10
1129 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 11
1130 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1131 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1132 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1133 ; GCN-O0-NEXT:    s_and_b64 s[4:5], s[4:5], s[6:7]
1134 ; GCN-O0-NEXT:    s_mov_b64 exec, s[4:5]
1135 ; GCN-O0-NEXT:    s_cbranch_execz .LBB5_5
1136 ; GCN-O0-NEXT:  ; %bb.3: ; %bb4
1137 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1138 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1139 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1140 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1141 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1142 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1143 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, s4
1144 ; GCN-O0-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
1145 ; GCN-O0-NEXT:    s_mov_b32 s4, 0
1146 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1147 ; GCN-O0-NEXT:    v_cmp_lt_f32_e64 s[6:7], v0, s4
1148 ; GCN-O0-NEXT:    s_mov_b32 s8, s4
1149 ; GCN-O0-NEXT:    s_mov_b32 s9, s4
1150 ; GCN-O0-NEXT:    s_mov_b32 s10, s4
1151 ; GCN-O0-NEXT:    s_mov_b32 s11, s4
1152 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, s8
1153 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, s9
1154 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, s10
1155 ; GCN-O0-NEXT:    v_mov_b32_e32 v3, s11
1156 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill
1157 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill
1158 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill
1159 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill
1160 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], exec
1161 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 12
1162 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 13
1163 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1164 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1165 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1166 ; GCN-O0-NEXT:    s_and_b64 s[4:5], s[4:5], s[6:7]
1167 ; GCN-O0-NEXT:    s_mov_b64 exec, s[4:5]
1168 ; GCN-O0-NEXT:    s_cbranch_execz .LBB5_6
1169 ; GCN-O0-NEXT:  ; %bb.4: ; %bb8
1170 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1171 ; GCN-O0-NEXT:    s_mov_b32 s10, 0
1172 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1173 ; GCN-O0-NEXT:    ; implicit-def: $sgpr5
1174 ; GCN-O0-NEXT:    ; implicit-def: $sgpr9
1175 ; GCN-O0-NEXT:    ; implicit-def: $sgpr5
1176 ; GCN-O0-NEXT:    ; implicit-def: $sgpr8
1177 ; GCN-O0-NEXT:    ; implicit-def: $sgpr5
1178 ; GCN-O0-NEXT:    ; kill: def $sgpr4 killed $sgpr4 def $sgpr4_sgpr5_sgpr6_sgpr7
1179 ; GCN-O0-NEXT:    s_mov_b32 s5, s10
1180 ; GCN-O0-NEXT:    s_mov_b32 s6, s9
1181 ; GCN-O0-NEXT:    s_mov_b32 s7, s8
1182 ; GCN-O0-NEXT:    s_waitcnt expcnt(1)
1183 ; GCN-O0-NEXT:    v_mov_b32_e32 v0, s4
1184 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, s5
1185 ; GCN-O0-NEXT:    v_mov_b32_e32 v2, s6
1186 ; GCN-O0-NEXT:    v_mov_b32_e32 v3, s7
1187 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill
1188 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill
1189 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill
1190 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill
1191 ; GCN-O0-NEXT:    s_branch .LBB5_6
1192 ; GCN-O0-NEXT:  .LBB5_5: ; %Flow2
1193 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1194 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1195 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1196 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1197 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1198 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1199 ; GCN-O0-NEXT:    v_readlane_b32 s4, v6, 10
1200 ; GCN-O0-NEXT:    v_readlane_b32 s5, v6, 11
1201 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[4:5]
1202 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload
1203 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload
1204 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload
1205 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload
1206 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1207 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill
1208 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1209 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill
1210 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1211 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill
1212 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1213 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill
1214 ; GCN-O0-NEXT:    s_branch .LBB5_7
1215 ; GCN-O0-NEXT:  .LBB5_6: ; %Flow
1216 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1217 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1218 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1219 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1220 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1221 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1222 ; GCN-O0-NEXT:    v_readlane_b32 s4, v6, 12
1223 ; GCN-O0-NEXT:    v_readlane_b32 s5, v6, 13
1224 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[4:5]
1225 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload
1226 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload
1227 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload
1228 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload
1229 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1230 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill
1231 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1232 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill
1233 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1234 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill
1235 ; GCN-O0-NEXT:    s_waitcnt vmcnt(3)
1236 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill
1237 ; GCN-O0-NEXT:    s_branch .LBB5_5
1238 ; GCN-O0-NEXT:  .LBB5_7: ; %bb10
1239 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1240 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1241 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1242 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1243 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1244 ; GCN-O0-NEXT:    v_readlane_b32 s6, v6, 8
1245 ; GCN-O0-NEXT:    v_readlane_b32 s7, v6, 9
1246 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], -1
1247 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 14
1248 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 15
1249 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], exec
1250 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 16
1251 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 17
1252 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1253 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1254 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1255 ; GCN-O0-NEXT:    s_and_b64 s[4:5], s[4:5], s[6:7]
1256 ; GCN-O0-NEXT:    s_mov_b64 exec, s[4:5]
1257 ; GCN-O0-NEXT:    s_cbranch_execz .LBB5_9
1258 ; GCN-O0-NEXT:  ; %bb.8: ; %Flow1
1259 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1260 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1261 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1262 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1263 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1264 ; GCN-O0-NEXT:    s_mov_b64 s[4:5], 0
1265 ; GCN-O0-NEXT:    s_xor_b64 s[4:5], exec, -1
1266 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1267 ; GCN-O0-NEXT:    v_writelane_b32 v6, s4, 14
1268 ; GCN-O0-NEXT:    v_writelane_b32 v6, s5, 15
1269 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1270 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1271 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1272 ; GCN-O0-NEXT:  .LBB5_9: ; %Flow3
1273 ; GCN-O0-NEXT:    ; in Loop: Header=BB5_1 Depth=1
1274 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1275 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1276 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1277 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1278 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1279 ; GCN-O0-NEXT:    v_readlane_b32 s8, v6, 16
1280 ; GCN-O0-NEXT:    v_readlane_b32 s9, v6, 17
1281 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[8:9]
1282 ; GCN-O0-NEXT:    v_readlane_b32 s6, v6, 4
1283 ; GCN-O0-NEXT:    v_readlane_b32 s7, v6, 5
1284 ; GCN-O0-NEXT:    v_readlane_b32 s4, v6, 14
1285 ; GCN-O0-NEXT:    v_readlane_b32 s5, v6, 15
1286 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload
1287 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload
1288 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload
1289 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload
1290 ; GCN-O0-NEXT:    s_and_b64 s[4:5], exec, s[4:5]
1291 ; GCN-O0-NEXT:    s_or_b64 s[4:5], s[4:5], s[6:7]
1292 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], 0
1293 ; GCN-O0-NEXT:    s_mov_b64 s[8:9], s[4:5]
1294 ; GCN-O0-NEXT:    v_writelane_b32 v6, s8, 0
1295 ; GCN-O0-NEXT:    v_writelane_b32 v6, s9, 1
1296 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 2
1297 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 3
1298 ; GCN-O0-NEXT:    s_mov_b64 s[6:7], s[4:5]
1299 ; GCN-O0-NEXT:    v_writelane_b32 v6, s6, 18
1300 ; GCN-O0-NEXT:    v_writelane_b32 v6, s7, 19
1301 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1302 ; GCN-O0-NEXT:    buffer_store_dword v6, off, s[0:3], s32 ; 4-byte Folded Spill
1303 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1304 ; GCN-O0-NEXT:    s_waitcnt vmcnt(4)
1305 ; GCN-O0-NEXT:    buffer_store_dword v0, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill
1306 ; GCN-O0-NEXT:    s_waitcnt vmcnt(4)
1307 ; GCN-O0-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill
1308 ; GCN-O0-NEXT:    s_waitcnt vmcnt(4)
1309 ; GCN-O0-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill
1310 ; GCN-O0-NEXT:    s_waitcnt vmcnt(4)
1311 ; GCN-O0-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill
1312 ; GCN-O0-NEXT:    s_andn2_b64 exec, exec, s[4:5]
1313 ; GCN-O0-NEXT:    s_cbranch_execnz .LBB5_1
1314 ; GCN-O0-NEXT:  ; %bb.10: ; %bb12
1315 ; GCN-O0-NEXT:    s_or_saveexec_b64 s[14:15], -1
1316 ; GCN-O0-NEXT:    s_waitcnt expcnt(4)
1317 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 ; 4-byte Folded Reload
1318 ; GCN-O0-NEXT:    s_mov_b64 exec, s[14:15]
1319 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1320 ; GCN-O0-NEXT:    v_readlane_b32 s4, v6, 18
1321 ; GCN-O0-NEXT:    v_readlane_b32 s5, v6, 19
1322 ; GCN-O0-NEXT:    s_or_b64 exec, exec, s[4:5]
1323 ; GCN-O0-NEXT:  ; %bb.11: ; %bb12
1324 ; GCN-O0-NEXT:    s_waitcnt expcnt(3)
1325 ; GCN-O0-NEXT:    buffer_load_dword v0, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload
1326 ; GCN-O0-NEXT:    s_waitcnt expcnt(2)
1327 ; GCN-O0-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload
1328 ; GCN-O0-NEXT:    s_waitcnt expcnt(1)
1329 ; GCN-O0-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload
1330 ; GCN-O0-NEXT:    s_waitcnt expcnt(0)
1331 ; GCN-O0-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload
1332 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1333 ; GCN-O0-NEXT:    v_mov_b32_e32 v4, v3
1334 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1335 ; GCN-O0-NEXT:    v_mov_b32_e32 v5, s4
1336 ; GCN-O0-NEXT:    buffer_store_dword v4, v5, s[0:3], 0 offen
1337 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
1338 ; GCN-O0-NEXT:    v_mov_b32_e32 v4, v2
1339 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1340 ; GCN-O0-NEXT:    v_mov_b32_e32 v5, s4
1341 ; GCN-O0-NEXT:    buffer_store_dword v4, v5, s[0:3], 0 offen
1342 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
1343 ; GCN-O0-NEXT:    v_mov_b32_e32 v4, v1
1344 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1345 ; GCN-O0-NEXT:    v_mov_b32_e32 v5, s4
1346 ; GCN-O0-NEXT:    buffer_store_dword v4, v5, s[0:3], 0 offen
1347 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1348 ; GCN-O0-NEXT:    ; kill: def $vgpr0 killed $vgpr0 killed $vgpr0_vgpr1_vgpr2_vgpr3 killed $exec
1349 ; GCN-O0-NEXT:    ; implicit-def: $sgpr4
1350 ; GCN-O0-NEXT:    v_mov_b32_e32 v1, s4
1351 ; GCN-O0-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
1352 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0)
1353 ; GCN-O0-NEXT:    s_xor_saveexec_b64 s[4:5], -1
1354 ; GCN-O0-NEXT:    buffer_load_dword v6, off, s[0:3], s32 offset:72 ; 4-byte Folded Reload
1355 ; GCN-O0-NEXT:    s_mov_b64 exec, s[4:5]
1356 ; GCN-O0-NEXT:    s_waitcnt vmcnt(0) expcnt(0)
1357 ; GCN-O0-NEXT:    s_setpc_b64 s[30:31]
1359   br label %bb1
1361 bb1:                                              ; preds = %Flow1, %bb1, %bb
1362   %tmp = icmp slt i32 %arg, 519
1363   br i1 %tmp, label %bb2, label %bb1
1365 bb2:                                              ; preds = %bb1
1366   %tmp3 = icmp eq i32 %arg, 0
1367   br i1 %tmp3, label %bb4, label %bb10
1369 bb4:                                              ; preds = %bb2
1370   %tmp6 = load float, ptr addrspace(5) undef
1371   %tmp7 = fcmp olt float %tmp6, 0.0
1372   br i1 %tmp7, label %bb8, label %Flow
1374 bb8:                                              ; preds = %bb4
1375   %tmp9 = insertelement <4 x float> undef, float 0.0, i32 1
1376   br label %Flow
1378 Flow:                                             ; preds = %bb8, %bb4
1379   %tmp8 = phi <4 x float> [ %tmp9, %bb8 ], [ zeroinitializer, %bb4 ]
1380   br label %bb10
1382 bb10:                                             ; preds = %Flow, %bb2
1383   %tmp11 = phi <4 x float> [ zeroinitializer, %bb2 ], [ %tmp8, %Flow ]
1384   br i1 %tmp3, label %bb12, label %Flow1
1386 Flow1:                                            ; preds = %bb10
1387   br label %bb1
1389 bb12:                                             ; preds = %bb10
1390   store volatile <4 x float> %tmp11, ptr addrspace(5) undef, align 16
1391   ret void
1394 declare i32 @llvm.amdgcn.workitem.id.x() #0
1395 declare void @llvm.amdgcn.s.barrier() #1
1397 attributes #0 = { nounwind readnone speculatable }
1398 attributes #1 = { nounwind convergent }
1399 attributes #2 = { nounwind }
1401 !llvm.module.flags = !{!0}
1402 !0 = !{i32 1, !"amdhsa_code_object_version", i32 500}