@@ -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
+ 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,15 @@ 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>(), TypeList};
548
542
RISCVIncomingValueAssigner Assigner (
549
543
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
550
- /* IsRet=*/ false );
544
+ /* IsRet=*/ false , Dispatcher );
551
545
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
552
546
553
547
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -585,11 +579,13 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
585
579
586
580
SmallVector<ArgInfo, 32 > SplitArgInfos;
587
581
SmallVector<ISD::OutputArg, 8 > Outs;
582
+ SmallVector<Type *, 4 > TypeList;
588
583
for (auto &AInfo : Info.OrigArgs ) {
589
584
// Handle any required unmerging of split value types from a given VReg into
590
585
// physical registers. ArgInfo objects are constructed correspondingly and
591
586
// appended to SplitArgInfos.
592
587
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
588
+ TypeList.push_back (AInfo.Ty );
593
589
}
594
590
595
591
// TODO: Support tail calls.
@@ -607,9 +603,10 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607
603
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
608
604
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
609
605
606
+ RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
610
607
RISCVOutgoingValueAssigner ArgAssigner (
611
608
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
612
- /* IsRet=*/ false );
609
+ /* IsRet=*/ false , ArgDispatcher );
613
610
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
614
611
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
615
612
MIRBuilder, CC, Info.IsVarArg ))
@@ -637,9 +634,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
637
634
SmallVector<ArgInfo, 4 > SplitRetInfos;
638
635
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
639
636
637
+ RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
638
+ F.getReturnType ()};
640
639
RISCVIncomingValueAssigner RetAssigner (
641
640
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
642
- /* IsRet=*/ true );
641
+ /* IsRet=*/ true , RetDispatcher );
643
642
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
644
643
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
645
644
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments