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