diff --git a/llvm/lib/Target/RISCV/RISCVCallingConv.cpp b/llvm/lib/Target/RISCV/RISCVCallingConv.cpp index c4c3475bd0515..872a879dcf9c4 100644 --- a/llvm/lib/Target/RISCV/RISCVCallingConv.cpp +++ b/llvm/lib/Target/RISCV/RISCVCallingConv.cpp @@ -405,12 +405,11 @@ static bool CC_RISCV_Impl(unsigned ValNo, MVT ValVT, MVT LocVT, ValNo > 1) return true; - // UseGPRForF16_F32 if targeting one of the soft-float ABIs, if passing a - // variadic argument, or if no F16/F32 argument registers are available. - bool UseGPRForF16_F32 = true; - // UseGPRForF64 if targeting soft-float ABIs or an FLEN=32 ABI, if passing a - // variadic argument, or if no F64 argument registers are available. - bool UseGPRForF64 = true; + // AllowFPRForF16_F32 if targeting an FLEN>=32 ABI and the argument isn't + // variadic. + bool AllowFPRForF16_F32 = false; + // UseFPRForF64 if targeting an FLEN>=64 ABI and the argument isn't variadic. + bool AllowFPRForF64 = false; RISCVABI::ABI ABI = Subtarget.getTargetABI(); switch (ABI) { @@ -421,32 +420,31 @@ static bool CC_RISCV_Impl(unsigned ValNo, MVT ValVT, MVT LocVT, case RISCVABI::ABI_LP64: case RISCVABI::ABI_LP64E: break; - case RISCVABI::ABI_ILP32F: - case RISCVABI::ABI_LP64F: - UseGPRForF16_F32 = ArgFlags.isVarArg(); - break; case RISCVABI::ABI_ILP32D: case RISCVABI::ABI_LP64D: - UseGPRForF16_F32 = ArgFlags.isVarArg(); - UseGPRForF64 = ArgFlags.isVarArg(); + AllowFPRForF64 = !ArgFlags.isVarArg(); + [[fallthrough]]; + case RISCVABI::ABI_ILP32F: + case RISCVABI::ABI_LP64F: + AllowFPRForF16_F32 = !ArgFlags.isVarArg(); break; } - if ((LocVT == MVT::f16 || LocVT == MVT::bf16) && !UseGPRForF16_F32) { + if ((LocVT == MVT::f16 || LocVT == MVT::bf16) && AllowFPRForF16_F32) { if (MCRegister Reg = State.AllocateReg(ArgFPR16s)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } - if (LocVT == MVT::f32 && !UseGPRForF16_F32) { + if (LocVT == MVT::f32 && AllowFPRForF16_F32) { if (MCRegister Reg = State.AllocateReg(ArgFPR32s)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false; } } - if (LocVT == MVT::f64 && !UseGPRForF64) { + if (LocVT == MVT::f64 && AllowFPRForF64) { if (MCRegister Reg = State.AllocateReg(ArgFPR64s)) { State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); return false;