# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 # RUN: llc -mtriple=aarch64 -mattr=+sme2 -force-streaming -start-before=greedy -stop-after=virtregrewriter %s -o - | FileCheck %s # Check the register allocator gets hints to reuse registers of one of its operands. --- name: prioritize_movprfx_hints tracksRegLiveness: true isSSA: false noVRegs: false body: | bb.0.entry: liveins: $z0, $z1, $z2, $z3, $p0 ; CHECK-LABEL: name: prioritize_movprfx_hints ; CHECK: liveins: $p0, $z0, $z1, $z2, $z3 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: renamable $z0 = SDIV_ZPZZ_D_UNDEF $p0, killed renamable $z0, killed renamable $z1 ; CHECK-NEXT: renamable $z2 = MUL_ZPZZ_D_UNDEF $p0, killed renamable $z2, killed renamable $z3 ; CHECK-NEXT: renamable $z0 = MUL_ZPZZ_D_UNDEF $p0, killed renamable $z2, killed renamable $z0 ; CHECK-NEXT: RET_ReallyLR implicit $z0 %0:zpr = COPY $z3 %1:zpr = COPY $z2 %2:zpr = COPY $z1 %3:zpr = COPY $z0 %4:zpr = SDIV_ZPZZ_D_UNDEF $p0, %3:zpr, %2:zpr %5:zpr = MUL_ZPZZ_D_UNDEF $p0, %1:zpr, %0:zpr %6:zpr = MUL_ZPZZ_D_UNDEF $p0, %5:zpr, %4:zpr $z0 = COPY %6:zpr RET_ReallyLR implicit $z0 ... # Check the register allocator prioritises hints that are set by the register # allocator itself (i.e. to use z4 for the result register). --- name: prioritize_regalloc_hints isSSA: false noVRegs: false body: | bb.0.entry: ; CHECK-LABEL: name: prioritize_regalloc_hints ; CHECK: renamable $z0 = FDUP_ZI_S 0, implicit $vg ; CHECK-NEXT: renamable $z1 = FDUP_ZI_S 16, implicit $vg ; CHECK-NEXT: renamable $z2 = FDUP_ZI_S 32, implicit $vg ; CHECK-NEXT: renamable $p0 = PTRUE_S 31, implicit $vg ; CHECK-NEXT: renamable $z4 = FMLA_ZPZZZ_S_UNDEF killed renamable $p0, killed renamable $z0, killed renamable $z1, killed renamable $z2 ; CHECK-NEXT: RET_ReallyLR implicit $z4 %0:zpr = FDUP_ZI_S 0, implicit $vg %1:zpr = FDUP_ZI_S 16, implicit $vg %2:zpr = FDUP_ZI_S 32, implicit $vg %3:ppr_3b = PTRUE_S 31, implicit $vg %4:zpr = FMLA_ZPZZZ_S_UNDEF %3, %0, %1, %2 $z4 = COPY %4 RET_ReallyLR implicit $z4 ... # Check the register allocator gets hints to reuse registers of one of its # operands, which are a subreg of a multi-register RegisterClass. --- name: prioritize_subreg_hints tracksRegLiveness: true isSSA: false noVRegs: false body: | bb.0.entry: liveins: $x0, $x1, $x2 ; CHECK-LABEL: name: prioritize_subreg_hints ; CHECK: liveins: $x0, $x1, $x2 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: renamable $pn8 = PTRUE_C_B implicit $vg ; CHECK-NEXT: renamable $z16_z24 = LD1B_2Z_IMM_PSEUDO killed renamable $pn8, killed renamable $x2, 0 ; CHECK-NEXT: renamable $z16 = ADD_ZI_B_PSEUDO renamable $z16, 5, 0 ; CHECK-NEXT: renamable $z24 = ADD_ZI_B_PSEUDO killed renamable $z24, 5, 0 ; CHECK-NEXT: STR_ZXI killed renamable $z16, killed renamable $x0, 0 ; CHECK-NEXT: STR_ZXI killed renamable $z24, killed renamable $x1, 0 ; CHECK-NEXT: RET_ReallyLR %0:gpr64common = COPY $x0 %1:gpr64common = COPY $x1 %2:gpr64common = COPY $x2 %3:pnr_p8to15 = PTRUE_C_B implicit $vg %4:zpr2stridedorcontiguous = LD1B_2Z_IMM_PSEUDO %3, %2, 0 %7:zpr = ADD_ZI_B_PSEUDO %4.zsub0, 5, 0 %8:zpr = ADD_ZI_B_PSEUDO %4.zsub1, 5, 0 STR_ZXI %7, %0, 0 STR_ZXI %8, %1, 0 RET_ReallyLR ...