@@ -34,14 +34,15 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
34
34
// Whether this is assigning args for a return.
35
35
bool IsRet;
36
36
37
- // true if assignArg has been called for a mask argument, false otherwise.
38
- bool AssignedFirstMaskArg = false ;
37
+ RVVArgDispatcher RVVDispatcher;
39
38
40
39
public:
41
40
RISCVOutgoingValueAssigner (
42
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
41
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
42
+ RVVArgDispatcher &RVVDispatcher)
43
43
: CallLowering::OutgoingValueAssigner(nullptr ),
44
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
44
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
45
+ RVVDispatcher(RVVDispatcher) {}
45
46
46
47
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
47
48
CCValAssign::LocInfo LocInfo,
@@ -51,16 +52,9 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
51
52
const DataLayout &DL = MF.getDataLayout ();
52
53
const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
53
54
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
-
61
55
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
62
56
LocInfo, Flags, State, Info.IsFixed , IsRet, Info.Ty ,
63
- *Subtarget.getTargetLowering (), FirstMaskArgument ))
57
+ *Subtarget.getTargetLowering (), RVVDispatcher ))
64
58
return true ;
65
59
66
60
StackSize = State.getStackSize ();
@@ -181,14 +175,15 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
181
175
// Whether this is assigning args from a return.
182
176
bool IsRet;
183
177
184
- // true if assignArg has been called for a mask argument, false otherwise.
185
- bool AssignedFirstMaskArg = false ;
178
+ RVVArgDispatcher &RVVDispatcher;
186
179
187
180
public:
188
181
RISCVIncomingValueAssigner (
189
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
182
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
183
+ RVVArgDispatcher &RVVDispatcher)
190
184
: CallLowering::IncomingValueAssigner(nullptr ),
191
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
185
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
186
+ RVVDispatcher(RVVDispatcher) {}
192
187
193
188
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
194
189
CCValAssign::LocInfo LocInfo,
@@ -201,16 +196,9 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
201
196
if (LocVT.isScalableVector ())
202
197
MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
203
198
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
-
211
199
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
212
200
LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
213
- *Subtarget.getTargetLowering (), FirstMaskArgument ))
201
+ *Subtarget.getTargetLowering (), RVVDispatcher ))
214
202
return true ;
215
203
216
204
StackSize = State.getStackSize ();
@@ -420,9 +408,10 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
420
408
SmallVector<ArgInfo, 4 > SplitRetInfos;
421
409
splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
422
410
411
+ RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), true };
423
412
RISCVOutgoingValueAssigner Assigner (
424
413
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
425
- /* IsRet=*/ true );
414
+ /* IsRet=*/ true , Dispatcher );
426
415
RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
427
416
return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
428
417
MIRBuilder, CC, F.isVarArg ());
@@ -545,9 +534,10 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
545
534
++Index;
546
535
}
547
536
537
+ RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), false };
548
538
RISCVIncomingValueAssigner Assigner (
549
539
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
550
- /* IsRet=*/ false );
540
+ /* IsRet=*/ false , Dispatcher );
551
541
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
552
542
553
543
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -607,9 +597,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607
597
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
608
598
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
609
599
600
+ RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), false ,
601
+ nullptr , &Info};
610
602
RISCVOutgoingValueAssigner ArgAssigner (
611
603
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
612
- /* IsRet=*/ false );
604
+ /* IsRet=*/ false , ArgDispatcher );
613
605
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
614
606
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
615
607
MIRBuilder, CC, Info.IsVarArg ))
@@ -637,9 +629,10 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
637
629
SmallVector<ArgInfo, 4 > SplitRetInfos;
638
630
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
639
631
632
+ RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(), true };
640
633
RISCVIncomingValueAssigner RetAssigner (
641
634
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
642
- /* IsRet=*/ true );
635
+ /* IsRet=*/ true , RetDispatcher );
643
636
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
644
637
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
645
638
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments