From a17bfbad6387bf0704bdc5a95c72bd84c6c7f7a1 Mon Sep 17 00:00:00 2001 From: Piyou Chen Date: Tue, 14 Feb 2023 19:29:59 -0800 Subject: [PATCH] [RISCV] precommit test for D129735 Reviewed By: kito-cheng Differential Revision: https://reviews.llvm.org/D137763 --- .../rvv/subregister-undef-early-clobber.mir | 604 ++++++++++++++++++ .../RISCV/rvv/undef-earlyclobber-chain.ll | 147 +++++ 2 files changed, 751 insertions(+) create mode 100644 llvm/test/CodeGen/RISCV/rvv/subregister-undef-early-clobber.mir create mode 100644 llvm/test/CodeGen/RISCV/rvv/undef-earlyclobber-chain.ll diff --git a/llvm/test/CodeGen/RISCV/rvv/subregister-undef-early-clobber.mir b/llvm/test/CodeGen/RISCV/rvv/subregister-undef-early-clobber.mir new file mode 100644 index 0000000000000..925d8027f10e0 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/subregister-undef-early-clobber.mir @@ -0,0 +1,604 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc %s -mtriple=riscv64 -mattr=+v -riscv-enable-subreg-liveness -run-pass=none -o - | FileCheck %s + +... +--- +name: test_M4_sub_vrm1_0 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm1_0 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_0 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm1_0 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M4_sub_vrm1_1 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm1_1 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_1 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm1_1 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M4_sub_vrm1_2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm1_2 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_2 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm1_2 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M4_sub_vrm1_3 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm1_3 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_3 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm1_3 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M4_sub_vrm2_0 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm2_0 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_0 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm2_0 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M4_sub_vrm2_1 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M4_sub_vrm2_1 + ; CHECK: [[DEF:%[0-9]+]]:vrm4 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm4 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_1 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm4 = PseudoVRGATHER_VI_M4 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M4 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm4 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm4 = INSERT_SUBREG %1:vrm4, %5, %subreg.sub_vrm2_1 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm4 = PseudoVRGATHER_VI_M4 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M4 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + + +--- +name: test_M8_sub_vrm1_0 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_0 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_0 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_0 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_1 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_1 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_1 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_1 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_2 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_2 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_2 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_3 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_3 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_3 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_3 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_4 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_4 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_4 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_4 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_5 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_5 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_5 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_5 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_6 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_6 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_6 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_6 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm1_7 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm1_7 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M1_:%[0-9]+]]:vr = PseudoVLE32_V_M1 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M1_]], %subreg.sub_vrm1_7 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vr = PseudoVLE32_V_M1 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm1_7 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm2_0 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm2_0 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_0 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm2_0 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm2_1 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm2_1 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_1 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm2_1 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm2_2 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm2_2 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_2 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm2_2 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm2_3 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm2_3 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M2_:%[0-9]+]]:vrm2 = PseudoVLE32_V_M2 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M2_]], %subreg.sub_vrm2_3 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm2 = PseudoVLE32_V_M2 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm2_3 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm4_0 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm4_0 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M4_:%[0-9]+]]:vrm4 = PseudoVLE32_V_M4 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M4_]], %subreg.sub_vrm4_0 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm4 = PseudoVLE32_V_M4 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm4_0 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... + +--- +name: test_M8_sub_vrm4_1 +body: | + bb.0.entry: + ; CHECK-LABEL: name: test_M8_sub_vrm4_1 + ; CHECK: [[DEF:%[0-9]+]]:vrm8 = IMPLICIT_DEF + ; CHECK-NEXT: [[ADDI:%[0-9]+]]:gpr = ADDI $x0, 8 + ; CHECK-NEXT: [[PseudoVLE32_V_M4_:%[0-9]+]]:vrm4 = PseudoVLE32_V_M4 killed [[ADDI]], 0, 5 /* e32 */ + ; CHECK-NEXT: [[INSERT_SUBREG:%[0-9]+]]:vrm8 = INSERT_SUBREG [[DEF]], [[PseudoVLE32_V_M4_]], %subreg.sub_vrm4_1 + ; CHECK-NEXT: dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + ; CHECK-NEXT: early-clobber %4:vrm8 = PseudoVRGATHER_VI_M8 killed [[INSERT_SUBREG]], 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[ADDI1:%[0-9]+]]:gpr = ADDI $x0, 0 + ; CHECK-NEXT: PseudoVSE32_V_M8 killed %4, killed [[ADDI1]], 0, 5 /* e32 */, implicit $vl, implicit $vtype + ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x0 + ; CHECK-NEXT: $x10 = COPY [[COPY]] + ; CHECK-NEXT: PseudoRET implicit $x10 + %1:vrm8 = IMPLICIT_DEF + %7:gpr = ADDI $x0, 8 + %5:vrm4 = PseudoVLE32_V_M4 killed %7:gpr, 0, 5 + %6:vrm8 = INSERT_SUBREG %1:vrm8, %5, %subreg.sub_vrm4_1 + dead $x0 = PseudoVSETIVLI 0, 210 /* e32, m4, ta, ma */, implicit-def $vl, implicit-def $vtype + early-clobber %0:vrm8 = PseudoVRGATHER_VI_M8 killed %6, 0, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %2:gpr = ADDI $x0, 0 + PseudoVSE32_V_M8 killed %0, killed %2, 0, 5 /* e32 */, implicit $vl, implicit $vtype + %3:gpr = COPY $x0 + $x10 = COPY %3 + PseudoRET implicit $x10 + +... diff --git a/llvm/test/CodeGen/RISCV/rvv/undef-earlyclobber-chain.ll b/llvm/test/CodeGen/RISCV/rvv/undef-earlyclobber-chain.ll new file mode 100644 index 0000000000000..2c63bba20291f --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/undef-earlyclobber-chain.ll @@ -0,0 +1,147 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple riscv64 -mattr=+v -riscv-enable-subreg-liveness < %s | FileCheck %s + +define dso_local signext i32 @undef_early_clobber_chain() { +; CHECK-LABEL: undef_early_clobber_chain: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: addi sp, sp, -400 +; CHECK-NEXT: .cfi_def_cfa_offset 400 +; CHECK-NEXT: vsetivli zero, 0, e32, m1, ta, ma +; CHECK-NEXT: vrgather.vi v8, v8, 0 +; CHECK-NEXT: mv a0, sp +; CHECK-NEXT: vse32.v v8, (a0) +; CHECK-NEXT: li a0, 0 +; CHECK-NEXT: addi sp, sp, 400 +; CHECK-NEXT: ret +entry: + %dst = alloca [100 x float], align 8 + call void @llvm.lifetime.start.p0(i64 400, ptr nonnull %dst) #4 + %0 = tail call @llvm.riscv.vrgather.vx.nxv2f32.i64( undef, undef, i64 0, i64 0) + call void @llvm.riscv.vse.nxv2f32.i64( %0, ptr nonnull %dst, i64 0) + call void @llvm.lifetime.end.p0(i64 400, ptr nonnull %dst) #4 + ret i32 0 +} + +define internal void @SubRegLivenessUndefInPhi(i64 %cond) { +; CHECK-LABEL: SubRegLivenessUndefInPhi: +; CHECK: # %bb.0: # %start +; CHECK-NEXT: blez a0, .LBB1_2 +; CHECK-NEXT: # %bb.1: # %Cond1 +; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vi v10, v8, 1 +; CHECK-NEXT: vadd.vi v12, v8, 3 +; CHECK-NEXT: j .LBB1_3 +; CHECK-NEXT: .LBB1_2: # %Cond2 +; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v9 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: srli a0, a0, 3 +; CHECK-NEXT: add a1, a0, a0 +; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma +; CHECK-NEXT: vslideup.vx v8, v9, a0 +; CHECK-NEXT: vsetvli a2, zero, e16, mf4, ta, ma +; CHECK-NEXT: vadd.vi v11, v9, 1 +; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma +; CHECK-NEXT: vslideup.vx v10, v11, a0 +; CHECK-NEXT: vsetvli a2, zero, e16, mf4, ta, ma +; CHECK-NEXT: vadd.vi v9, v9, 3 +; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma +; CHECK-NEXT: vslideup.vx v12, v9, a0 +; CHECK-NEXT: .LBB1_3: # %UseSR +; CHECK-NEXT: vl1r.v v14, (zero) +; CHECK-NEXT: vsetivli zero, 4, e8, m1, ta, ma +; CHECK-NEXT: vrgatherei16.vv v15, v14, v8 +; CHECK-NEXT: vrgatherei16.vv v8, v14, v10 +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma +; CHECK-NEXT: vand.vv v8, v15, v8 +; CHECK-NEXT: vsetivli zero, 4, e8, m1, ta, ma +; CHECK-NEXT: vrgatherei16.vv v9, v14, v12 +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma +; CHECK-NEXT: vand.vv v8, v8, v9 +; CHECK-NEXT: vs1r.v v8, (zero) +; CHECK-NEXT: ret +start: + %0 = icmp sgt i64 %cond, 0 + br i1 %0, label %Cond1, label %Cond2 + +Cond1: ; preds = %start + %v15 = tail call @llvm.experimental.stepvector.nxv1i16() + %v17 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %v15, i64 0) + %vs12.i.i.i = add %v15, shufflevector ( insertelement ( poison, i16 1, i32 0), poison, zeroinitializer) + %v18 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs12.i.i.i, i64 0) + %vs16.i.i.i = add %v15, shufflevector ( insertelement ( poison, i16 3, i32 0), poison, zeroinitializer) + %v20 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs16.i.i.i, i64 0) + br label %UseSR + +Cond2: ; preds = %start + %v15.2 = tail call @llvm.experimental.stepvector.nxv1i16() + %v17.2 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %v15.2, i64 1) + %vs12.i.i.i.2 = add %v15.2, shufflevector ( insertelement ( poison, i16 1, i32 0), poison, zeroinitializer) + %v18.2 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs12.i.i.i.2, i64 1) + %vs16.i.i.i.2 = add %v15.2, shufflevector ( insertelement ( poison, i16 3, i32 0), poison, zeroinitializer) + %v20.2 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs16.i.i.i.2, i64 1) + br label %UseSR + +UseSR: ; preds = %Cond1, Cond2 + %v17.3 = phi [ %v17, %Cond1 ], [ %v17.2, %Cond2 ] + %v18.3 = phi [ %v18, %Cond1 ], [ %v18.2, %Cond2 ] + %v20.3 = phi [ %v20, %Cond1 ], [ %v20.2, %Cond2 ] + %v37 = load , ptr addrspace(1) null, align 8 + %v38 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v17.3, i64 4) + %v40 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v18.3, i64 4) + %v42 = and %v38, %v40 + %v46 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v20.3, i64 4) + %v60 = and %v42, %v46 + store %v60, ptr addrspace(1) null, align 4 + ret void +} + +define internal void @SubRegLivenessUndef() { +; CHECK-LABEL: SubRegLivenessUndef: +; CHECK: # %bb.0: # %loopIR.preheader.i.i +; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma +; CHECK-NEXT: vid.v v8 +; CHECK-NEXT: vadd.vi v10, v8, 1 +; CHECK-NEXT: vadd.vi v12, v8, 3 +; CHECK-NEXT: .LBB2_1: # %loopIR3.i.i +; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: vl1r.v v9, (zero) +; CHECK-NEXT: vsetivli zero, 4, e8, m1, ta, ma +; CHECK-NEXT: vrgatherei16.vv v11, v9, v8 +; CHECK-NEXT: vrgatherei16.vv v13, v9, v10 +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma +; CHECK-NEXT: vand.vv v11, v11, v13 +; CHECK-NEXT: vsetivli zero, 4, e8, m1, ta, ma +; CHECK-NEXT: vrgatherei16.vv v13, v9, v12 +; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma +; CHECK-NEXT: vand.vv v9, v11, v13 +; CHECK-NEXT: vs1r.v v9, (zero) +; CHECK-NEXT: j .LBB2_1 +loopIR.preheader.i.i: + %v15 = tail call @llvm.experimental.stepvector.nxv1i16() + %v17 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %v15, i64 0) + %vs12.i.i.i = add %v15, shufflevector ( insertelement ( poison, i16 1, i32 0), poison, zeroinitializer) + %v18 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs12.i.i.i, i64 0) + %vs16.i.i.i = add %v15, shufflevector ( insertelement ( poison, i16 3, i32 0), poison, zeroinitializer) + %v20 = tail call @llvm.vector.insert.nxv8i16.nxv1i16( poison, %vs16.i.i.i, i64 0) + br label %loopIR3.i.i + +loopIR3.i.i: ; preds = %loopIR3.i.i, %loopIR.preheader.i.i + %v37 = load , ptr addrspace(1) null, align 8 + %v38 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v17, i64 4) + %v40 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v18, i64 4) + %v42 = and %v38, %v40 + %v46 = tail call @llvm.riscv.vrgatherei16.vv.nxv8i8.i64( undef, %v37, %v20, i64 4) + %v60 = and %v42, %v46 + store %v60, ptr addrspace(1) null, align 4 + br label %loopIR3.i.i +} + +declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) +declare @llvm.riscv.vrgather.vx.nxv2f32.i64(, , i64, i64) #2 +declare void @llvm.riscv.vse.nxv2f32.i64(, ptr nocapture, i64) +declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) +declare @llvm.experimental.stepvector.nxv1i16() +declare @llvm.vector.insert.nxv8i16.nxv1i16(, , i64 immarg) +declare @llvm.riscv.vrgatherei16.vv.nxv8i8.i64(, , , i64)