diff --git a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp index 64ae4e94a8c92..4b47f0b8bc6af 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp @@ -40,6 +40,30 @@ static LegalityPredicate typeIsScalarFPArith(unsigned TypeIdx, }; } +static LegalityPredicate +typeIsLegalIntOrFPVec(unsigned TypeIdx, + std::initializer_list IntOrFPVecTys, + const RISCVSubtarget &ST) { + LegalityPredicate P = [=, &ST](const LegalityQuery &Query) { + return ST.hasVInstructions() && + (Query.Types[TypeIdx].getScalarSizeInBits() != 64 || + ST.hasVInstructionsI64()) && + (Query.Types[TypeIdx].getElementCount().getKnownMinValue() != 1 || + ST.getELen() == 64); + }; + + return all(typeInSet(TypeIdx, IntOrFPVecTys), P); +} + +static LegalityPredicate +typeIsLegalBoolVec(unsigned TypeIdx, std::initializer_list BoolVecTys, + const RISCVSubtarget &ST) { + LegalityPredicate HasV = [=, &ST](const LegalityQuery &Query) { + return ST.hasVInstructions(); + }; + return all(typeInSet(TypeIdx, BoolVecTys), HasV); +} + RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) : STI(ST), XLen(STI.getXLen()), sXLen(LLT::scalar(XLen)) { const LLT sDoubleXLen = LLT::scalar(2 * XLen); @@ -50,6 +74,14 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) const LLT s32 = LLT::scalar(32); const LLT s64 = LLT::scalar(64); + const LLT nxv1s1 = LLT::scalable_vector(1, s1); + const LLT nxv2s1 = LLT::scalable_vector(2, s1); + const LLT nxv4s1 = LLT::scalable_vector(4, s1); + const LLT nxv8s1 = LLT::scalable_vector(8, s1); + const LLT nxv16s1 = LLT::scalable_vector(16, s1); + const LLT nxv32s1 = LLT::scalable_vector(32, s1); + const LLT nxv64s1 = LLT::scalable_vector(64, s1); + const LLT nxv1s8 = LLT::scalable_vector(1, s8); const LLT nxv2s8 = LLT::scalable_vector(2, s8); const LLT nxv4s8 = LLT::scalable_vector(4, s8); @@ -78,22 +110,16 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) using namespace TargetOpcode; - auto AllVecTys = {nxv1s8, nxv2s8, nxv4s8, nxv8s8, nxv16s8, nxv32s8, - nxv64s8, nxv1s16, nxv2s16, nxv4s16, nxv8s16, nxv16s16, - nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32, - nxv1s64, nxv2s64, nxv4s64, nxv8s64}; + auto BoolVecTys = {nxv1s1, nxv2s1, nxv4s1, nxv8s1, nxv16s1, nxv32s1, nxv64s1}; + + auto IntOrFPVecTys = {nxv1s8, nxv2s8, nxv4s8, nxv8s8, nxv16s8, nxv32s8, + nxv64s8, nxv1s16, nxv2s16, nxv4s16, nxv8s16, nxv16s16, + nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32, + nxv1s64, nxv2s64, nxv4s64, nxv8s64}; getActionDefinitionsBuilder({G_ADD, G_SUB, G_AND, G_OR, G_XOR}) .legalFor({s32, sXLen}) - .legalIf(all( - typeInSet(0, AllVecTys), - LegalityPredicate([=, &ST](const LegalityQuery &Query) { - return ST.hasVInstructions() && - (Query.Types[0].getScalarSizeInBits() != 64 || - ST.hasVInstructionsI64()) && - (Query.Types[0].getElementCount().getKnownMinValue() != 1 || - ST.getELen() == 64); - }))) + .legalIf(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST)) .widenScalarToNextPow2(0) .clampScalar(0, s32, sXLen); @@ -191,8 +217,11 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST) ConstantActions.customFor({s64}); ConstantActions.widenScalarToNextPow2(0).clampScalar(0, s32, sXLen); + // TODO: transform illegal vector types into legal vector type getActionDefinitionsBuilder(G_IMPLICIT_DEF) .legalFor({s32, sXLen, p0}) + .legalIf(typeIsLegalBoolVec(0, BoolVecTys, ST)) + .legalIf(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST)) .widenScalarToNextPow2(0) .clampScalar(0, s32, sXLen); diff --git a/llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp b/llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp index 58c971aee2f4c..a922991b7338c 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp @@ -343,6 +343,8 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { } case TargetOpcode::G_IMPLICIT_DEF: { Register Dst = MI.getOperand(0).getReg(); + LLT DstTy = MRI.getType(Dst); + uint64_t DstMinSize = DstTy.getSizeInBits().getKnownMinValue(); auto Mapping = GPRValueMapping; // FIXME: May need to do a better job determining when to use FPRB. // For example, the look through COPY case: @@ -350,7 +352,11 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { // %1:_(s32) = COPY %0 // $f10_d = COPY %1(s32) if (anyUseOnlyUseFP(Dst, MRI, TRI)) - Mapping = getFPValueMapping(MRI.getType(Dst).getSizeInBits()); + Mapping = getFPValueMapping(DstMinSize); + + if (DstTy.isVector()) + Mapping = getVRBValueMapping(DstMinSize); + return getInstructionMapping(DefaultMappingID, /*Cost=*/1, Mapping, NumOperands); } diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-implicit-def.mir b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-implicit-def.mir new file mode 100644 index 0000000000000..8ee40861ce028 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/legalizer/rvv/legalize-implicit-def.mir @@ -0,0 +1,410 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s +# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: implicitdef_nxv1i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv1i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv2i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv4i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv8i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv8i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv16i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv16i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv32i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv32i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv64i1 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv64i1 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv1i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv1i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv2i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv4i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv8i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv8i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv16i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv16i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m2 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv32i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv32i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m4 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv64i8 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv64i8 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv1i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv2i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv4i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv8i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv8i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m2 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv16i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv16i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m4 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv32i16 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv32i16 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i32 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv1i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i32 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv2i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i32 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv4i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m2 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv8i32 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv8i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m4 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv16i32 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv16i32 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i64 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv1i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i64 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv2i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m2 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv4i64 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv4i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m4 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv8i64 +legalized: false +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: implicitdef_nxv8i64 + ; CHECK: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; CHECK-NEXT: $v8m8 = COPY [[DEF]]() + ; CHECK-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/regbankselect/rvv/implicit-def.mir b/llvm/test/CodeGen/RISCV/GlobalISel/regbankselect/rvv/implicit-def.mir new file mode 100644 index 0000000000000..ef1e355252e1b --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/regbankselect/rvv/implicit-def.mir @@ -0,0 +1,425 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=riscv32 -mattr=+m,+v -run-pass=regbankselect \ +# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs %s \ +# RUN: -o - | FileCheck -check-prefix=RV32I %s +# RUN: llc -mtriple=riscv64 -mattr=+m,+v -run-pass=regbankselect \ +# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs %s \ +# RUN: -o - | FileCheck -check-prefix=RV64I %s +--- +name: implicitdef_nxv1i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv1i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv1i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv2i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv2i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv4i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv4i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv8i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv8i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv8i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv16i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv16i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64I-LABEL: name: implicitdef_nxv16i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv32i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv32i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64I-LABEL: name: implicitdef_nxv32i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv64i8 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv64i8 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64I-LABEL: name: implicitdef_nxv64i8 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv1i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv1i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv2i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv2i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv4i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv4i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv8i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv8i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64I-LABEL: name: implicitdef_nxv8i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv16i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv16i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64I-LABEL: name: implicitdef_nxv16i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv32i16 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv32i16 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64I-LABEL: name: implicitdef_nxv32i16 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv1i32 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv1i32 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv2i32 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv2i32 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv4i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv4i32 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64I-LABEL: name: implicitdef_nxv4i32 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv8i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv8i32 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64I-LABEL: name: implicitdef_nxv8i32 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv16i32 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv16i32 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64I-LABEL: name: implicitdef_nxv16i32 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +... +--- +name: implicitdef_nxv1i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv1i64 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8 + ; + ; RV64I-LABEL: name: implicitdef_nxv1i64 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8 + %0:_() = G_IMPLICIT_DEF + $v8 = COPY %0() + PseudoRET implicit $v8 +... +--- +name: implicitdef_nxv2i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv2i64 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64I-LABEL: name: implicitdef_nxv2i64 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m2 + %0:_() = G_IMPLICIT_DEF + $v8m2 = COPY %0() + PseudoRET implicit $v8m2 +... +--- +name: implicitdef_nxv4i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv4i64 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64I-LABEL: name: implicitdef_nxv4i64 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m4 + %0:_() = G_IMPLICIT_DEF + $v8m4 = COPY %0() + PseudoRET implicit $v8m4 +... +--- +name: implicitdef_nxv8i64 +legalized: true +tracksRegLiveness: true +body: | + bb.0.entry: + ; RV32I-LABEL: name: implicitdef_nxv8i64 + ; RV32I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV32I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32I-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64I-LABEL: name: implicitdef_nxv8i64 + ; RV64I: [[DEF:%[0-9]+]]:vrb() = G_IMPLICIT_DEF + ; RV64I-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64I-NEXT: PseudoRET implicit $v8m8 + %0:_() = G_IMPLICIT_DEF + $v8m8 = COPY %0() + PseudoRET implicit $v8m8 +...