diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 178f1fc9313d7..d7ea25838058e 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -359,7 +359,7 @@ bool IRTranslator::translateCompare(const User &U, bool IRTranslator::translateRet(const User &U, MachineIRBuilder &MIRBuilder) { const ReturnInst &RI = cast(U); const Value *Ret = RI.getReturnValue(); - if (Ret && DL->getTypeStoreSize(Ret->getType()) == 0) + if (Ret && DL->getTypeStoreSize(Ret->getType()).isZero()) Ret = nullptr; ArrayRef VRegs; diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 6107fa5c43c57..0c3057888a4f3 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1966,6 +1966,9 @@ void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) { if (SrcReg.isVirtual() && DstReg.isPhysical() && SrcSize.isScalable() && !DstSize.isScalable()) break; + if (SrcReg.isVirtual() && DstReg.isPhysical() && SrcSize.isScalable() && + !DstSize.isScalable()) + break; if (SrcSize.isNonZero() && DstSize.isNonZero() && SrcSize != DstSize) { if (!DstOp.getSubReg() && !SrcOp.getSubReg()) { diff --git a/llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp b/llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp index e73d8863963d0..5d82d9f76f604 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp @@ -347,7 +347,10 @@ static bool isSupportedArgumentType(Type *T, const RISCVSubtarget &Subtarget, } // TODO: Only integer, pointer and aggregate types are supported now. -static bool isSupportedReturnType(Type *T, const RISCVSubtarget &Subtarget) { +// TODO: Remove IsLowerRetVal argument by adding support for vectors in +// lowerCall. +static bool isSupportedReturnType(Type *T, const RISCVSubtarget &Subtarget, + bool IsLowerRetVal = false) { // TODO: Integers larger than 2*XLen are passed indirectly which is not // supported yet. if (T->isIntegerTy()) @@ -368,6 +371,11 @@ static bool isSupportedReturnType(Type *T, const RISCVSubtarget &Subtarget) { return true; } + if (IsLowerRetVal && T->isVectorTy() && Subtarget.hasVInstructions() && + T->isScalableTy() && + isLegalElementTypeForRVV(T->getScalarType(), Subtarget)) + return true; + return false; } @@ -380,7 +388,7 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder, const RISCVSubtarget &Subtarget = MIRBuilder.getMF().getSubtarget(); - if (!isSupportedReturnType(Val->getType(), Subtarget)) + if (!isSupportedReturnType(Val->getType(), Subtarget, /*IsLowerRetVal=*/true)) return false; MachineFunction &MF = MIRBuilder.getMF(); diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index a4cd8327f45f8..55ef4bd5a4e4b 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -19638,12 +19638,15 @@ unsigned RISCVTargetLowering::getCustomCtpopCost(EVT VT, } bool RISCVTargetLowering::fallBackToDAGISel(const Instruction &Inst) const { - // We don't support scalable vectors in GISel. + // At the moment, the only scalable instruction GISel knows how to lower is + // ret with scalable argument. + if (Inst.getType()->isScalableTy()) return true; for (unsigned i = 0; i < Inst.getNumOperands(); ++i) - if (Inst.getOperand(i)->getType()->isScalableTy()) + if (Inst.getOperand(i)->getType()->isScalableTy() && + !isa(&Inst)) return true; if (const AllocaInst *AI = dyn_cast(&Inst)) { diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-bf16-err.ll b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-bf16-err.ll new file mode 100644 index 0000000000000..c968d0726317f --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-bf16-err.ll @@ -0,0 +1,14 @@ +; RUN: not --crash llc -mtriple=riscv32 -mattr=+v -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s 2>&1 | FileCheck %s +; RUN: not --crash llc -mtriple=riscv64 -mattr=+v -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s 2>&1 | FileCheck %s + +; The purpose of this test is to show that the compiler throws an error when +; there is no support for bf16 vectors. If the compiler did not throw an error, +; then it will try to scalarize the argument to an s32, which may drop elements. +define @test_ret_nxv1bf16() { +entry: + ret undef +} + +; CHECK: LLVM ERROR: unable to translate instruction: ret (in function: test_ret_nxv1bf16) diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-f16-err.ll b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-f16-err.ll new file mode 100644 index 0000000000000..f87ca94ceb4f1 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret-f16-err.ll @@ -0,0 +1,14 @@ +; RUN: not --crash llc -mtriple=riscv32 -mattr=+v -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s 2>&1 | FileCheck %s +; RUN: not --crash llc -mtriple=riscv64 -mattr=+v -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s 2>&1 | FileCheck %s + +; The purpose of this test is to show that the compiler throws an error when +; there is no support for f16 vectors. If the compiler did not throw an error, +; then it will try to scalarize the argument to an s32, which may drop elements. +define @test_ret_nxv1f16() { +entry: + ret undef +} + +; CHECK: LLVM ERROR: unable to translate instruction: ret (in function: test_ret_nxv1f16) diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret.ll b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret.ll new file mode 100644 index 0000000000000..eec9969063c87 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/vec-ret.ll @@ -0,0 +1,809 @@ +; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvfbfmin,+zvfh -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s | FileCheck -check-prefixes=RV32 %s +; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvfbfmin,+zvfh -global-isel -stop-after=irtranslator \ +; RUN: -verify-machineinstrs < %s | FileCheck -check-prefixes=RV64 %s + +; ========================================================================== +; ============================= Scalable Types ============================= +; ========================================================================== + +define @test_ret_nxv1i8() { + ; RV32-LABEL: name: test_ret_nxv1i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2i8() { + ; RV32-LABEL: name: test_ret_nxv2i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4i8() { + ; RV32-LABEL: name: test_ret_nxv4i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv4i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv8i8() { + ; RV32-LABEL: name: test_ret_nxv8i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv8i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv16i8() { + ; RV32-LABEL: name: test_ret_nxv16i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv16i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv32i8() { + ; RV32-LABEL: name: test_ret_nxv32i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv32i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv64i8() { + ; RV32-LABEL: name: test_ret_nxv64i8 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv64i8 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1i16() { + ; RV32-LABEL: name: test_ret_nxv1i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2i16() { + ; RV32-LABEL: name: test_ret_nxv2i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4i16() { + ; RV32-LABEL: name: test_ret_nxv4i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv4i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv8i16() { + ; RV32-LABEL: name: test_ret_nxv8i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv8i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv16i16() { + ; RV32-LABEL: name: test_ret_nxv16i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv16i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv32i16() { + ; RV32-LABEL: name: test_ret_nxv32i16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv32i16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1i32() { + ; RV32-LABEL: name: test_ret_nxv1i32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1i32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2i32() { + ; RV32-LABEL: name: test_ret_nxv2i32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2i32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4i32() { + ; RV32-LABEL: name: test_ret_nxv4i32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv4i32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv8i32() { + ; RV32-LABEL: name: test_ret_nxv8i32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv8i32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv16i32() { + ; RV32-LABEL: name: test_ret_nxv16i32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv16i32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1i64() { + ; RV32-LABEL: name: test_ret_nxv1i64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1i64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2i64() { + ; RV32-LABEL: name: test_ret_nxv2i64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv2i64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv4i64() { + ; RV32-LABEL: name: test_ret_nxv4i64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv4i64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv8i64() { + ; RV32-LABEL: name: test_ret_nxv8i64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv8i64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv64i1() { + ; RV32-LABEL: name: test_ret_nxv64i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv64i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv32i1() { + ; RV32-LABEL: name: test_ret_nxv32i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv32i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv16i1() { + ; RV32-LABEL: name: test_ret_nxv16i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv16i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv8i1() { + ; RV32-LABEL: name: test_ret_nxv8i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv8i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4i1() { + ; RV32-LABEL: name: test_ret_nxv4i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv4i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2i1() { + ; RV32-LABEL: name: test_ret_nxv2i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv1i1() { + ; RV32-LABEL: name: test_ret_nxv1i1 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1i1 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv1f32() { + ; RV32-LABEL: name: test_ret_nxv1f32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1f32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2f32() { + ; RV32-LABEL: name: test_ret_nxv2f32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2f32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4f32() { + ; RV32-LABEL: name: test_ret_nxv4f32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv4f32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv8f32() { + ; RV32-LABEL: name: test_ret_nxv8f32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv8f32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv16f32() { + ; RV32-LABEL: name: test_ret_nxv16f32 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv16f32 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1f64() { + ; RV32-LABEL: name: test_ret_nxv1f64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1f64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2f64() { + ; RV32-LABEL: name: test_ret_nxv2f64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv2f64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv4f64() { + ; RV32-LABEL: name: test_ret_nxv4f64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv4f64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv8f64() { + ; RV32-LABEL: name: test_ret_nxv8f64 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv8f64 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1f16() { + ; RV32-LABEL: name: test_ret_nxv1f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2f16() { + ; RV32-LABEL: name: test_ret_nxv2f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4f16() { + ; RV32-LABEL: name: test_ret_nxv4f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv4f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv8f16() { + ; RV32-LABEL: name: test_ret_nxv8f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv8f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv16f16() { + ; RV32-LABEL: name: test_ret_nxv16f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv16f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv32f16() { + ; RV32-LABEL: name: test_ret_nxv32f16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv32f16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +} + +define @test_ret_nxv1b16() { + ; RV32-LABEL: name: test_ret_nxv1b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv1b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv2b16() { + ; RV32-LABEL: name: test_ret_nxv2b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv2b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv4b16() { + ; RV32-LABEL: name: test_ret_nxv4b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8 + ; + ; RV64-LABEL: name: test_ret_nxv4b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8 +entry: + ret undef +} + +define @test_ret_nxv8b16() { + ; RV32-LABEL: name: test_ret_nxv8b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m2 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m2 + ; + ; RV64-LABEL: name: test_ret_nxv8b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m2 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m2 +entry: + ret undef +} + +define @test_ret_nxv16b16() { + ; RV32-LABEL: name: test_ret_nxv16b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m4 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m4 + ; + ; RV64-LABEL: name: test_ret_nxv16b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m4 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m4 +entry: + ret undef +} + +define @test_ret_nxv32b16() { + ; RV32-LABEL: name: test_ret_nxv32b16 + ; RV32: bb.1.entry: + ; RV32-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV32-NEXT: $v8m8 = COPY [[DEF]]() + ; RV32-NEXT: PseudoRET implicit $v8m8 + ; + ; RV64-LABEL: name: test_ret_nxv32b16 + ; RV64: bb.1.entry: + ; RV64-NEXT: [[DEF:%[0-9]+]]:_() = G_IMPLICIT_DEF + ; RV64-NEXT: $v8m8 = COPY [[DEF]]() + ; RV64-NEXT: PseudoRET implicit $v8m8 +entry: + ret undef +}