@@ -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,11 @@ 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>(),
412
+ ArrayRef (F.getReturnType ())};
423
413
RISCVOutgoingValueAssigner Assigner (
424
414
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
425
- /* IsRet=*/ true );
415
+ /* IsRet=*/ true , Dispatcher );
426
416
RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
427
417
return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
428
418
MIRBuilder, CC, F.isVarArg ());
@@ -531,6 +521,7 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
531
521
CallingConv::ID CC = F.getCallingConv ();
532
522
533
523
SmallVector<ArgInfo, 32 > SplitArgInfos;
524
+ SmallVector<Type *, 4 > TypeList;
534
525
unsigned Index = 0 ;
535
526
for (auto &Arg : F.args ()) {
536
527
// Construct the ArgInfo object from destination register and argument type.
@@ -542,12 +533,16 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
542
533
// correspondingly and appended to SplitArgInfos.
543
534
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
544
535
536
+ TypeList.push_back (Arg.getType ());
537
+
545
538
++Index;
546
539
}
547
540
541
+ RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
542
+ ArrayRef (TypeList)};
548
543
RISCVIncomingValueAssigner Assigner (
549
544
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
550
- /* IsRet=*/ false );
545
+ /* IsRet=*/ false , Dispatcher );
551
546
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
552
547
553
548
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -585,11 +580,13 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
585
580
586
581
SmallVector<ArgInfo, 32 > SplitArgInfos;
587
582
SmallVector<ISD::OutputArg, 8 > Outs;
583
+ SmallVector<Type *, 4 > TypeList;
588
584
for (auto &AInfo : Info.OrigArgs ) {
589
585
// Handle any required unmerging of split value types from a given VReg into
590
586
// physical registers. ArgInfo objects are constructed correspondingly and
591
587
// appended to SplitArgInfos.
592
588
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
589
+ TypeList.push_back (AInfo.Ty );
593
590
}
594
591
595
592
// TODO: Support tail calls.
@@ -607,9 +604,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607
604
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
608
605
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
609
606
607
+ RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(),
608
+ ArrayRef (TypeList)};
610
609
RISCVOutgoingValueAssigner ArgAssigner (
611
610
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
612
- /* IsRet=*/ false );
611
+ /* IsRet=*/ false , ArgDispatcher );
613
612
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
614
613
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
615
614
MIRBuilder, CC, Info.IsVarArg ))
@@ -637,9 +636,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
637
636
SmallVector<ArgInfo, 4 > SplitRetInfos;
638
637
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
639
638
639
+ RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
640
+ ArrayRef (F.getReturnType ())};
640
641
RISCVIncomingValueAssigner RetAssigner (
641
642
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
642
- /* IsRet=*/ true );
643
+ /* IsRet=*/ true , RetDispatcher );
643
644
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
644
645
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
645
646
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments