[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / opt-exec-masking-pre-ra-update-liveness.mir
blobae2c77ca870397c420a2921681ae121eca92f178
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-regalloc -start-before=machine-scheduler -stop-after=greedy,0 -o - %s | FileCheck %s
4 # Make sure liveness is correctly updated when folding the cndmask and
5 # compare.
7 ---
8 name:            cndmask_same_block
9 tracksRegLiveness: true
10 body:             |
11   ; CHECK-LABEL: name: cndmask_same_block
12   ; CHECK: bb.0:
13   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
14   ; CHECK-NEXT: {{  $}}
15   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
16   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
17   ; CHECK-NEXT: {{  $}}
18   ; CHECK-NEXT: bb.1:
19   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
20   ; CHECK-NEXT: {{  $}}
21   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
22   ; CHECK-NEXT:   S_BRANCH %bb.4
23   ; CHECK-NEXT: {{  $}}
24   ; CHECK-NEXT: bb.2:
25   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
26   ; CHECK-NEXT: {{  $}}
27   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def $scc
28   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
29   ; CHECK-NEXT:   S_BRANCH %bb.3
30   ; CHECK-NEXT: {{  $}}
31   ; CHECK-NEXT: bb.3:
32   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
33   ; CHECK-NEXT: {{  $}}
34   ; CHECK-NEXT:   S_BRANCH %bb.4
35   ; CHECK-NEXT: {{  $}}
36   ; CHECK-NEXT: bb.4:
37   bb.0:
38     %0:sreg_64_xexec = IMPLICIT_DEF
39     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
41   bb.1:
42     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
43     S_BRANCH %bb.4
45   bb.2:
46     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
47     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
48     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
49     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
50     S_BRANCH %bb.3
52   bb.3:
53     S_BRANCH %bb.4
55   bb.4:
56 ...
58 ---
59 name:            cndmask_separate_block
60 tracksRegLiveness: true
61 body:             |
62   ; CHECK-LABEL: name: cndmask_separate_block
63   ; CHECK: bb.0:
64   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
65   ; CHECK-NEXT: {{  $}}
66   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
67   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
68   ; CHECK-NEXT: {{  $}}
69   ; CHECK-NEXT: bb.1:
70   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
71   ; CHECK-NEXT: {{  $}}
72   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
73   ; CHECK-NEXT:   S_BRANCH %bb.4
74   ; CHECK-NEXT: {{  $}}
75   ; CHECK-NEXT: bb.2:
76   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
77   ; CHECK-NEXT: {{  $}}
78   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def $scc
79   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
80   ; CHECK-NEXT:   S_BRANCH %bb.3
81   ; CHECK-NEXT: {{  $}}
82   ; CHECK-NEXT: bb.3:
83   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
84   ; CHECK-NEXT: {{  $}}
85   ; CHECK-NEXT:   S_BRANCH %bb.4
86   ; CHECK-NEXT: {{  $}}
87   ; CHECK-NEXT: bb.4:
88   bb.0:
89     %0:sreg_64_xexec = IMPLICIT_DEF
90     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
91     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
93   bb.1:
94     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
95     S_BRANCH %bb.4
97   bb.2:
98     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
99     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
100     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
101     S_BRANCH %bb.3
103   bb.3:
104     S_BRANCH %bb.4
106   bb.4:
110 name:            cndmask_same_block_other_cmpreg_use
111 tracksRegLiveness: true
112 body:             |
113   ; CHECK-LABEL: name: cndmask_same_block_other_cmpreg_use
114   ; CHECK: bb.0:
115   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
116   ; CHECK-NEXT: {{  $}}
117   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
118   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
119   ; CHECK-NEXT: {{  $}}
120   ; CHECK-NEXT: bb.1:
121   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
122   ; CHECK-NEXT: {{  $}}
123   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
124   ; CHECK-NEXT:   S_BRANCH %bb.4
125   ; CHECK-NEXT: {{  $}}
126   ; CHECK-NEXT: bb.2:
127   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
128   ; CHECK-NEXT: {{  $}}
129   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[DEF]], implicit $exec
130   ; CHECK-NEXT:   [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 1, [[V_CNDMASK_B32_e64_]], implicit $exec
131   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def $scc
132   ; CHECK-NEXT:   S_NOP 0, implicit [[V_CMP_NE_U32_e64_]]
133   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
134   ; CHECK-NEXT:   S_BRANCH %bb.3
135   ; CHECK-NEXT: {{  $}}
136   ; CHECK-NEXT: bb.3:
137   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
138   ; CHECK-NEXT: {{  $}}
139   ; CHECK-NEXT:   S_BRANCH %bb.4
140   ; CHECK-NEXT: {{  $}}
141   ; CHECK-NEXT: bb.4:
142   bb.0:
143     %0:sreg_64_xexec = IMPLICIT_DEF
144     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
146   bb.1:
147     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
148     S_BRANCH %bb.4
150   bb.2:
151     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
152     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
153     S_NOP 0, implicit %2
154     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
155     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
156     S_BRANCH %bb.3
158   bb.3:
159     S_BRANCH %bb.4
161   bb.4:
165 name:            cndmask_same_block_liveout_use
166 tracksRegLiveness: true
167 body:             |
168   ; CHECK-LABEL: name: cndmask_same_block_liveout_use
169   ; CHECK: bb.0:
170   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
171   ; CHECK-NEXT: {{  $}}
172   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
173   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
174   ; CHECK-NEXT: {{  $}}
175   ; CHECK-NEXT: bb.1:
176   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
177   ; CHECK-NEXT: {{  $}}
178   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
179   ; CHECK-NEXT:   S_BRANCH %bb.4
180   ; CHECK-NEXT: {{  $}}
181   ; CHECK-NEXT: bb.2:
182   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
183   ; CHECK-NEXT: {{  $}}
184   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[DEF]], implicit $exec
185   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def $scc
186   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
187   ; CHECK-NEXT:   S_BRANCH %bb.3
188   ; CHECK-NEXT: {{  $}}
189   ; CHECK-NEXT: bb.3:
190   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
191   ; CHECK-NEXT: {{  $}}
192   ; CHECK-NEXT:   S_NOP 0, implicit [[V_CNDMASK_B32_e64_]]
193   ; CHECK-NEXT:   S_BRANCH %bb.4
194   ; CHECK-NEXT: {{  $}}
195   ; CHECK-NEXT: bb.4:
196   bb.0:
197     %0:sreg_64_xexec = IMPLICIT_DEF
198     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
200   bb.1:
201     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
202     S_BRANCH %bb.4
204   bb.2:
205     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
206     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
207     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
208     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
209     S_BRANCH %bb.3
211   bb.3:
212     S_NOP 0, implicit %1
213     S_BRANCH %bb.4
215   bb.4:
218 # The legality check for removing the compare used to rely on
219 # use_nodbg_empty, which fails on the undef use of %2. We would then
220 # fail to update the interval correctly.
223 name:            cmp_reg_extra_undef_use
224 tracksRegLiveness: true
225 body:             |
226   ; CHECK-LABEL: name: cmp_reg_extra_undef_use
227   ; CHECK: bb.0:
228   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
229   ; CHECK-NEXT: {{  $}}
230   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, undef %1:sreg_64_xexec, implicit-def dead $scc
231   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit $vcc
232   ; CHECK-NEXT: {{  $}}
233   ; CHECK-NEXT: bb.1:
234   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
235   ; CHECK-NEXT: {{  $}}
236   ; CHECK-NEXT:   $vcc = S_AND_B64 $exec, undef %2:sreg_64_xexec, implicit-def dead $scc
237   ; CHECK-NEXT: {{  $}}
238   ; CHECK-NEXT: bb.2:
239   bb.0:
240     %0:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %1:sreg_64_xexec, implicit $exec
241     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %0, implicit $exec
242     $vcc = S_AND_B64 $exec, %2, implicit-def dead $scc
243     S_CBRANCH_VCCNZ %bb.3, implicit killed $vcc
245   bb.1:
246     $vcc = S_AND_B64 $exec, undef %2, implicit-def dead $scc
248   bb.3:
252 # use_nodbg_empty is insufficient for erasing %1's def when removing
253 # V_CNDMASK_B32.
256 name:            cndmask_undef_extra_use
257 tracksRegLiveness: true
258 body:             |
259   ; CHECK-LABEL: name: cndmask_undef_extra_use
260   ; CHECK: bb.0:
261   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
262   ; CHECK-NEXT: {{  $}}
263   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
264   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
265   ; CHECK-NEXT: {{  $}}
266   ; CHECK-NEXT: bb.1:
267   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
268   ; CHECK-NEXT: {{  $}}
269   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
270   ; CHECK-NEXT:   S_BRANCH %bb.4
271   ; CHECK-NEXT: {{  $}}
272   ; CHECK-NEXT: bb.2:
273   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
274   ; CHECK-NEXT: {{  $}}
275   ; CHECK-NEXT:   dead %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[DEF]], implicit $exec
276   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def $scc
277   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
278   ; CHECK-NEXT:   S_BRANCH %bb.3
279   ; CHECK-NEXT: {{  $}}
280   ; CHECK-NEXT: bb.3:
281   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
282   ; CHECK-NEXT: {{  $}}
283   ; CHECK-NEXT:   S_NOP 0, implicit undef %1
284   ; CHECK-NEXT:   S_BRANCH %bb.4
285   ; CHECK-NEXT: {{  $}}
286   ; CHECK-NEXT: bb.4:
287   bb.0:
288     %0:sreg_64_xexec = IMPLICIT_DEF
289     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
291   bb.1:
292     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
293     S_BRANCH %bb.4
295   bb.2:
296     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
297     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
298     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
299     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
300     S_BRANCH %bb.3
302   bb.3:
303     S_NOP 0, implicit undef %1
304     S_BRANCH %bb.4
306   bb.4:
310 name:            cndmask_is_undef
311 tracksRegLiveness: true
312 body:             |
313   ; CHECK-LABEL: name: cndmask_is_undef
314   ; CHECK: bb.0:
315   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
316   ; CHECK-NEXT: {{  $}}
317   ; CHECK-NEXT:   dead %0:sreg_64_xexec = S_MOV_B64 0
318   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
319   ; CHECK-NEXT: {{  $}}
320   ; CHECK-NEXT: bb.1:
321   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
322   ; CHECK-NEXT: {{  $}}
323   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
324   ; CHECK-NEXT:   S_BRANCH %bb.4
325   ; CHECK-NEXT: {{  $}}
326   ; CHECK-NEXT: bb.2:
327   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
328   ; CHECK-NEXT: {{  $}}
329   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, undef %0, implicit-def $scc
330   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
331   ; CHECK-NEXT:   S_BRANCH %bb.3
332   ; CHECK-NEXT: {{  $}}
333   ; CHECK-NEXT: bb.3:
334   ; CHECK-NEXT:   successors: %bb.4(0x80000000)
335   ; CHECK-NEXT: {{  $}}
336   ; CHECK-NEXT:   S_BRANCH %bb.4
337   ; CHECK-NEXT: {{  $}}
338   ; CHECK-NEXT: bb.4:
339   bb.0:
340     %0:sreg_64_xexec = S_MOV_B64 0
341     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
343   bb.1:
344     S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
345     S_BRANCH %bb.4
347   bb.2:
348     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %0, implicit $exec
349     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
350     $vcc = S_AND_B64 $exec, %2, implicit-def $scc
351     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
352     S_BRANCH %bb.3
354   bb.3:
355     S_BRANCH %bb.4
357   bb.4:
360 # Liveness of V_CNDMASK_B32 source (%0) must be extended through loop.
363 name:            cndmask_loop_cndmask
364 tracksRegLiveness: true
365 body:             |
366   ; CHECK-LABEL: name: cndmask_loop_cndmask
367   ; CHECK: bb.0:
368   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
369   ; CHECK-NEXT: {{  $}}
370   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
371   ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
372   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
373   ; CHECK-NEXT: {{  $}}
374   ; CHECK-NEXT: bb.1:
375   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
376   ; CHECK-NEXT: {{  $}}
377   ; CHECK-NEXT:   [[S_ADD_I32_:%[0-9]+]]:sreg_32 = S_ADD_I32 [[S_ADD_I32_]], -1, implicit-def $scc
378   ; CHECK-NEXT:   S_CBRANCH_SCC0 %bb.4, implicit $scc
379   ; CHECK-NEXT: {{  $}}
380   ; CHECK-NEXT: bb.2:
381   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
382   ; CHECK-NEXT: {{  $}}
383   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF1]], implicit-def $scc
384   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
385   ; CHECK-NEXT:   S_BRANCH %bb.3
386   ; CHECK-NEXT: {{  $}}
387   ; CHECK-NEXT: bb.3:
388   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
389   ; CHECK-NEXT: {{  $}}
390   ; CHECK-NEXT:   S_BRANCH %bb.1
391   ; CHECK-NEXT: {{  $}}
392   ; CHECK-NEXT: bb.4:
393   bb.0:
394     %0:sreg_64_xexec = IMPLICIT_DEF
395     %1:sreg_32 = IMPLICIT_DEF
396     %2:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
397     S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
399   bb.1:
400     %1:sreg_32 = S_ADD_I32 %1, -1, implicit-def $scc
401     S_CBRANCH_SCC0 %bb.4, implicit $scc
403   bb.2:
404     %4:sreg_64_xexec = V_CMP_NE_U32_e64 1, %2, implicit $exec
405     $vcc = S_AND_B64 $exec, %4, implicit-def $scc
406     S_CBRANCH_VCCNZ %bb.4, implicit $vcc
407     S_BRANCH %bb.3
409   bb.3:
410     S_BRANCH %bb.1
412   bb.4:
416 name:            cndmask_loop_cndmask_split
417 tracksRegLiveness: true
418 body:             |
419   ; CHECK-LABEL: name: cndmask_loop_cndmask_split
420   ; CHECK: bb.0:
421   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
422   ; CHECK-NEXT: {{  $}}
423   ; CHECK-NEXT:   $vcc = IMPLICIT_DEF
424   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_32 = IMPLICIT_DEF
425   ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
426   ; CHECK-NEXT:   S_CBRANCH_VCCZ %bb.1, implicit $vcc
427   ; CHECK-NEXT:   S_BRANCH %bb.2
428   ; CHECK-NEXT: {{  $}}
429   ; CHECK-NEXT: bb.1:
430   ; CHECK-NEXT:   successors: %bb.5(0x80000000)
431   ; CHECK-NEXT: {{  $}}
432   ; CHECK-NEXT:   S_BRANCH %bb.5
433   ; CHECK-NEXT: {{  $}}
434   ; CHECK-NEXT: bb.2:
435   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.3(0x40000000)
436   ; CHECK-NEXT: {{  $}}
437   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF1]], implicit-def $scc
438   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit $vcc
439   ; CHECK-NEXT: {{  $}}
440   ; CHECK-NEXT: bb.3:
441   ; CHECK-NEXT:   successors: %bb.5(0x40000000), %bb.4(0x40000000)
442   ; CHECK-NEXT: {{  $}}
443   ; CHECK-NEXT:   [[S_ADD_I32_:%[0-9]+]]:sreg_32 = S_ADD_I32 [[S_ADD_I32_]], -1, implicit-def $scc
444   ; CHECK-NEXT:   S_CBRANCH_SCC0 %bb.5, implicit $scc
445   ; CHECK-NEXT: {{  $}}
446   ; CHECK-NEXT: bb.4:
447   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
448   ; CHECK-NEXT: {{  $}}
449   ; CHECK-NEXT:   S_BRANCH %bb.2
450   ; CHECK-NEXT: {{  $}}
451   ; CHECK-NEXT: bb.5:
452   bb.0:
453     $vcc = IMPLICIT_DEF
454     %0:sreg_64_xexec = IMPLICIT_DEF
455     %1:sreg_32 = IMPLICIT_DEF
456     %2:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
457     S_CBRANCH_VCCZ %bb.5, implicit $vcc
458     S_BRANCH %bb.1
460   bb.5:
461     S_BRANCH %bb.4
463   bb.1:
464     %4:sreg_64_xexec = V_CMP_NE_U32_e64 1, %2, implicit $exec
465     $vcc = S_AND_B64 $exec, %4, implicit-def $scc
466     S_CBRANCH_VCCNZ %bb.3, implicit $vcc
468   bb.2:
469     %1:sreg_32 = S_ADD_I32 %1, -1, implicit-def $scc
470     S_CBRANCH_SCC0 %bb.4, implicit $scc
472   bb.3:
473     S_BRANCH %bb.1
475   bb.4:
478 # We would need to extend the live range of %0 to be live out of %bb.2
481 name:            register_not_marked_liveout
482 tracksRegLiveness: true
483 machineFunctionInfo:
484   isEntryFunction: true
485   scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
486   stackPtrOffsetReg: '$sgpr32'
487   returnsVoid:     true
488 body:             |
489   ; CHECK-LABEL: name: register_not_marked_liveout
490   ; CHECK: bb.0:
491   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
492   ; CHECK-NEXT:   liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
493   ; CHECK-NEXT: {{  $}}
494   ; CHECK-NEXT:   [[S_MOV_B64_:%[0-9]+]]:sreg_64_xexec = S_MOV_B64 0
495   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[S_MOV_B64_]], implicit $exec
496   ; CHECK-NEXT:   [[V_CMP_GT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_GT_I32_e64 0, [[V_CNDMASK_B32_e64_]], implicit $exec
497   ; CHECK-NEXT:   $exec = S_MOV_B64_term [[V_CMP_GT_I32_e64_]]
498   ; CHECK-NEXT: {{  $}}
499   ; CHECK-NEXT: bb.1:
500   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
501   ; CHECK-NEXT: {{  $}}
502   ; CHECK-NEXT:   $exec = S_MOV_B64_term [[V_CMP_GT_I32_e64_]]
503   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.3, implicit $exec
504   ; CHECK-NEXT: {{  $}}
505   ; CHECK-NEXT: bb.2:
506   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.3(0x40000000)
507   ; CHECK-NEXT: {{  $}}
508   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[S_MOV_B64_]], implicit-def dead $scc
509   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.1, implicit $vcc
510   ; CHECK-NEXT: {{  $}}
511   ; CHECK-NEXT: bb.3:
512   bb.0:
513     liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
515     %0:sreg_64_xexec = S_MOV_B64 0
516     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
517     %2:sreg_64 = V_CMP_GT_I32_e64 0, %1, implicit $exec
518     $exec = S_MOV_B64_term %2
520   bb.1:
521     $exec = S_MOV_B64_term %2
522     S_CBRANCH_EXECZ %bb.3, implicit $exec
524   bb.2:
525     %3:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
526     $vcc = S_AND_B64 $exec, %3, implicit-def dead $scc
527     S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
529   bb.3:
533 # Can't delete V_CNDMASK_B32 when folding into the use in %bb.3 since
534 # it's also used in %bb.0
536 name:            cndmask_multiple_uses
537 tracksRegLiveness: true
538 body:             |
539   ; CHECK-LABEL: name: cndmask_multiple_uses
540   ; CHECK: bb.0:
541   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
542   ; CHECK-NEXT:   liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
543   ; CHECK-NEXT: {{  $}}
544   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %1:sreg_64_xexec, implicit $exec
545   ; CHECK-NEXT:   [[V_CMP_NE_U32_e64_:%[0-9]+]]:sreg_64_xexec = V_CMP_NE_U32_e64 1, [[V_CNDMASK_B32_e64_]], implicit $exec
546   ; CHECK-NEXT: {{  $}}
547   ; CHECK-NEXT: bb.1:
548   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
549   ; CHECK-NEXT: {{  $}}
550   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.3, implicit undef $vcc
551   ; CHECK-NEXT: {{  $}}
552   ; CHECK-NEXT: bb.2:
553   ; CHECK-NEXT:   successors: %bb.5(0x40000000), %bb.3(0x40000000)
554   ; CHECK-NEXT: {{  $}}
555   ; CHECK-NEXT:   $vcc = S_AND_B64 $exec, [[V_CMP_NE_U32_e64_]], implicit-def dead $scc
556   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.5, implicit $vcc
557   ; CHECK-NEXT: {{  $}}
558   ; CHECK-NEXT: bb.3:
559   ; CHECK-NEXT:   successors: %bb.5(0x40000000), %bb.4(0x40000000)
560   ; CHECK-NEXT: {{  $}}
561   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, undef %1:sreg_64_xexec, implicit-def dead $scc
562   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.5, implicit $vcc
563   ; CHECK-NEXT: {{  $}}
564   ; CHECK-NEXT: bb.4:
565   ; CHECK-NEXT:   successors: %bb.5(0x80000000)
566   ; CHECK-NEXT: {{  $}}
567   ; CHECK-NEXT: {{  $}}
568   ; CHECK-NEXT: bb.5:
569   bb.0:
570     liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
572     %0:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, undef %1:sreg_64_xexec, implicit $exec
573     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %0, implicit $exec
575   bb.1:
576     S_CBRANCH_VCCNZ %bb.3, implicit undef $vcc
578   bb.2:
579     $vcc = S_AND_B64 $exec, %2, implicit-def dead $scc
580     S_CBRANCH_VCCNZ %bb.6, implicit killed $vcc
582   bb.3:
583     %3:sreg_64_xexec = V_CMP_NE_U32_e64 1, %0, implicit $exec
584     $vcc = S_AND_B64 $exec, %3, implicit-def dead $scc
585     S_CBRANCH_VCCNZ %bb.6, implicit killed $vcc
587   bb.5:
589   bb.6:
593 # The live segment of %1 from V_CMP_GT_I32 needs to be shrunk after the use in %bb.1 is deleted
595 name:            leftover_use_of_selreg_extends_liverange
596 tracksRegLiveness: true
597 body:             |
598   ; CHECK-LABEL: name: leftover_use_of_selreg_extends_liverange
599   ; CHECK: bb.0:
600   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
601   ; CHECK-NEXT:   liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
602   ; CHECK-NEXT: {{  $}}
603   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
604   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[DEF]], implicit $exec
605   ; CHECK-NEXT:   [[V_CMP_GT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_GT_I32_e64 0, [[V_CNDMASK_B32_e64_]], implicit $exec
606   ; CHECK-NEXT:   $exec = S_MOV_B64_term [[V_CMP_GT_I32_e64_]]
607   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
608   ; CHECK-NEXT: {{  $}}
609   ; CHECK-NEXT: bb.1:
610   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
611   ; CHECK-NEXT: {{  $}}
612   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def dead $scc
613   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.3, implicit $vcc
614   ; CHECK-NEXT: {{  $}}
615   ; CHECK-NEXT: bb.2:
616   ; CHECK-NEXT:   successors: %bb.3(0x80000000)
617   ; CHECK-NEXT: {{  $}}
618   ; CHECK-NEXT: {{  $}}
619   ; CHECK-NEXT: bb.3:
620   bb.0:
621     liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
623     %0:sreg_64_xexec = IMPLICIT_DEF
624     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
625     %2:sreg_64 = V_CMP_GT_I32_e64 0, %1, implicit $exec
626     $exec = S_MOV_B64_term %2
627     S_CBRANCH_EXECZ %bb.2, implicit $exec
629   bb.1:
630     %3:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
631     $vcc = S_AND_B64 $exec, %3, implicit-def dead $scc
632     S_CBRANCH_VCCNZ %bb.3, implicit killed $vcc
634   bb.2:
636   bb.3:
641 name:            leftover_use_of_selreg_extends_liverange_subrange
642 tracksRegLiveness: true
643 body:             |
644   ; CHECK-LABEL: name: leftover_use_of_selreg_extends_liverange_subrange
645   ; CHECK: bb.0:
646   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
647   ; CHECK-NEXT:   liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
648   ; CHECK-NEXT: {{  $}}
649   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sreg_64_xexec = IMPLICIT_DEF
650   ; CHECK-NEXT:   undef %1.sub1:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[DEF]], implicit $exec
651   ; CHECK-NEXT:   [[V_CMP_GT_I32_e64_:%[0-9]+]]:sreg_64 = V_CMP_GT_I32_e64 0, %1.sub1, implicit $exec
652   ; CHECK-NEXT:   %1.sub0:vreg_64 = V_MOV_B32_e32 123, implicit $exec
653   ; CHECK-NEXT:   $exec = S_MOV_B64_term [[V_CMP_GT_I32_e64_]]
654   ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
655   ; CHECK-NEXT: {{  $}}
656   ; CHECK-NEXT: bb.1:
657   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
658   ; CHECK-NEXT: {{  $}}
659   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[DEF]], implicit-def dead $scc
660   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.3, implicit $vcc
661   ; CHECK-NEXT: {{  $}}
662   ; CHECK-NEXT: bb.2:
663   ; CHECK-NEXT:   successors: %bb.3(0x80000000)
664   ; CHECK-NEXT: {{  $}}
665   ; CHECK-NEXT:   S_NOP 0, implicit %1.sub0
666   ; CHECK-NEXT: {{  $}}
667   ; CHECK-NEXT: bb.3:
668   bb.0:
669     liveins: $vgpr0, $sgpr4_sgpr5, $sgpr6_sgpr7, $sgpr8_sgpr9, $sgpr10_sgpr11, $sgpr14, $sgpr15, $sgpr16
671     %0:sreg_64_xexec = IMPLICIT_DEF
672     undef %1.sub1:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
673     %1.sub0 = V_MOV_B32_e32 123, implicit $exec
674     %2:sreg_64 = V_CMP_GT_I32_e64 0, %1.sub1, implicit $exec
675     $exec = S_MOV_B64_term %2
676     S_CBRANCH_EXECZ %bb.2, implicit $exec
678   bb.1:
679     %3:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1.sub1, implicit $exec
680     $vcc = S_AND_B64 $exec, %3, implicit-def dead $scc
681     S_CBRANCH_VCCNZ %bb.3, implicit killed $vcc
683   bb.2:
684     S_NOP 0, implicit %1.sub0
686   bb.3:
690 # This was trying to extend the liverange of %0 farther than needed,
691 # following %1's segment to %bb3
694 name:            cannot_create_empty_or_backwards_segment
695 tracksRegLiveness: true
696 body:             |
697   ; CHECK-LABEL: name: cannot_create_empty_or_backwards_segment
698   ; CHECK: bb.0:
699   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
700   ; CHECK-NEXT:   liveins: $sgpr4_sgpr5
701   ; CHECK-NEXT: {{  $}}
702   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr5
703   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[COPY]], implicit $exec
704   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[COPY]], implicit-def dead $scc
705   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit $vcc
706   ; CHECK-NEXT: {{  $}}
707   ; CHECK-NEXT: bb.1:
708   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
709   ; CHECK-NEXT: {{  $}}
710   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.3, implicit undef $vcc
711   ; CHECK-NEXT: {{  $}}
712   ; CHECK-NEXT: bb.2:
713   ; CHECK-NEXT:   S_ENDPGM 0
714   ; CHECK-NEXT: {{  $}}
715   ; CHECK-NEXT: bb.3:
716   ; CHECK-NEXT:   S_ENDPGM 0, implicit [[V_CNDMASK_B32_e64_]]
717   bb.0:
718     liveins: $sgpr4_sgpr5
720     %0:sreg_64_xexec = COPY $sgpr4_sgpr5
721     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
722     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
723     $vcc = S_AND_B64 $exec, %2, implicit-def dead $scc
724     S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
726   bb.1:
727     S_CBRANCH_VCCNZ %bb.3, implicit killed undef $vcc
729   bb.2:
730     S_ENDPGM 0
732   bb.3:
733     S_ENDPGM 0, implicit %1
737 name:            cannot_create_empty_or_backwards_segment_2
738 tracksRegLiveness: true
739 body:             |
740   ; CHECK-LABEL: name: cannot_create_empty_or_backwards_segment_2
741   ; CHECK: bb.0:
742   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
743   ; CHECK-NEXT:   liveins: $sgpr4_sgpr5
744   ; CHECK-NEXT: {{  $}}
745   ; CHECK-NEXT: {{  $}}
746   ; CHECK-NEXT: bb.1:
747   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
748   ; CHECK-NEXT:   liveins: $sgpr4_sgpr5
749   ; CHECK-NEXT: {{  $}}
750   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:sreg_64_xexec = COPY $sgpr4_sgpr5
751   ; CHECK-NEXT:   [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[COPY]], implicit $exec
752   ; CHECK-NEXT:   $vcc = S_ANDN2_B64 $exec, [[COPY]], implicit-def dead $scc
753   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.2, implicit $vcc
754   ; CHECK-NEXT: {{  $}}
755   ; CHECK-NEXT: bb.2:
756   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.1(0x40000000)
757   ; CHECK-NEXT:   liveins: $sgpr4_sgpr5
758   ; CHECK-NEXT: {{  $}}
759   ; CHECK-NEXT:   S_NOP 0, implicit-def dead [[V_CNDMASK_B32_e64_]], implicit [[V_CNDMASK_B32_e64_]]
760   ; CHECK-NEXT:   S_CBRANCH_VCCNZ %bb.4, implicit undef $vcc
761   ; CHECK-NEXT:   S_BRANCH %bb.1
762   ; CHECK-NEXT: {{  $}}
763   ; CHECK-NEXT: bb.3:
764   ; CHECK-NEXT:   S_ENDPGM 0
765   ; CHECK-NEXT: {{  $}}
766   ; CHECK-NEXT: bb.4:
767   ; CHECK-NEXT:   S_ENDPGM 0
768   bb.0:
769     liveins: $sgpr4_sgpr5
771   bb.1:
772     liveins: $sgpr4_sgpr5
774     %0:sreg_64_xexec = COPY $sgpr4_sgpr5
775     %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
776     %2:sreg_64_xexec = V_CMP_NE_U32_e64 1, %1, implicit $exec
777     $vcc = S_AND_B64 $exec, %2, implicit-def dead $scc
778     S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
780   bb.2:
781     liveins: $sgpr4_sgpr5
782     S_NOP 0, implicit-def %1, implicit %1
783     S_CBRANCH_VCCNZ %bb.4, implicit killed undef $vcc
784     S_BRANCH %bb.1
786   bb.3:
787     S_ENDPGM 0
789   bb.4:
790     S_ENDPGM 0