@@ -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 ();
@@ -175,15 +181,14 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
175181 // Whether this is assigning args from a return.
176182 bool IsRet;
177183
178- RVVArgDispatcher &RVVDispatcher;
184+ // true if assignArg has been called for a mask argument, false otherwise.
185+ bool AssignedFirstMaskArg = false ;
179186
180187public:
181188 RISCVIncomingValueAssigner (
182- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
183- RVVArgDispatcher &RVVDispatcher)
189+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
184190 : CallLowering::IncomingValueAssigner(nullptr ),
185- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
186- RVVDispatcher(RVVDispatcher) {}
191+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
187192
188193 bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
189194 CCValAssign::LocInfo LocInfo,
@@ -196,9 +201,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
196201 if (LocVT.isScalableVector ())
197202 MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
198203
204+ std::optional<unsigned > FirstMaskArgument;
205+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
206+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
207+ FirstMaskArgument = ValNo;
208+ AssignedFirstMaskArg = true ;
209+ }
210+
199211 if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
200212 LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
201- *Subtarget.getTargetLowering (), RVVDispatcher ))
213+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
202214 return true ;
203215
204216 StackSize = State.getStackSize ();
@@ -408,11 +420,9 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
408420 SmallVector<ArgInfo, 4 > SplitRetInfos;
409421 splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
410422
411- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
412- F.getReturnType ()};
413423 RISCVOutgoingValueAssigner Assigner (
414424 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
415- /* IsRet=*/ true , Dispatcher );
425+ /* IsRet=*/ true );
416426 RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
417427 return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
418428 MIRBuilder, CC, F.isVarArg ());
@@ -521,7 +531,6 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
521531 CallingConv::ID CC = F.getCallingConv ();
522532
523533 SmallVector<ArgInfo, 32 > SplitArgInfos;
524- SmallVector<Type *, 4 > TypeList;
525534 unsigned Index = 0 ;
526535 for (auto &Arg : F.args ()) {
527536 // Construct the ArgInfo object from destination register and argument type.
@@ -533,15 +542,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
533542 // correspondingly and appended to SplitArgInfos.
534543 splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
535544
536- TypeList.push_back (Arg.getType ());
537-
538545 ++Index;
539546 }
540547
541- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
542548 RISCVIncomingValueAssigner Assigner (
543549 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
544- /* IsRet=*/ false , Dispatcher );
550+ /* IsRet=*/ false );
545551 RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
546552
547553 SmallVector<CCValAssign, 16 > ArgLocs;
@@ -579,13 +585,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
579585
580586 SmallVector<ArgInfo, 32 > SplitArgInfos;
581587 SmallVector<ISD::OutputArg, 8 > Outs;
582- SmallVector<Type *, 4 > TypeList;
583588 for (auto &AInfo : Info.OrigArgs ) {
584589 // Handle any required unmerging of split value types from a given VReg into
585590 // physical registers. ArgInfo objects are constructed correspondingly and
586591 // appended to SplitArgInfos.
587592 splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
588- TypeList.push_back (AInfo.Ty );
589593 }
590594
591595 // TODO: Support tail calls.
@@ -603,10 +607,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
603607 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
604608 Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
605609
606- RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
607610 RISCVOutgoingValueAssigner ArgAssigner (
608611 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
609- /* IsRet=*/ false , ArgDispatcher );
612+ /* IsRet=*/ false );
610613 RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
611614 if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
612615 MIRBuilder, CC, Info.IsVarArg ))
@@ -634,11 +637,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
634637 SmallVector<ArgInfo, 4 > SplitRetInfos;
635638 splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
636639
637- RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
638- F.getReturnType ()};
639640 RISCVIncomingValueAssigner RetAssigner (
640641 CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
641- /* IsRet=*/ true , RetDispatcher );
642+ /* IsRet=*/ true );
642643 RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
643644 if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
644645 MIRBuilder, CC, Info.IsVarArg ))
0 commit comments