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