1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -march=amdgcn -verify-machineinstrs -run-pass=si-lower-control-flow -amdgpu-remove-redundant-endcf %s -o - | FileCheck -check-prefix=GCN %s
3
4# Make sure dbg_value doesn't change codeegn when collapsing end_cf
5---
6name: simple_nested_if_dbg_value
7tracksRegLiveness: true
8machineFunctionInfo:
9  isEntryFunction: true
10body:             |
11  ; GCN-LABEL: name: simple_nested_if_dbg_value
12  ; GCN: bb.0:
13  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
14  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
15  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
16  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
17  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
18  ; GCN: bb.1:
19  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
20  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
21  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
22  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
23  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
24  ; GCN: bb.2:
25  ; GCN:   successors: %bb.3(0x80000000)
26  ; GCN: bb.3:
27  ; GCN:   successors: %bb.4(0x80000000)
28  ; GCN:   DBG_VALUE
29  ; GCN: bb.4:
30  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
31  ; GCN:   DBG_VALUE
32  ; GCN:   S_ENDPGM 0
33  bb.0:
34    successors: %bb.1, %bb.4
35
36    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
37
38  bb.1:
39    successors: %bb.2, %bb.3
40
41    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
42
43  bb.2:
44
45  bb.3:
46    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
47    DBG_VALUE
48
49  bb.4:
50    DBG_VALUE
51    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
52    S_ENDPGM 0
53
54...
55
56# Empty block separates the collapsable s_or_b64
57---
58name: simple_nested_if_empty_block_between
59tracksRegLiveness: true
60machineFunctionInfo:
61  isEntryFunction: true
62body:             |
63  ; GCN-LABEL: name: simple_nested_if_empty_block_between
64  ; GCN: bb.0:
65  ; GCN:   successors: %bb.5(0x40000000), %bb.1(0x40000000)
66  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
67  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
68  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
69  ; GCN:   S_CBRANCH_EXECZ %bb.5, implicit $exec
70  ; GCN: bb.1:
71  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
72  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
73  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
74  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
75  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
76  ; GCN: bb.2:
77  ; GCN:   successors: %bb.3(0x80000000)
78  ; GCN: bb.3:
79  ; GCN:   successors: %bb.4(0x80000000)
80  ; GCN: bb.4:
81  ; GCN:   successors: %bb.5(0x80000000)
82  ; GCN: bb.5:
83  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
84  ; GCN:   S_ENDPGM 0
85  bb.0:
86    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
87
88  bb.1:
89    successors: %bb.2, %bb.3
90
91    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
92
93  bb.2:
94
95  bb.3:
96    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
97
98  bb.5:
99
100  bb.4:
101    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
102    S_ENDPGM 0
103
104...
105
106# Effectively empty block separates the collapsable s_or_b64
107---
108name: simple_nested_if_empty_block_dbg_between
109tracksRegLiveness: true
110machineFunctionInfo:
111  isEntryFunction: true
112body:             |
113  ; GCN-LABEL: name: simple_nested_if_empty_block_dbg_between
114  ; GCN: bb.0:
115  ; GCN:   successors: %bb.1(0x40000000), %bb.5(0x40000000)
116  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
117  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
118  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
119  ; GCN:   S_CBRANCH_EXECZ %bb.5, implicit $exec
120  ; GCN: bb.1:
121  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
122  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
123  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
124  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
125  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
126  ; GCN: bb.2:
127  ; GCN:   successors: %bb.3(0x80000000)
128  ; GCN: bb.3:
129  ; GCN:   successors: %bb.4(0x80000000)
130  ; GCN: bb.4:
131  ; GCN:   successors: %bb.5(0x80000000)
132  ; GCN:   DBG_VALUE
133  ; GCN: bb.5:
134  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
135  ; GCN:   S_ENDPGM 0
136  bb.0:
137    successors: %bb.1, %bb.4
138
139    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
140
141  bb.1:
142    successors: %bb.2, %bb.3
143
144    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
145
146  bb.2:
147
148  bb.3:
149    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
150
151  bb.5:
152    DBG_VALUE
153
154  bb.4:
155    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
156    S_ENDPGM 0
157
158...
159
160---
161name: skip_salu_and_meta_insts_find_first
162tracksRegLiveness: true
163machineFunctionInfo:
164  isEntryFunction: true
165body:             |
166  ; GCN-LABEL: name: skip_salu_and_meta_insts_find_first
167  ; GCN: bb.0:
168  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
169  ; GCN:   liveins: $vgpr0, $sgpr0_sgpr1
170  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
171  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
172  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
173  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
174  ; GCN: bb.1:
175  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
176  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
177  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
178  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
179  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
180  ; GCN: bb.2:
181  ; GCN:   successors: %bb.3(0x80000000)
182  ; GCN: bb.3:
183  ; GCN:   successors: %bb.4(0x80000000)
184  ; GCN:   [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF
185  ; GCN:   [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]
186  ; GCN:   KILL [[DEF]]
187  ; GCN: bb.4:
188  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
189  ; GCN:   S_ENDPGM 0
190  bb.0:
191    successors: %bb.1, %bb.4
192    liveins: $vgpr0, $sgpr0_sgpr1
193
194    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
195
196  bb.1:
197    successors: %bb.2, %bb.3
198
199    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
200
201  bb.2:
202
203  bb.3:
204    %4:sgpr_32 = IMPLICIT_DEF
205    %5:sgpr_32 = S_BREV_B32 %4
206    KILL %4
207    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
208
209  bb.4:
210    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
211    S_ENDPGM 0
212
213...
214
215# Make sure SALU instructions, meta instructions, and SGPR->SGPR
216# copies are skipped.
217---
218name: skip_salu_and_meta_insts_after
219tracksRegLiveness: true
220machineFunctionInfo:
221  isEntryFunction: true
222body:             |
223  ; GCN-LABEL: name: skip_salu_and_meta_insts_after
224  ; GCN: bb.0:
225  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
226  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
227  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
228  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
229  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
230  ; GCN: bb.1:
231  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
232  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
233  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
234  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
235  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
236  ; GCN: bb.2:
237  ; GCN:   successors: %bb.3(0x80000000)
238  ; GCN: bb.3:
239  ; GCN:   successors: %bb.4(0x80000000)
240  ; GCN:   [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF
241  ; GCN:   [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]
242  ; GCN:   KILL [[DEF]]
243  ; GCN:   [[COPY2:%[0-9]+]]:sgpr_32 = COPY [[S_BREV_B32_]]
244  ; GCN: bb.4:
245  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
246  ; GCN:   S_ENDPGM 0
247  bb.0:
248    successors: %bb.1, %bb.4
249
250    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
251
252  bb.1:
253    successors: %bb.2, %bb.3
254
255    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
256
257  bb.2:
258
259  bb.3:
260    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
261    %4:sgpr_32 = IMPLICIT_DEF
262    %5:sgpr_32 = S_BREV_B32 %4
263    KILL %4
264    %6:sgpr_32 = COPY %5
265
266  bb.4:
267    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
268    S_ENDPGM 0
269
270...
271
272# SALU instruction depends on exec through a normal operand.
273---
274name: salu_exec_dependency
275tracksRegLiveness: true
276machineFunctionInfo:
277  isEntryFunction: true
278body:             |
279  ; GCN-LABEL: name: salu_exec_dependency
280  ; GCN: bb.0:
281  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
282  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
283  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
284  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
285  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
286  ; GCN: bb.1:
287  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
288  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
289  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
290  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
291  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
292  ; GCN: bb.2:
293  ; GCN:   successors: %bb.3(0x80000000)
294  ; GCN: bb.3:
295  ; GCN:   successors: %bb.4(0x80000000)
296  ; GCN:   $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc
297  ; GCN:   [[S_BREV_B64_:%[0-9]+]]:sreg_64 = S_BREV_B64 $exec
298  ; GCN: bb.4:
299  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
300  ; GCN:   S_ENDPGM 0
301  bb.0:
302    successors: %bb.1, %bb.4
303
304    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
305
306  bb.1:
307    successors: %bb.2, %bb.3
308
309    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
310
311  bb.2:
312
313  bb.3:
314    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
315    %4:sreg_64 = S_BREV_B64 $exec
316
317  bb.4:
318    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
319    S_ENDPGM 0
320
321...
322
323# Copy to / from VGPR should be assumed to read exec
324---
325name: copy_no_explicit_exec_dependency
326tracksRegLiveness: true
327machineFunctionInfo:
328  isEntryFunction: true
329body:             |
330  ; GCN-LABEL: name: copy_no_explicit_exec_dependency
331  ; GCN: bb.0:
332  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
333  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
334  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
335  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
336  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
337  ; GCN: bb.1:
338  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
339  ; GCN:   [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF
340  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
341  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc
342  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
343  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
344  ; GCN: bb.2:
345  ; GCN:   successors: %bb.3(0x80000000)
346  ; GCN: bb.3:
347  ; GCN:   successors: %bb.4(0x80000000)
348  ; GCN:   $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc
349  ; GCN:   [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[DEF]].sub2
350  ; GCN: bb.4:
351  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
352  ; GCN:   S_ENDPGM 0
353  bb.0:
354    successors: %bb.1, %bb.4
355
356    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
357
358  bb.1:
359    successors: %bb.2, %bb.3
360
361    %2:vreg_128 = IMPLICIT_DEF
362    %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
363
364  bb.2:
365
366  bb.3:
367    SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
368    %5:vgpr_32 = COPY %2.sub2
369
370  bb.4:
371    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
372    S_ENDPGM 0
373
374...
375
376---
377name: simple_nested_if_not_layout_successor
378tracksRegLiveness: true
379machineFunctionInfo:
380  isEntryFunction: true
381body:             |
382  ; GCN-LABEL: name: simple_nested_if_not_layout_successor
383  ; GCN: bb.0:
384  ; GCN:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
385  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
386  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
387  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
388  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
389  ; GCN: bb.1:
390  ; GCN:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
391  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
392  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
393  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
394  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
395  ; GCN: bb.2:
396  ; GCN:   successors: %bb.3(0x80000000)
397  ; GCN: bb.3:
398  ; GCN:   successors: %bb.5(0x80000000)
399  ; GCN:   S_BRANCH %bb.5
400  ; GCN: bb.4:
401  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
402  ; GCN:   S_ENDPGM 0
403  ; GCN: bb.5:
404  ; GCN:   successors: %bb.4(0x80000000)
405  ; GCN:   S_BRANCH %bb.4
406  bb.0:
407    successors: %bb.1, %bb.4
408
409    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
410
411  bb.1:
412    successors: %bb.2, %bb.3
413
414    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
415
416  bb.2:
417
418  bb.3:
419    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
420    S_BRANCH %bb.5
421
422  bb.4:
423    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
424    S_ENDPGM 0
425
426  bb.5:
427    S_BRANCH %bb.4
428
429...
430
431# This should never happen, but check that we do not hang anyway
432
433---
434name: resursive_endcf
435tracksRegLiveness: true
436liveins:
437  - { reg: '$vgpr0', virtual-reg: '%0' }
438machineFunctionInfo:
439  isEntryFunction: true
440body:             |
441  ; GCN-LABEL: name: resursive_endcf
442  ; GCN: bb.0:
443  ; GCN:   successors: %bb.1(0x80000000)
444  ; GCN:   liveins: $vgpr0
445  ; GCN:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
446  ; GCN:   [[V_CMP_LT_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_U32_e64 1, [[COPY]], implicit $exec
447  ; GCN: bb.1:
448  ; GCN:   successors: %bb.1(0x80000000)
449  ; GCN:   $exec = S_OR_B64 $exec, [[V_CMP_LT_U32_e64_]], implicit-def $scc
450  ; GCN:   S_BRANCH %bb.1
451  bb.0:
452    successors: %bb.1
453    liveins: $vgpr0
454
455    %0:vgpr_32 = COPY $vgpr0
456    %2:sreg_64 = V_CMP_LT_U32_e64 1, %0, implicit $exec
457
458  bb.1:
459    successors: %bb.1
460
461    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
462    S_BRANCH %bb.1
463
464...
465
466# Both s_or_b64 shall be preserved since the outer SI_END_CF belongs to SI_ELSE.
467
468---
469name: simple_outer_if_else
470tracksRegLiveness: true
471machineFunctionInfo:
472  isEntryFunction: true
473body:             |
474  ; GCN-LABEL: name: simple_outer_if_else
475  ; GCN: bb.0:
476  ; GCN:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
477  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
478  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
479  ; GCN:   [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_]], [[COPY]], implicit-def dead $scc
480  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
481  ; GCN:   S_CBRANCH_EXECZ %bb.2, implicit $exec
482  ; GCN: bb.1:
483  ; GCN:   successors: %bb.2(0x80000000)
484  ; GCN:   S_BRANCH %bb.2
485  ; GCN: bb.2:
486  ; GCN:   successors: %bb.3(0x40000000), %bb.6(0x40000000)
487  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY [[S_XOR_B64_]]
488  ; GCN:   [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[COPY1]], implicit-def $exec, implicit-def $scc, implicit $exec
489  ; GCN:   $exec = S_XOR_B64_term $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc
490  ; GCN:   S_CBRANCH_EXECZ %bb.6, implicit $exec
491  ; GCN: bb.3:
492  ; GCN:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
493  ; GCN:   [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
494  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], undef %4:sreg_64, implicit-def dead $scc
495  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
496  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
497  ; GCN: bb.4:
498  ; GCN:   successors: %bb.5(0x80000000)
499  ; GCN: bb.5:
500  ; GCN:   successors: %bb.6(0x80000000)
501  ; GCN:   $exec = S_OR_B64 $exec, [[COPY2]], implicit-def $scc
502  ; GCN: bb.6:
503  ; GCN:   $exec = S_OR_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc
504  ; GCN:   S_ENDPGM 0
505  bb.0:
506    successors: %bb.1, %bb.2
507
508    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
509
510  bb.1:
511    successors: %bb.2
512    S_BRANCH %bb.2
513
514  bb.2:
515    successors: %bb.3, %bb.6
516    %2:sreg_64 = SI_ELSE %0:sreg_64, %bb.6, 0, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
517
518  bb.3:
519    successors: %bb.3, %bb.4
520
521    %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
522
523  bb.4:
524    successors: %bb.5
525
526  bb.5:
527    successors: %bb.6
528
529    SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
530
531  bb.6:
532    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
533    S_ENDPGM 0
534
535...
536
537---
538name: if_inside_loop
539tracksRegLiveness: true
540machineFunctionInfo:
541  isEntryFunction: true
542body:             |
543  ; GCN-LABEL: name: if_inside_loop
544  ; GCN: bb.0:
545  ; GCN:   successors: %bb.6(0x80000000)
546  ; GCN:   S_BRANCH %bb.6
547  ; GCN: bb.1:
548  ; GCN:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
549  ; GCN:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
550  ; GCN:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
551  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
552  ; GCN:   S_CBRANCH_EXECZ %bb.3, implicit $exec
553  ; GCN: bb.2:
554  ; GCN:   successors: %bb.6(0x80000000)
555  ; GCN:   S_BRANCH %bb.6
556  ; GCN: bb.3:
557  ; GCN:   successors: %bb.4(0x80000000)
558  ; GCN:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
559  ; GCN: bb.4:
560  ; GCN:   successors: %bb.5(0x80000000)
561  ; GCN:   $exec = S_OR_B64 $exec, %2, implicit-def $scc
562  ; GCN: bb.5:
563  ; GCN:   successors: %bb.6(0x80000000)
564  ; GCN: bb.6:
565  ; GCN:   successors: %bb.4(0x40000000), %bb.0(0x40000000)
566  ; GCN:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
567  ; GCN:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
568  ; GCN:   [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_1]], [[COPY1]], implicit-def dead $scc
569  ; GCN:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
570  ; GCN:   S_CBRANCH_EXECZ %bb.4, implicit $exec
571  ; GCN:   S_BRANCH %bb.0
572  ; GCN:   S_ENDPGM 0
573  bb.0:
574    S_BRANCH %bb.6
575
576  bb.1:
577    %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
578
579  bb.2:
580    S_BRANCH %bb.6
581
582  bb.3:
583    SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
584
585  bb.4:
586    SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
587
588  bb.5:
589
590  bb.6:
591    %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
592    S_BRANCH %bb.0
593    S_ENDPGM 0
594
595...
596