@@ -34,15 +34,14 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
3434 // Whether this is assigning args for a return.
3535 bool IsRet;
3636
37- RVVArgDispatcher &RVVDispatcher;
37+ // true if assignArg has been called for a mask argument, false otherwise.
38+ bool AssignedFirstMaskArg = false ;
3839
3940public:
4041 RISCVOutgoingValueAssigner (
41- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
42- RVVArgDispatcher &RVVDispatcher)
42+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
4343 : CallLowering::OutgoingValueAssigner(nullptr ),
44- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
45- RVVDispatcher(RVVDispatcher) {}
44+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
4645
4746 bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
4847 CCValAssign::LocInfo LocInfo,
@@ -52,9 +51,16 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
5251 const DataLayout &DL = MF.getDataLayout ();
5352 const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
5453
54+ std::optional<unsigned > FirstMaskArgument;
55+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
56+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
57+ FirstMaskArgument = ValNo;
58+ AssignedFirstMaskArg = true ;
59+ }
60+
5561 if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
5662 LocInfo, Flags, State, Info.IsFixed , IsRet, Info.Ty ,
57- *Subtarget.getTargetLowering (), RVVDispatcher ))
63+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
5864 return true ;
5965
6066 StackSize = State.getStackSize ();
@@ -180,15 +186,14 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
180186 // Whether this is assigning args from a return.
181187 bool IsRet;
182188
183- RVVArgDispatcher &RVVDispatcher;
189+ // true if assignArg has been called for a mask argument, false otherwise.
190+ bool AssignedFirstMaskArg = false ;
184191
185192public:
186193 RISCVIncomingValueAssigner (
187- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
188- RVVArgDispatcher &RVVDispatcher)
194+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
189195 : CallLowering::IncomingValueAssigner(nullptr ),
190- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
191- RVVDispatcher(RVVDispatcher) {}
196+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
192197
193198 bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
194199 CCValAssign::LocInfo LocInfo,
@@ -201,9 +206,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
201206 if (LocVT.isScalableVector ())
202207 MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
203208
209+ std::optional<unsigned > FirstMaskArgument;
210+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
211+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
212+ FirstMaskArgument = ValNo;
213+ AssignedFirstMaskArg = true ;
214+ }
215+
204216 if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
205217 LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
206- *Subtarget.getTargetLowering (), RVVDispatcher ))
218+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
207219 return true ;
208220
209221 StackSize = State.getStackSize ();
@@ -411,11 +423,9 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
411423 SmallVector<ArgInfo, 4 > SplitRetInfos;
412424 splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
413425
414- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
415- ArrayRef (F.getReturnType ())};
416426 RISCVOutgoingValueAssigner Assigner (
417427 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
418- /* IsRet=*/ true , Dispatcher );
428+ /* IsRet=*/ true );
419429 RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
420430 return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
421431 MIRBuilder, CC, F.isVarArg ());
@@ -524,7 +534,6 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
524534 CallingConv::ID CC = F.getCallingConv ();
525535
526536 SmallVector<ArgInfo, 32 > SplitArgInfos;
527- SmallVector<Type *, 4 > TypeList;
528537 unsigned Index = 0 ;
529538 for (auto &Arg : F.args ()) {
530539 // Construct the ArgInfo object from destination register and argument type.
@@ -536,16 +545,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
536545 // correspondingly and appended to SplitArgInfos.
537546 splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
538547
539- TypeList.push_back (Arg.getType ());
540-
541548 ++Index;
542549 }
543550
544- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
545- ArrayRef (TypeList)};
546551 RISCVIncomingValueAssigner Assigner (
547552 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
548- /* IsRet=*/ false , Dispatcher );
553+ /* IsRet=*/ false );
549554 RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
550555
551556 SmallVector<CCValAssign, 16 > ArgLocs;
@@ -583,13 +588,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
583588
584589 SmallVector<ArgInfo, 32 > SplitArgInfos;
585590 SmallVector<ISD::OutputArg, 8 > Outs;
586- SmallVector<Type *, 4 > TypeList;
587591 for (auto &AInfo : Info.OrigArgs ) {
588592 // Handle any required unmerging of split value types from a given VReg into
589593 // physical registers. ArgInfo objects are constructed correspondingly and
590594 // appended to SplitArgInfos.
591595 splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
592- TypeList.push_back (AInfo.Ty );
593596 }
594597
595598 // TODO: Support tail calls.
@@ -607,11 +610,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607610 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
608611 Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
609612
610- RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(),
611- ArrayRef (TypeList)};
612613 RISCVOutgoingValueAssigner ArgAssigner (
613614 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
614- /* IsRet=*/ false , ArgDispatcher );
615+ /* IsRet=*/ false );
615616 RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
616617 if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
617618 MIRBuilder, CC, Info.IsVarArg ))
@@ -639,11 +640,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
639640 SmallVector<ArgInfo, 4 > SplitRetInfos;
640641 splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
641642
642- RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
643- ArrayRef (F.getReturnType ())};
644643 RISCVIncomingValueAssigner RetAssigner (
645644 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
646- /* IsRet=*/ true , RetDispatcher );
645+ /* IsRet=*/ true );
647646 RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
648647 if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
649648 MIRBuilder, CC, Info.IsVarArg ))
0 commit comments