[clang] Fix crashes when passing VLA to va_arg (#119563)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / collapse-endcf.mir
blob48ca53732ed061665ea374e106324ae230b9622a
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn -verify-machineinstrs -run-pass=si-lower-control-flow -amdgpu-remove-redundant-endcf %s -o - | FileCheck -check-prefix=GCN %s
4 # Make sure dbg_value doesn't change codeegn when collapsing end_cf
5 ---
6 name: simple_nested_if_dbg_value
7 tracksRegLiveness: true
8 machineFunctionInfo:
9   isEntryFunction: true
10 body:             |
11   ; GCN-LABEL: name: simple_nested_if_dbg_value
12   ; GCN: bb.0:
13   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
14   ; GCN-NEXT: {{  $}}
15   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
16   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
17   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
18   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
19   ; GCN-NEXT: {{  $}}
20   ; GCN-NEXT: bb.1:
21   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
22   ; GCN-NEXT: {{  $}}
23   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
24   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
25   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
26   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
27   ; GCN-NEXT: {{  $}}
28   ; GCN-NEXT: bb.2:
29   ; GCN-NEXT:   successors: %bb.4(0x80000000)
30   ; GCN-NEXT: {{  $}}
31   ; GCN-NEXT: bb.4:
32   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
33   ; GCN-NEXT:   DBG_VALUE
34   ; GCN-NEXT:   S_ENDPGM 0
35   bb.0:
36     successors: %bb.1, %bb.4
38     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
40   bb.1:
41     successors: %bb.2, %bb.3
43     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
45   bb.2:
47   bb.3:
48     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
49     DBG_VALUE
51   bb.4:
52     DBG_VALUE
53     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
54     S_ENDPGM 0
56 ...
58 # Empty block separates the collapsable s_or_b64
59 ---
60 name: simple_nested_if_empty_block_between
61 tracksRegLiveness: true
62 machineFunctionInfo:
63   isEntryFunction: true
64 body:             |
65   ; GCN-LABEL: name: simple_nested_if_empty_block_between
66   ; GCN: bb.0:
67   ; GCN-NEXT:   successors: %bb.5(0x40000000), %bb.1(0x40000000)
68   ; GCN-NEXT: {{  $}}
69   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
70   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
71   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
72   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
73   ; GCN-NEXT: {{  $}}
74   ; GCN-NEXT: bb.1:
75   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
76   ; GCN-NEXT: {{  $}}
77   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
78   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
79   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
80   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
81   ; GCN-NEXT: {{  $}}
82   ; GCN-NEXT: bb.2:
83   ; GCN-NEXT:   successors: %bb.4(0x80000000)
84   ; GCN-NEXT: {{  $}}
85   ; GCN-NEXT: bb.4:
86   ; GCN-NEXT:   successors: %bb.5(0x80000000)
87   ; GCN-NEXT: {{  $}}
88   ; GCN-NEXT: bb.5:
89   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
90   ; GCN-NEXT:   S_ENDPGM 0
91   bb.0:
92     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
94   bb.1:
95     successors: %bb.2, %bb.3
97     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
99   bb.2:
101   bb.3:
102     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
104   bb.5:
106   bb.4:
107     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
108     S_ENDPGM 0
112 # Effectively empty block separates the collapsable s_or_b64
114 name: simple_nested_if_empty_block_dbg_between
115 tracksRegLiveness: true
116 machineFunctionInfo:
117   isEntryFunction: true
118 body:             |
119   ; GCN-LABEL: name: simple_nested_if_empty_block_dbg_between
120   ; GCN: bb.0:
121   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.5(0x40000000)
122   ; GCN-NEXT: {{  $}}
123   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
124   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
125   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
126   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
127   ; GCN-NEXT: {{  $}}
128   ; GCN-NEXT: bb.1:
129   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
130   ; GCN-NEXT: {{  $}}
131   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
132   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
133   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
134   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
135   ; GCN-NEXT: {{  $}}
136   ; GCN-NEXT: bb.2:
137   ; GCN-NEXT:   successors: %bb.4(0x80000000)
138   ; GCN-NEXT: {{  $}}
139   ; GCN-NEXT: bb.4:
140   ; GCN-NEXT:   successors: %bb.5(0x80000000)
141   ; GCN-NEXT: {{  $}}
142   ; GCN-NEXT:   DBG_VALUE
143   ; GCN-NEXT: {{  $}}
144   ; GCN-NEXT: bb.5:
145   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
146   ; GCN-NEXT:   S_ENDPGM 0
147   bb.0:
148     successors: %bb.1, %bb.4
150     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
152   bb.1:
153     successors: %bb.2, %bb.3
155     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
157   bb.2:
159   bb.3:
160     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
162   bb.5:
163     DBG_VALUE
165   bb.4:
166     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
167     S_ENDPGM 0
172 name: skip_salu_and_meta_insts_find_first
173 tracksRegLiveness: true
174 machineFunctionInfo:
175   isEntryFunction: true
176 body:             |
177   ; GCN-LABEL: name: skip_salu_and_meta_insts_find_first
178   ; GCN: bb.0:
179   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
180   ; GCN-NEXT:   liveins: $vgpr0, $sgpr0_sgpr1
181   ; GCN-NEXT: {{  $}}
182   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
183   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
184   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
185   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
186   ; GCN-NEXT: {{  $}}
187   ; GCN-NEXT: bb.1:
188   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
189   ; GCN-NEXT: {{  $}}
190   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
191   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
192   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
193   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
194   ; GCN-NEXT: {{  $}}
195   ; GCN-NEXT: bb.2:
196   ; GCN-NEXT:   successors: %bb.3(0x80000000)
197   ; GCN-NEXT: {{  $}}
198   ; GCN-NEXT: bb.3:
199   ; GCN-NEXT:   successors: %bb.4(0x80000000)
200   ; GCN-NEXT: {{  $}}
201   ; GCN-NEXT:   [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF
202   ; GCN-NEXT:   [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]
203   ; GCN-NEXT:   KILL [[DEF]]
204   ; GCN-NEXT: {{  $}}
205   ; GCN-NEXT: bb.4:
206   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
207   ; GCN-NEXT:   S_ENDPGM 0
208   bb.0:
209     successors: %bb.1, %bb.4
210     liveins: $vgpr0, $sgpr0_sgpr1
212     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
214   bb.1:
215     successors: %bb.2, %bb.3
217     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
219   bb.2:
221   bb.3:
222     %4:sgpr_32 = IMPLICIT_DEF
223     %5:sgpr_32 = S_BREV_B32 %4
224     KILL %4
225     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
227   bb.4:
228     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
229     S_ENDPGM 0
233 # Make sure SALU instructions, meta instructions, and SGPR->SGPR
234 # copies are skipped.
236 name: skip_salu_and_meta_insts_after
237 tracksRegLiveness: true
238 machineFunctionInfo:
239   isEntryFunction: true
240 body:             |
241   ; GCN-LABEL: name: skip_salu_and_meta_insts_after
242   ; GCN: bb.0:
243   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
244   ; GCN-NEXT: {{  $}}
245   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
246   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
247   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
248   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
249   ; GCN-NEXT: {{  $}}
250   ; GCN-NEXT: bb.1:
251   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
252   ; GCN-NEXT: {{  $}}
253   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
254   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
255   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
256   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
257   ; GCN-NEXT: {{  $}}
258   ; GCN-NEXT: bb.2:
259   ; GCN-NEXT:   successors: %bb.3(0x80000000)
260   ; GCN-NEXT: {{  $}}
261   ; GCN-NEXT: bb.3:
262   ; GCN-NEXT:   successors: %bb.4(0x80000000)
263   ; GCN-NEXT: {{  $}}
264   ; GCN-NEXT:   [[DEF:%[0-9]+]]:sgpr_32 = IMPLICIT_DEF
265   ; GCN-NEXT:   [[S_BREV_B32_:%[0-9]+]]:sgpr_32 = S_BREV_B32 [[DEF]]
266   ; GCN-NEXT:   KILL [[DEF]]
267   ; GCN-NEXT:   [[COPY2:%[0-9]+]]:sgpr_32 = COPY [[S_BREV_B32_]]
268   ; GCN-NEXT: {{  $}}
269   ; GCN-NEXT: bb.4:
270   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
271   ; GCN-NEXT:   S_ENDPGM 0
272   bb.0:
273     successors: %bb.1, %bb.4
275     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
277   bb.1:
278     successors: %bb.2, %bb.3
280     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
282   bb.2:
284   bb.3:
285     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
286     %4:sgpr_32 = IMPLICIT_DEF
287     %5:sgpr_32 = S_BREV_B32 %4
288     KILL %4
289     %6:sgpr_32 = COPY %5
291   bb.4:
292     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
293     S_ENDPGM 0
297 # SALU instruction depends on exec through a normal operand.
299 name: salu_exec_dependency
300 tracksRegLiveness: true
301 machineFunctionInfo:
302   isEntryFunction: true
303 body:             |
304   ; GCN-LABEL: name: salu_exec_dependency
305   ; GCN: bb.0:
306   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
307   ; GCN-NEXT: {{  $}}
308   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
309   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
310   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
311   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
312   ; GCN-NEXT: {{  $}}
313   ; GCN-NEXT: bb.1:
314   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
315   ; GCN-NEXT: {{  $}}
316   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
317   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
318   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
319   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
320   ; GCN-NEXT: {{  $}}
321   ; GCN-NEXT: bb.2:
322   ; GCN-NEXT:   successors: %bb.3(0x80000000)
323   ; GCN-NEXT: {{  $}}
324   ; GCN-NEXT: bb.3:
325   ; GCN-NEXT:   successors: %bb.4(0x80000000)
326   ; GCN-NEXT: {{  $}}
327   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc
328   ; GCN-NEXT:   [[S_BREV_B64_:%[0-9]+]]:sreg_64 = S_BREV_B64 $exec
329   ; GCN-NEXT: {{  $}}
330   ; GCN-NEXT: bb.4:
331   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
332   ; GCN-NEXT:   S_ENDPGM 0
333   bb.0:
334     successors: %bb.1, %bb.4
336     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
338   bb.1:
339     successors: %bb.2, %bb.3
341     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
343   bb.2:
345   bb.3:
346     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
347     %4:sreg_64 = S_BREV_B64 $exec
349   bb.4:
350     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
351     S_ENDPGM 0
355 # Copy to / from VGPR should be assumed to read exec
357 name: copy_no_explicit_exec_dependency
358 tracksRegLiveness: true
359 machineFunctionInfo:
360   isEntryFunction: true
361 body:             |
362   ; GCN-LABEL: name: copy_no_explicit_exec_dependency
363   ; GCN: bb.0:
364   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
365   ; GCN-NEXT: {{  $}}
366   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
367   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
368   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
369   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
370   ; GCN-NEXT: {{  $}}
371   ; GCN-NEXT: bb.1:
372   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
373   ; GCN-NEXT: {{  $}}
374   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vreg_128 = IMPLICIT_DEF
375   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
376   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc
377   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
378   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
379   ; GCN-NEXT: {{  $}}
380   ; GCN-NEXT: bb.2:
381   ; GCN-NEXT:   successors: %bb.3(0x80000000)
382   ; GCN-NEXT: {{  $}}
383   ; GCN-NEXT: bb.3:
384   ; GCN-NEXT:   successors: %bb.4(0x80000000)
385   ; GCN-NEXT: {{  $}}
386   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc
387   ; GCN-NEXT:   [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[DEF]].sub2
388   ; GCN-NEXT: {{  $}}
389   ; GCN-NEXT: bb.4:
390   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
391   ; GCN-NEXT:   S_ENDPGM 0
392   bb.0:
393     successors: %bb.1, %bb.4
395     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
397   bb.1:
398     successors: %bb.2, %bb.3
400     %2:vreg_128 = IMPLICIT_DEF
401     %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
403   bb.2:
405   bb.3:
406     SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
407     %5:vgpr_32 = COPY %2.sub2
409   bb.4:
410     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
411     S_ENDPGM 0
416 name: simple_nested_if_not_layout_successor
417 tracksRegLiveness: true
418 machineFunctionInfo:
419   isEntryFunction: true
420 body:             |
421   ; GCN-LABEL: name: simple_nested_if_not_layout_successor
422   ; GCN: bb.0:
423   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
424   ; GCN-NEXT: {{  $}}
425   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
426   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
427   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
428   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
429   ; GCN-NEXT: {{  $}}
430   ; GCN-NEXT: bb.1:
431   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
432   ; GCN-NEXT: {{  $}}
433   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
434   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
435   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
436   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
437   ; GCN-NEXT: {{  $}}
438   ; GCN-NEXT: bb.2:
439   ; GCN-NEXT:   successors: %bb.5(0x80000000)
440   ; GCN-NEXT: {{  $}}
441   ; GCN-NEXT:   S_BRANCH %bb.5
442   ; GCN-NEXT: {{  $}}
443   ; GCN-NEXT: bb.4:
444   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
445   ; GCN-NEXT:   S_ENDPGM 0
446   ; GCN-NEXT: {{  $}}
447   ; GCN-NEXT: bb.5:
448   ; GCN-NEXT:   successors: %bb.4(0x80000000)
449   ; GCN-NEXT: {{  $}}
450   ; GCN-NEXT:   S_BRANCH %bb.4
451   bb.0:
452     successors: %bb.1, %bb.4
454     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
456   bb.1:
457     successors: %bb.2, %bb.3
459     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
461   bb.2:
463   bb.3:
464     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
465     S_BRANCH %bb.5
467   bb.4:
468     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
469     S_ENDPGM 0
471   bb.5:
472     S_BRANCH %bb.4
476 # This should never happen, but check that we do not hang anyway
479 name: resursive_endcf
480 tracksRegLiveness: true
481 liveins:
482   - { reg: '$vgpr0', virtual-reg: '%0' }
483 machineFunctionInfo:
484   isEntryFunction: true
485 body:             |
486   ; GCN-LABEL: name: resursive_endcf
487   ; GCN: bb.0:
488   ; GCN-NEXT:   successors: %bb.1(0x80000000)
489   ; GCN-NEXT:   liveins: $vgpr0
490   ; GCN-NEXT: {{  $}}
491   ; GCN-NEXT:   [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
492   ; GCN-NEXT:   [[V_CMP_LT_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_LT_U32_e64 1, [[COPY]], implicit $exec
493   ; GCN-NEXT: {{  $}}
494   ; GCN-NEXT: bb.1:
495   ; GCN-NEXT:   successors: %bb.1(0x80000000)
496   ; GCN-NEXT: {{  $}}
497   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[V_CMP_LT_U32_e64_]], implicit-def $scc
498   ; GCN-NEXT:   S_BRANCH %bb.1
499   bb.0:
500     successors: %bb.1
501     liveins: $vgpr0
503     %0:vgpr_32 = COPY $vgpr0
504     %2:sreg_64 = V_CMP_LT_U32_e64 1, %0, implicit $exec
506   bb.1:
507     successors: %bb.1
509     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
510     S_BRANCH %bb.1
514 # Both s_or_b64 shall be preserved since the outer SI_END_CF belongs to SI_ELSE.
517 name: simple_outer_if_else
518 tracksRegLiveness: true
519 machineFunctionInfo:
520   isEntryFunction: true
521 body:             |
522   ; GCN-LABEL: name: simple_outer_if_else
523   ; GCN: bb.0:
524   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
525   ; GCN-NEXT: {{  $}}
526   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
527   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
528   ; GCN-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_]], [[COPY]], implicit-def dead $scc
529   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
530   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
531   ; GCN-NEXT: {{  $}}
532   ; GCN-NEXT: bb.1:
533   ; GCN-NEXT:   successors: %bb.2(0x80000000)
534   ; GCN-NEXT: {{  $}}
535   ; GCN-NEXT:   S_BRANCH %bb.2
536   ; GCN-NEXT: {{  $}}
537   ; GCN-NEXT: bb.2:
538   ; GCN-NEXT:   successors: %bb.3(0x40000000), %bb.6(0x40000000)
539   ; GCN-NEXT: {{  $}}
540   ; GCN-NEXT:   [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[S_XOR_B64_]], implicit-def $exec, implicit-def $scc, implicit $exec
541   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc
542   ; GCN-NEXT:   $exec = S_XOR_B64_term $exec, [[S_AND_B64_1]], implicit-def $scc
543   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.6, implicit $exec
544   ; GCN-NEXT: {{  $}}
545   ; GCN-NEXT: bb.3:
546   ; GCN-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
547   ; GCN-NEXT: {{  $}}
548   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
549   ; GCN-NEXT:   [[S_AND_B64_2:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %4:sreg_64, implicit-def dead $scc
550   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_2]]
551   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
552   ; GCN-NEXT: {{  $}}
553   ; GCN-NEXT: bb.4:
554   ; GCN-NEXT:   successors: %bb.5(0x80000000)
555   ; GCN-NEXT: {{  $}}
556   ; GCN-NEXT: bb.5:
557   ; GCN-NEXT:   successors: %bb.6(0x80000000)
558   ; GCN-NEXT: {{  $}}
559   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY1]], implicit-def $scc
560   ; GCN-NEXT: {{  $}}
561   ; GCN-NEXT: bb.6:
562   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[S_AND_B64_1]], implicit-def $scc
563   ; GCN-NEXT:   S_ENDPGM 0
564   bb.0:
565     successors: %bb.1, %bb.2
567     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
569   bb.1:
570     successors: %bb.2
571     S_BRANCH %bb.2
573   bb.2:
574     successors: %bb.3, %bb.6
575     %2:sreg_64 = SI_ELSE %0:sreg_64, %bb.6, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
577   bb.3:
578     successors: %bb.3, %bb.4
580     %3:sreg_64 = SI_IF undef %4:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
582   bb.4:
583     successors: %bb.5
585   bb.5:
586     successors: %bb.6
588     SI_END_CF %3:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
590   bb.6:
591     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
592     S_ENDPGM 0
597 name: if_inside_loop
598 tracksRegLiveness: true
599 machineFunctionInfo:
600   isEntryFunction: true
601 body:             |
602   ; GCN-LABEL: name: if_inside_loop
603   ; GCN: bb.0:
604   ; GCN-NEXT:   successors: %bb.6(0x80000000)
605   ; GCN-NEXT: {{  $}}
606   ; GCN-NEXT:   S_BRANCH %bb.6
607   ; GCN-NEXT: {{  $}}
608   ; GCN-NEXT: bb.1:
609   ; GCN-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
610   ; GCN-NEXT: {{  $}}
611   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
612   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
613   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
614   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
615   ; GCN-NEXT: {{  $}}
616   ; GCN-NEXT: bb.2:
617   ; GCN-NEXT:   successors: %bb.6(0x80000000)
618   ; GCN-NEXT: {{  $}}
619   ; GCN-NEXT:   S_BRANCH %bb.6
620   ; GCN-NEXT: {{  $}}
621   ; GCN-NEXT: bb.3:
622   ; GCN-NEXT:   successors: %bb.4(0x80000000)
623   ; GCN-NEXT: {{  $}}
624   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
625   ; GCN-NEXT: {{  $}}
626   ; GCN-NEXT: bb.4:
627   ; GCN-NEXT:   successors: %bb.5(0x80000000)
628   ; GCN-NEXT: {{  $}}
629   ; GCN-NEXT:   $exec = S_OR_B64 $exec, %2, implicit-def $scc
630   ; GCN-NEXT: {{  $}}
631   ; GCN-NEXT: bb.5:
632   ; GCN-NEXT:   successors: %bb.6(0x80000000)
633   ; GCN-NEXT: {{  $}}
634   ; GCN-NEXT: bb.6:
635   ; GCN-NEXT:   successors: %bb.4(0x40000000), %bb.0(0x40000000)
636   ; GCN-NEXT: {{  $}}
637   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
638   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
639   ; GCN-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_1]], [[COPY1]], implicit-def dead $scc
640   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
641   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
642   ; GCN-NEXT:   S_BRANCH %bb.0
643   ; GCN-NEXT:   S_ENDPGM 0
644   bb.0:
645     S_BRANCH %bb.6
647   bb.1:
648     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
650   bb.2:
651     S_BRANCH %bb.6
653   bb.3:
654     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
656   bb.4:
657     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
659   bb.5:
661   bb.6:
662     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
663     S_BRANCH %bb.0
664     S_ENDPGM 0
669 # redundant MBB removal correctness test:
670 # we can keep bb.2 fallthrough to the  new succ because after bb.3 gets removed
671 # new succ (bb.4) becomes bb.2's layout successor
672 name: removed_succ_fallthrough_but_layout_successor
673 tracksRegLiveness: true
674 machineFunctionInfo:
675   isEntryFunction: true
676 body:             |
677   ; GCN-LABEL: name: removed_succ_fallthrough_but_layout_successor
678   ; GCN: bb.0:
679   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
680   ; GCN-NEXT: {{  $}}
681   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
682   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
683   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
684   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
685   ; GCN-NEXT: {{  $}}
686   ; GCN-NEXT: bb.1:
687   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
688   ; GCN-NEXT: {{  $}}
689   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
690   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
691   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
692   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
693   ; GCN-NEXT: {{  $}}
694   ; GCN-NEXT: bb.2:
695   ; GCN-NEXT:   successors: %bb.4(0x80000000)
696   ; GCN-NEXT: {{  $}}
697   ; GCN-NEXT: bb.4:
698   ; GCN-NEXT:   successors: %bb.5(0x80000000)
699   ; GCN-NEXT: {{  $}}
700   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
701   ; GCN-NEXT: {{  $}}
702   ; GCN-NEXT: bb.5:
703   ; GCN-NEXT:   S_ENDPGM 0
704   bb.0:
705     successors: %bb.1, %bb.4
707     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
709   bb.1:
710     successors: %bb.2, %bb.3
712     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
714   bb.2:
716   bb.3:
717     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
720   bb.4:
721     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
723   bb.5:
724     S_ENDPGM 0
729 # redundant MBB removal correctness test:
730 # If one of the remdundant block preds has a fallthrough path, but the only redundant block succ is not
731 # going to be a layout successor to that pred after redundant block removal, we should not rearrange
732 # blocks to keep pred's fallthrough path, if the succ has fallthrough path to one of it's succ too.
734 name: deleted_succ_fallthrough_not_layout_successor
735 tracksRegLiveness: true
736 machineFunctionInfo:
737   isEntryFunction: true
738 body:             |
739   ; GCN-LABEL: name: deleted_succ_fallthrough_not_layout_successor
740   ; GCN: bb.0:
741   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.4(0x40000000)
742   ; GCN-NEXT: {{  $}}
743   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
744   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], undef %1:sreg_64, implicit-def dead $scc
745   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
746   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.4, implicit $exec
747   ; GCN-NEXT: {{  $}}
748   ; GCN-NEXT: bb.1:
749   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
750   ; GCN-NEXT: {{  $}}
751   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
752   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], undef %3:sreg_64, implicit-def dead $scc
753   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
754   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.5, implicit $exec
755   ; GCN-NEXT: {{  $}}
756   ; GCN-NEXT: bb.2:
757   ; GCN-NEXT:   successors: %bb.5(0x80000000)
758   ; GCN-NEXT: {{  $}}
759   ; GCN-NEXT:   S_BRANCH %bb.5
760   ; GCN-NEXT: {{  $}}
761   ; GCN-NEXT: bb.4:
762   ; GCN-NEXT:   S_ENDPGM 0
763   ; GCN-NEXT: {{  $}}
764   ; GCN-NEXT: bb.5:
765   ; GCN-NEXT:   successors: %bb.6(0x80000000)
766   ; GCN-NEXT: {{  $}}
767   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
768   ; GCN-NEXT: {{  $}}
769   ; GCN-NEXT: bb.6:
770   ; GCN-NEXT:   successors: %bb.4(0x80000000)
771   ; GCN-NEXT: {{  $}}
772   ; GCN-NEXT:   S_BRANCH %bb.4
773   bb.0:
774     successors: %bb.1, %bb.4
776     %0:sreg_64 = SI_IF undef %1:sreg_64, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
778   bb.1:
779     successors: %bb.2, %bb.3
781     %2:sreg_64 = SI_IF undef %3:sreg_64, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
783   bb.2:
785   bb.3:
786     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
787     S_BRANCH %bb.5
789   bb.4:
790     S_ENDPGM 0
793   bb.5:
794     SI_END_CF %0:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
796   bb.6:
797     S_BRANCH %bb.4
801 # While collapsing inner endcf, certain blocks ended up getting two S_BRANCH instructions.
802 # It happens in the absence of BranchFolding (mostly at -O0) when the irregularly placed BBs are traversed
803 # in the forward direction and the intervening block between a predecessor and its successor gets optimized
804 # away in subsequent iterations, leaving 2 S_BRANCH instructions in the predecessor block.
805 # The issue was fixed by iterating the blocks from bottom-up to ensure all endcf pseudos at the bottom of the
806 # function are processed first.
807 # This test ensures there are no multiple S_BRANCH instructions inserted in any block.
809 name: no_multiple_unconditional_branches
810 tracksRegLiveness: true
811 body: |
812   ; GCN-LABEL: name: no_multiple_unconditional_branches
813   ; GCN: bb.0:
814   ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.14(0x40000000)
815   ; GCN-NEXT: {{  $}}
816   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
817   ; GCN-NEXT:   [[V_CMP_EQ_U32_e64_:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF]], implicit $exec
818   ; GCN-NEXT:   [[COPY:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
819   ; GCN-NEXT:   [[S_AND_B64_:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY]], [[V_CMP_EQ_U32_e64_]], implicit-def dead $scc
820   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_]]
821   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.14, implicit $exec
822   ; GCN-NEXT:   S_BRANCH %bb.1
823   ; GCN-NEXT: {{  $}}
824   ; GCN-NEXT: bb.1:
825   ; GCN-NEXT:   successors: %bb.2(0x40000000), %bb.14(0x40000000)
826   ; GCN-NEXT: {{  $}}
827   ; GCN-NEXT:   [[DEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
828   ; GCN-NEXT:   [[V_CMP_EQ_U32_e64_1:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF1]], implicit $exec
829   ; GCN-NEXT:   [[COPY1:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
830   ; GCN-NEXT:   [[S_AND_B64_1:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY1]], killed [[V_CMP_EQ_U32_e64_1]], implicit-def dead $scc
831   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_1]]
832   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.14, implicit $exec
833   ; GCN-NEXT:   S_BRANCH %bb.2
834   ; GCN-NEXT: {{  $}}
835   ; GCN-NEXT: bb.2:
836   ; GCN-NEXT:   successors: %bb.3(0x40000000), %bb.7(0x40000000)
837   ; GCN-NEXT: {{  $}}
838   ; GCN-NEXT:   [[DEF2:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
839   ; GCN-NEXT:   [[V_CMP_EQ_U32_e64_2:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF2]], implicit $exec
840   ; GCN-NEXT:   [[COPY2:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
841   ; GCN-NEXT:   [[S_AND_B64_2:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY2]], killed [[V_CMP_EQ_U32_e64_2]], implicit-def dead $scc
842   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_2]]
843   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.7, implicit $exec
844   ; GCN-NEXT:   S_BRANCH %bb.3
845   ; GCN-NEXT: {{  $}}
846   ; GCN-NEXT: bb.3:
847   ; GCN-NEXT:   successors: %bb.4(0x40000000), %bb.7(0x40000000)
848   ; GCN-NEXT: {{  $}}
849   ; GCN-NEXT:   [[DEF3:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
850   ; GCN-NEXT:   [[V_CMP_EQ_U32_e64_3:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF3]], implicit $exec
851   ; GCN-NEXT:   [[COPY3:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
852   ; GCN-NEXT:   [[S_AND_B64_3:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY3]], killed [[V_CMP_EQ_U32_e64_3]], implicit-def dead $scc
853   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_3]]
854   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.7, implicit $exec
855   ; GCN-NEXT:   S_BRANCH %bb.4
856   ; GCN-NEXT: {{  $}}
857   ; GCN-NEXT: bb.4:
858   ; GCN-NEXT:   successors: %bb.7(0x80000000)
859   ; GCN-NEXT: {{  $}}
860   ; GCN-NEXT:   S_BRANCH %bb.7
861   ; GCN-NEXT: {{  $}}
862   ; GCN-NEXT: bb.7:
863   ; GCN-NEXT:   successors: %bb.8(0x80000000)
864   ; GCN-NEXT: {{  $}}
865   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY2]], implicit-def $scc
866   ; GCN-NEXT:   S_BRANCH %bb.8
867   ; GCN-NEXT: {{  $}}
868   ; GCN-NEXT: bb.8:
869   ; GCN-NEXT:   successors: %bb.9(0x80000000)
870   ; GCN-NEXT: {{  $}}
871   ; GCN-NEXT:   S_BRANCH %bb.9
872   ; GCN-NEXT: {{  $}}
873   ; GCN-NEXT: bb.9:
874   ; GCN-NEXT:   successors: %bb.11(0x40000000), %bb.12(0x40000000)
875   ; GCN-NEXT: {{  $}}
876   ; GCN-NEXT:   [[DEF4:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
877   ; GCN-NEXT:   [[V_CMP_EQ_U32_e64_4:%[0-9]+]]:sreg_64 = V_CMP_EQ_U32_e64 0, killed [[DEF4]], implicit $exec
878   ; GCN-NEXT:   [[COPY4:%[0-9]+]]:sreg_64 = COPY $exec, implicit-def $exec
879   ; GCN-NEXT:   [[S_AND_B64_4:%[0-9]+]]:sreg_64 = S_AND_B64 [[COPY4]], killed [[V_CMP_EQ_U32_e64_4]], implicit-def dead $scc
880   ; GCN-NEXT:   [[S_XOR_B64_:%[0-9]+]]:sreg_64 = S_XOR_B64 [[S_AND_B64_4]], [[COPY4]], implicit-def dead $scc
881   ; GCN-NEXT:   $exec = S_MOV_B64_term killed [[S_AND_B64_4]]
882   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.12, implicit $exec
883   ; GCN-NEXT:   S_BRANCH %bb.11
884   ; GCN-NEXT: {{  $}}
885   ; GCN-NEXT: bb.10:
886   ; GCN-NEXT:   successors: %bb.14(0x80000000)
887   ; GCN-NEXT: {{  $}}
888   ; GCN-NEXT:   S_BRANCH %bb.14
889   ; GCN-NEXT: {{  $}}
890   ; GCN-NEXT: bb.11:
891   ; GCN-NEXT:   successors: %bb.12(0x80000000)
892   ; GCN-NEXT: {{  $}}
893   ; GCN-NEXT:   S_BRANCH %bb.12
894   ; GCN-NEXT: {{  $}}
895   ; GCN-NEXT: bb.12:
896   ; GCN-NEXT:   successors: %bb.10(0x40000000), %bb.14(0x40000000)
897   ; GCN-NEXT: {{  $}}
898   ; GCN-NEXT:   [[S_OR_SAVEEXEC_B64_:%[0-9]+]]:sreg_64 = S_OR_SAVEEXEC_B64 [[S_XOR_B64_]], implicit-def $exec, implicit-def $scc, implicit $exec
899   ; GCN-NEXT:   [[S_AND_B64_5:%[0-9]+]]:sreg_64 = S_AND_B64 $exec, [[S_OR_SAVEEXEC_B64_]], implicit-def $scc
900   ; GCN-NEXT:   $exec = S_XOR_B64_term $exec, [[S_AND_B64_5]], implicit-def $scc
901   ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.14, implicit $exec
902   ; GCN-NEXT:   S_BRANCH %bb.10
903   ; GCN-NEXT: {{  $}}
904   ; GCN-NEXT: bb.14:
905   ; GCN-NEXT:   $exec = S_OR_B64 $exec, [[COPY]], implicit-def $scc
906   ; GCN-NEXT:   S_ENDPGM 0
907   bb.0:
908     successors: %bb.1, %bb.14
910     %0:vgpr_32 = IMPLICIT_DEF
911     %1:sreg_64 = V_CMP_EQ_U32_e64 0, killed %0:vgpr_32, implicit $exec
912     %2:sreg_64 = SI_IF %1:sreg_64, %bb.14, implicit-def $exec, implicit-def dead $scc, implicit $exec
913     S_BRANCH %bb.1
915   bb.1:
916     successors: %bb.2, %bb.6
918     %3:vgpr_32 = IMPLICIT_DEF
919     %4:sreg_64 = V_CMP_EQ_U32_e64 0, killed %3:vgpr_32, implicit $exec
920     %5:sreg_64 = SI_IF killed %4:sreg_64, %bb.6, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
921     S_BRANCH %bb.2
923   bb.2:
924     successors: %bb.3, %bb.7
926     %6:vgpr_32 = IMPLICIT_DEF
927     %7:sreg_64 = V_CMP_EQ_U32_e64 0, killed %6:vgpr_32, implicit $exec
928     %8:sreg_64 = SI_IF killed %7:sreg_64, %bb.7, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
929     S_BRANCH %bb.3
931   bb.3:
932     successors: %bb.4, %bb.5
934     %9:vgpr_32 = IMPLICIT_DEF
935     %10:sreg_64 = V_CMP_EQ_U32_e64 0, killed %9:vgpr_32, implicit $exec
936     %11:sreg_64 = SI_IF killed %10:sreg_64, %bb.5, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
937     S_BRANCH %bb.4
939   bb.4:
940     successors: %bb.5
942     S_BRANCH %bb.5
944   bb.5:
945     successors: %bb.7
947     SI_END_CF %11:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
948     S_BRANCH %bb.7
950   bb.6:
951     successors: %bb.14
953     SI_END_CF %5:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
954     S_BRANCH %bb.14
956   bb.7:
957     successors: %bb.8
959     SI_END_CF %8:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
960     S_BRANCH %bb.8
962   bb.8:
963     successors: %bb.9
965     S_BRANCH %bb.9
967   bb.9:
968     successors: %bb.11, %bb.12
970     %12:vgpr_32 = IMPLICIT_DEF
971     %13:sreg_64 = V_CMP_EQ_U32_e64 0, killed %12:vgpr_32, implicit $exec
972     %14:sreg_64 = SI_IF killed %13:sreg_64, %bb.12, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
973     S_BRANCH %bb.11
975   bb.10:
976     successors: %bb.13
978     S_BRANCH %bb.13
980   bb.11:
981     successors: %bb.12
983     S_BRANCH %bb.12
985   bb.12:
986     successors: %bb.10, %bb.13
988     %15:sreg_64 = SI_ELSE %14:sreg_64, %bb.13, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
989     S_BRANCH %bb.10
991   bb.13:
992     successors: %bb.6
994     SI_END_CF %15:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
995     S_BRANCH %bb.6
997   bb.14:
999     SI_END_CF %2:sreg_64, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
1000     S_ENDPGM 0