@@ -19122,17 +19122,16 @@ static bool CC_RISCVAssign2XLen(unsigned XLen, CCState &State, CCValAssign VA1,
19122
19122
return false;
19123
19123
}
19124
19124
19125
- static MCRegister allocateRVVReg(MVT ValVT, unsigned ValNo,
19126
- std::optional<unsigned> FirstMaskArgument,
19127
- CCState &State,
19125
+ static MCRegister allocateRVVReg(MVT ValVT, unsigned ValNo, CCState &State,
19128
19126
const RISCVTargetLowering &TLI) {
19129
19127
const TargetRegisterClass *RC = TLI.getRegClassFor(ValVT);
19130
19128
if (RC == &RISCV::VRRegClass) {
19131
19129
// Assign the first mask argument to V0.
19132
19130
// This is an interim calling convention and it may be changed in the
19133
19131
// future.
19134
- if (FirstMaskArgument && ValNo == *FirstMaskArgument)
19135
- return State.AllocateReg(RISCV::V0);
19132
+ if (ValVT.getVectorElementType() == MVT::i1)
19133
+ if (MCRegister Reg = State.AllocateReg(RISCV::V0))
19134
+ return Reg;
19136
19135
return State.AllocateReg(ArgVRs);
19137
19136
}
19138
19137
if (RC == &RISCV::VRM2RegClass)
@@ -19170,8 +19169,7 @@ static MCRegister allocateRVVReg(MVT ValVT, unsigned ValNo,
19170
19169
bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19171
19170
MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo,
19172
19171
ISD::ArgFlagsTy ArgFlags, CCState &State, bool IsFixed,
19173
- bool IsRet, Type *OrigTy, const RISCVTargetLowering &TLI,
19174
- std::optional<unsigned> FirstMaskArgument) {
19172
+ bool IsRet, Type *OrigTy, const RISCVTargetLowering &TLI) {
19175
19173
unsigned XLen = DL.getLargestLegalIntTypeSizeInBits();
19176
19174
assert(XLen == 32 || XLen == 64);
19177
19175
MVT XLenVT = XLen == 32 ? MVT::i32 : MVT::i64;
@@ -19351,7 +19349,7 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19351
19349
else if (ValVT == MVT::f64 && !UseGPRForF64)
19352
19350
Reg = State.AllocateReg(ArgFPR64s);
19353
19351
else if (ValVT.isVector() || ValVT.isRISCVVectorTuple()) {
19354
- Reg = allocateRVVReg(ValVT, ValNo, FirstMaskArgument, State, TLI);
19352
+ Reg = allocateRVVReg(ValVT, ValNo, State, TLI);
19355
19353
if (!Reg) {
19356
19354
// For return values, the vector must be passed fully via registers or
19357
19355
// via the stack.
@@ -19421,27 +19419,13 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19421
19419
return false;
19422
19420
}
19423
19421
19424
- template <typename ArgTy>
19425
- static std::optional<unsigned> preAssignMask(const ArgTy &Args) {
19426
- for (const auto &ArgIdx : enumerate(Args)) {
19427
- MVT ArgVT = ArgIdx.value().VT;
19428
- if (ArgVT.isVector() && ArgVT.getVectorElementType() == MVT::i1)
19429
- return ArgIdx.index();
19430
- }
19431
- return std::nullopt;
19432
- }
19433
-
19434
19422
void RISCVTargetLowering::analyzeInputArgs(
19435
19423
MachineFunction &MF, CCState &CCInfo,
19436
19424
const SmallVectorImpl<ISD::InputArg> &Ins, bool IsRet,
19437
19425
RISCVCCAssignFn Fn) const {
19438
19426
unsigned NumArgs = Ins.size();
19439
19427
FunctionType *FType = MF.getFunction().getFunctionType();
19440
19428
19441
- std::optional<unsigned> FirstMaskArgument;
19442
- if (Subtarget.hasVInstructions())
19443
- FirstMaskArgument = preAssignMask(Ins);
19444
-
19445
19429
for (unsigned i = 0; i != NumArgs; ++i) {
19446
19430
MVT ArgVT = Ins[i].VT;
19447
19431
ISD::ArgFlagsTy ArgFlags = Ins[i].Flags;
@@ -19454,8 +19438,7 @@ void RISCVTargetLowering::analyzeInputArgs(
19454
19438
19455
19439
RISCVABI::ABI ABI = MF.getSubtarget<RISCVSubtarget>().getTargetABI();
19456
19440
if (Fn(MF.getDataLayout(), ABI, i, ArgVT, ArgVT, CCValAssign::Full,
19457
- ArgFlags, CCInfo, /*IsFixed=*/true, IsRet, ArgTy, *this,
19458
- FirstMaskArgument)) {
19441
+ ArgFlags, CCInfo, /*IsFixed=*/true, IsRet, ArgTy, *this)) {
19459
19442
LLVM_DEBUG(dbgs() << "InputArg #" << i << " has unhandled type "
19460
19443
<< ArgVT << '\n');
19461
19444
llvm_unreachable(nullptr);
@@ -19469,19 +19452,14 @@ void RISCVTargetLowering::analyzeOutputArgs(
19469
19452
CallLoweringInfo *CLI, RISCVCCAssignFn Fn) const {
19470
19453
unsigned NumArgs = Outs.size();
19471
19454
19472
- std::optional<unsigned> FirstMaskArgument;
19473
- if (Subtarget.hasVInstructions())
19474
- FirstMaskArgument = preAssignMask(Outs);
19475
-
19476
19455
for (unsigned i = 0; i != NumArgs; i++) {
19477
19456
MVT ArgVT = Outs[i].VT;
19478
19457
ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
19479
19458
Type *OrigTy = CLI ? CLI->getArgs()[Outs[i].OrigArgIndex].Ty : nullptr;
19480
19459
19481
19460
RISCVABI::ABI ABI = MF.getSubtarget<RISCVSubtarget>().getTargetABI();
19482
19461
if (Fn(MF.getDataLayout(), ABI, i, ArgVT, ArgVT, CCValAssign::Full,
19483
- ArgFlags, CCInfo, Outs[i].IsFixed, IsRet, OrigTy, *this,
19484
- FirstMaskArgument)) {
19462
+ ArgFlags, CCInfo, Outs[i].IsFixed, IsRet, OrigTy, *this)) {
19485
19463
LLVM_DEBUG(dbgs() << "OutputArg #" << i << " has unhandled type "
19486
19464
<< ArgVT << "\n");
19487
19465
llvm_unreachable(nullptr);
@@ -19659,8 +19637,7 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
19659
19637
CCValAssign::LocInfo LocInfo,
19660
19638
ISD::ArgFlagsTy ArgFlags, CCState &State,
19661
19639
bool IsFixed, bool IsRet, Type *OrigTy,
19662
- const RISCVTargetLowering &TLI,
19663
- std::optional<unsigned> FirstMaskArgument) {
19640
+ const RISCVTargetLowering &TLI) {
19664
19641
if (LocVT == MVT::i32 || LocVT == MVT::i64) {
19665
19642
if (MCRegister Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19666
19643
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
@@ -19744,8 +19721,7 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
19744
19721
}
19745
19722
19746
19723
if (LocVT.isVector()) {
19747
- if (MCRegister Reg =
19748
- allocateRVVReg(ValVT, ValNo, FirstMaskArgument, State, TLI)) {
19724
+ if (MCRegister Reg = allocateRVVReg(ValVT, ValNo, State, TLI)) {
19749
19725
// Fixed-length vectors are located in the corresponding scalable-vector
19750
19726
// container types.
19751
19727
if (ValVT.isFixedLengthVector())
@@ -20377,17 +20353,13 @@ bool RISCVTargetLowering::CanLowerReturn(
20377
20353
SmallVector<CCValAssign, 16> RVLocs;
20378
20354
CCState CCInfo(CallConv, IsVarArg, MF, RVLocs, Context);
20379
20355
20380
- std::optional<unsigned> FirstMaskArgument;
20381
- if (Subtarget.hasVInstructions())
20382
- FirstMaskArgument = preAssignMask(Outs);
20383
-
20384
20356
for (unsigned i = 0, e = Outs.size(); i != e; ++i) {
20385
20357
MVT VT = Outs[i].VT;
20386
20358
ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;
20387
20359
RISCVABI::ABI ABI = MF.getSubtarget<RISCVSubtarget>().getTargetABI();
20388
20360
if (RISCV::CC_RISCV(MF.getDataLayout(), ABI, i, VT, VT, CCValAssign::Full,
20389
20361
ArgFlags, CCInfo, /*IsFixed=*/true, /*IsRet=*/true,
20390
- nullptr, *this, FirstMaskArgument ))
20362
+ nullptr, *this))
20391
20363
return false;
20392
20364
}
20393
20365
return true;
0 commit comments