# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 # RUN: llc -run-pass=livevars,phi-node-elimination -verify-machineinstrs -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s # Verify that the original COPY in bb.1 is reappropriated as the PHI source in bb.2, # instead of creating a new COPY with the same source register. --- name: copy_virtual_reg tracksRegLiveness: true body: | ; CHECK-LABEL: name: copy_virtual_reg ; CHECK: bb.0: ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; CHECK-NEXT: liveins: $nzcv, $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %a:gpr32 = COPY killed $w0 ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF ; CHECK-NEXT: Bcc 8, %bb.2, implicit killed $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: successors: %bb.2(0x80000000) ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %b:gpr32 = COPY killed %a ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = COPY killed %b ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: %c:gpr32 = COPY killed [[DEF]] ; CHECK-NEXT: dead %d:gpr32 = COPY killed %c bb.0: liveins: $nzcv, $w0 %a:gpr32 = COPY $w0 Bcc 8, %bb.2, implicit $nzcv bb.1: %b:gpr32 = COPY %a:gpr32 bb.2: %c:gpr32 = PHI %b:gpr32, %bb.1, undef %undef:gpr32, %bb.0 %d:gpr32 = COPY %c:gpr32 ... --- name: copy_physical_reg tracksRegLiveness: true body: | ; CHECK-LABEL: name: copy_physical_reg ; CHECK: bb.0: ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; CHECK-NEXT: liveins: $nzcv, $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF ; CHECK-NEXT: Bcc 8, %bb.2, implicit killed $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: successors: %bb.2(0x80000000) ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead $x0 = IMPLICIT_DEF implicit-def $w0 ; CHECK-NEXT: %a:gpr32 = COPY killed $w0 ; CHECK-NEXT: [[DEF:%[0-9]+]]:gpr32 = COPY killed %a ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: dead %b:gpr32 = COPY killed [[DEF]] bb.0: liveins: $nzcv, $w0 Bcc 8, %bb.2, implicit $nzcv bb.1: $x0 = IMPLICIT_DEF %a:gpr32 = COPY $w0 bb.2: %b:gpr32 = PHI %a:gpr32, %bb.1, undef %undef:gpr32, %bb.0 ... --- name: copy_to_dead tracksRegLiveness: true body: | ; CHECK-LABEL: name: copy_to_dead ; CHECK: bb.0: ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; CHECK-NEXT: liveins: $wzr, $xzr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $wzr ; CHECK-NEXT: dead [[COPY1:%[0-9]+]]:gpr64 = COPY $xzr ; CHECK-NEXT: TBZW killed [[COPY]], 0, %bb.2 ; CHECK-NEXT: B %bb.1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: successors: %bb.2(0x80000000) ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead [[DEF:%[0-9]+]]:gpr64 = IMPLICIT_DEF ; CHECK-NEXT: dead [[DEF1:%[0-9]+]]:gpr64 = IMPLICIT_DEF ; CHECK-NEXT: B %bb.2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: successors: %bb.1(0x80000000) ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead [[DEF2:%[0-9]+]]:gpr64 = IMPLICIT_DEF ; CHECK-NEXT: dead [[DEF3:%[0-9]+]]:gpr64 = IMPLICIT_DEF ; CHECK-NEXT: B %bb.1 bb.0: liveins: $wzr, $xzr %9:gpr32 = COPY $wzr dead %5:gpr64 = COPY $xzr TBZW killed %9:gpr32, 0, %bb.2 B %bb.1 bb.1: successors: %bb.2(0x80000000); %bb.2(100.00%) dead %1:gpr64 = PHI undef %3:gpr64, %bb.2, undef %5:gpr64, %bb.0 dead %2:gpr64 = PHI undef %4:gpr64, %bb.2, undef %5:gpr64, %bb.0 B %bb.2 bb.2: successors: %bb.1(0x80000000); %bb.1(100.00%) dead %3:gpr64 = PHI undef %1:gpr64, %bb.1, undef %5:gpr64, %bb.0 dead %4:gpr64 = PHI undef %2:gpr64, %bb.1, undef %5:gpr64, %bb.0 B %bb.1 ... --- name: update_livevars tracksRegLiveness: true body: | ; CHECK-LABEL: name: update_livevars ; CHECK: bb.0: ; CHECK-NEXT: successors: %bb.1(0x80000000) ; CHECK-NEXT: liveins: $w0, $w1, $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY killed $w0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY killed $w1 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY killed [[COPY1]] ; CHECK-NEXT: B %bb.1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) ; CHECK-NEXT: liveins: $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: dead [[COPY3:%[0-9]+]]:gpr32 = COPY killed [[COPY2]] ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr32 = COPY [[COPY]] ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY4]] ; CHECK-NEXT: Bcc 1, %bb.1, implicit $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: successors: %bb.1(0x80000000) ; CHECK-NEXT: liveins: $nzcv ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr32 = COPY killed [[COPY4]] ; CHECK-NEXT: B %bb.1 bb.0: successors: %bb.1 liveins: $w0, $w1, $nzcv %0:gpr32 = COPY killed $w0 %1:gpr32 = COPY killed $w1 B %bb.1 bb.1: successors: %bb.2, %bb.1 liveins: $nzcv %2:gpr32 = PHI %3, %bb.2, %1, %bb.0, %3, %bb.1 %3:gpr32 = COPY %0 Bcc 1, %bb.1, implicit $nzcv bb.2: successors: %bb.1 liveins: $nzcv B %bb.1 ... --- name: copy_subreg tracksRegLiveness: true body: | ; CHECK-LABEL: name: copy_subreg ; CHECK: bb.0: ; CHECK-NEXT: successors: %bb.1(0x80000000) ; CHECK-NEXT: liveins: $x0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY killed $x0 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY killed [[COPY]] ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: ; CHECK-NEXT: dead [[COPY2:%[0-9]+]]:gpr32 = COPY killed [[COPY1]].sub_32 bb.0: successors: %bb.1 liveins: $x0 %0:gpr64 = COPY killed $x0 %1:gpr64 = COPY killed %0 bb.1: %2:gpr32 = PHI %1.sub_32, %bb.0 ...