12a53b6c0SMatt Arsenault# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
22a53b6c0SMatt Arsenault# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1031 -run-pass=register-coalescer -verify-coalescing -o - %s | FileCheck %s
32a53b6c0SMatt Arsenault
42a53b6c0SMatt Arsenault# Make sure coalescing doesn't produce "no live segment at def" when
52a53b6c0SMatt Arsenault# there is a live out implicit_def with subranges.
62a53b6c0SMatt Arsenault
72a53b6c0SMatt Arsenault# %1 will be coalesced into %0. %0 is a cross block implicit_def that
82a53b6c0SMatt Arsenault# cannot be deleted. The def of %0 in %bb.2 is a live out subregister
92a53b6c0SMatt Arsenault# def of the same register. We need to ensure that the resulting
102a53b6c0SMatt Arsenault# subrange for %0.sub0 includes the def in %bb.1
112a53b6c0SMatt Arsenault
122a53b6c0SMatt Arsenault---
132a53b6c0SMatt Arsenaultname: liveout_implicit_def_super_reg_redefine_sub0_implicit_def
142a53b6c0SMatt ArsenaulttracksRegLiveness: true
152a53b6c0SMatt Arsenaultbody:             |
162a53b6c0SMatt Arsenault  ; CHECK-LABEL: name: liveout_implicit_def_super_reg_redefine_sub0_implicit_def
172a53b6c0SMatt Arsenault  ; CHECK: bb.0:
182a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
192a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
202a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_CBRANCH_SCC0 %bb.2, implicit undef $scc
212a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
222a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.1:
232a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
242a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
25*e7900e69SMatt Arsenault  ; CHECK-NEXT:   undef [[S_MOV_B32_:%[0-9]+]].sub0:sgpr_128 = S_MOV_B32 0
262a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_BRANCH %bb.3
272a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
282a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.2:
292a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
302a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
31*e7900e69SMatt Arsenault  ; CHECK-NEXT:   undef [[S_MOV_B32_:%[0-9]+]].sub0:sgpr_128 = IMPLICIT_DEF
322a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
332a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.3:
34*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[S_MOV_B32_]]
35*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[S_MOV_B32_]].sub0
362a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_ENDPGM 0
372a53b6c0SMatt Arsenault  bb.0:
382a53b6c0SMatt Arsenault    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
392a53b6c0SMatt Arsenault
402a53b6c0SMatt Arsenault  bb.1:
412a53b6c0SMatt Arsenault    %0:sgpr_128 = IMPLICIT_DEF
422a53b6c0SMatt Arsenault    %1:sgpr_32 = S_MOV_B32 0
432a53b6c0SMatt Arsenault    S_BRANCH %bb.3
442a53b6c0SMatt Arsenault
452a53b6c0SMatt Arsenault  bb.2:
462a53b6c0SMatt Arsenault    undef %0.sub0:sgpr_128 = IMPLICIT_DEF
472a53b6c0SMatt Arsenault    %1:sgpr_32 = COPY %0.sub0
482a53b6c0SMatt Arsenault
492a53b6c0SMatt Arsenault  bb.3:
502a53b6c0SMatt Arsenault    S_NOP 0, implicit %0
512a53b6c0SMatt Arsenault    S_NOP 0, implicit %1
522a53b6c0SMatt Arsenault    S_ENDPGM 0
532a53b6c0SMatt Arsenault
542a53b6c0SMatt Arsenault...
552a53b6c0SMatt Arsenault
562a53b6c0SMatt Arsenault
572a53b6c0SMatt Arsenault# Redef of sub0 is a meaningful value.
582a53b6c0SMatt Arsenault---
592a53b6c0SMatt Arsenaultname: liveout_implicit_def_redefine_sub0_undef_other
602a53b6c0SMatt ArsenaulttracksRegLiveness: true
612a53b6c0SMatt Arsenaultbody:             |
622a53b6c0SMatt Arsenault  ; CHECK-LABEL: name: liveout_implicit_def_redefine_sub0_undef_other
632a53b6c0SMatt Arsenault  ; CHECK: bb.0:
642a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
652a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
662a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_CBRANCH_SCC0 %bb.2, implicit undef $scc
672a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
682a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.1:
692a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
702a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
71*e7900e69SMatt Arsenault  ; CHECK-NEXT:   undef [[S_MOV_B32_:%[0-9]+]].sub0:sgpr_128 = S_MOV_B32 0
722a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_BRANCH %bb.3
732a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
742a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.2:
752a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
762a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
77*e7900e69SMatt Arsenault  ; CHECK-NEXT:   undef [[S_MOV_B32_:%[0-9]+]].sub0:sgpr_128 = S_MOV_B32 9
782a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
792a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.3:
80*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[S_MOV_B32_]]
81*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[S_MOV_B32_]].sub0
822a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_ENDPGM 0
832a53b6c0SMatt Arsenault  bb.0:
842a53b6c0SMatt Arsenault    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
852a53b6c0SMatt Arsenault
862a53b6c0SMatt Arsenault  bb.1:
872a53b6c0SMatt Arsenault    %0:sgpr_128 = IMPLICIT_DEF
882a53b6c0SMatt Arsenault    %1:sgpr_32 = S_MOV_B32 0
892a53b6c0SMatt Arsenault    S_BRANCH %bb.3
902a53b6c0SMatt Arsenault
912a53b6c0SMatt Arsenault  bb.2:
922a53b6c0SMatt Arsenault    undef %0.sub0:sgpr_128 = S_MOV_B32 9
932a53b6c0SMatt Arsenault    %1:sgpr_32 = COPY %0.sub0
942a53b6c0SMatt Arsenault
952a53b6c0SMatt Arsenault  bb.3:
962a53b6c0SMatt Arsenault    S_NOP 0, implicit %0
972a53b6c0SMatt Arsenault    S_NOP 0, implicit %1
982a53b6c0SMatt Arsenault    S_ENDPGM 0
992a53b6c0SMatt Arsenault
1002a53b6c0SMatt Arsenault...
1012a53b6c0SMatt Arsenault
1022a53b6c0SMatt Arsenault# The initial def of the register doesn't doesn't cover the redefined
1032a53b6c0SMatt Arsenault# lanes. This had no error but was useful to compare against the
1042a53b6c0SMatt Arsenault# failing cases.
1052a53b6c0SMatt Arsenault---
1062a53b6c0SMatt Arsenaultname: only_redefine_undefined_lanes
1072a53b6c0SMatt ArsenaulttracksRegLiveness: true
1082a53b6c0SMatt Arsenaultbody:             |
1092a53b6c0SMatt Arsenault  ; CHECK-LABEL: name: only_redefine_undefined_lanes
1102a53b6c0SMatt Arsenault  ; CHECK: bb.0:
1112a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
1122a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
1132a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_CBRANCH_SCC0 %bb.2, implicit undef $scc
1142a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
1152a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.1:
1162a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
1172a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
1182a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit-def undef %0.sub1_sub2_sub3
119*e7900e69SMatt Arsenault  ; CHECK-NEXT:   [[V_MOV_B32_e32_:%[0-9]+]].sub0:vreg_128 = V_MOV_B32_e32 0, implicit $exec
1202a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_BRANCH %bb.3
1212a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
1222a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.2:
1232a53b6c0SMatt Arsenault  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
1242a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
125*e7900e69SMatt Arsenault  ; CHECK-NEXT:   undef [[V_MOV_B32_e32_:%[0-9]+]].sub0:vreg_128 = V_MOV_B32_e32 9, implicit $exec
1262a53b6c0SMatt Arsenault  ; CHECK-NEXT: {{  $}}
1272a53b6c0SMatt Arsenault  ; CHECK-NEXT: bb.3:
128*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[V_MOV_B32_e32_]]
129*e7900e69SMatt Arsenault  ; CHECK-NEXT:   S_NOP 0, implicit [[V_MOV_B32_e32_]].sub0
1302a53b6c0SMatt Arsenault  ; CHECK-NEXT:   S_ENDPGM 0
1312a53b6c0SMatt Arsenault  bb.0:
1322a53b6c0SMatt Arsenault    S_CBRANCH_SCC0 %bb.2, implicit undef $scc
1332a53b6c0SMatt Arsenault
1342a53b6c0SMatt Arsenault  bb.1:
1352a53b6c0SMatt Arsenault    S_NOP 0, implicit-def undef %0.sub1_sub2_sub3:vreg_128
1362a53b6c0SMatt Arsenault    %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
1372a53b6c0SMatt Arsenault    S_BRANCH %bb.3
1382a53b6c0SMatt Arsenault
1392a53b6c0SMatt Arsenault  bb.2:
1402a53b6c0SMatt Arsenault    undef %0.sub0:vreg_128 = V_MOV_B32_e32 9, implicit $exec
1412a53b6c0SMatt Arsenault    %1:vgpr_32 = COPY %0.sub0
1422a53b6c0SMatt Arsenault
1432a53b6c0SMatt Arsenault  bb.3:
1442a53b6c0SMatt Arsenault    S_NOP 0, implicit %0
1452a53b6c0SMatt Arsenault    S_NOP 0, implicit %1
1462a53b6c0SMatt Arsenault    S_ENDPGM 0
1472a53b6c0SMatt Arsenault
1482a53b6c0SMatt Arsenault...
149