@@ -35,15 +35,14 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
35
35
// Whether this is assigning args for a return.
36
36
bool IsRet;
37
37
38
- RVVArgDispatcher &RVVDispatcher;
38
+ // true if assignArg has been called for a mask argument, false otherwise.
39
+ bool AssignedFirstMaskArg = false ;
39
40
40
41
public:
41
42
RISCVOutgoingValueAssigner (
42
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
43
- RVVArgDispatcher &RVVDispatcher)
43
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
44
44
: CallLowering::OutgoingValueAssigner(nullptr ),
45
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
46
- RVVDispatcher(RVVDispatcher) {}
45
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
47
46
48
47
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
49
48
CCValAssign::LocInfo LocInfo,
@@ -53,9 +52,16 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
53
52
const DataLayout &DL = MF.getDataLayout ();
54
53
const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
55
54
55
+ std::optional<unsigned > FirstMaskArgument;
56
+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
57
+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
58
+ FirstMaskArgument = ValNo;
59
+ AssignedFirstMaskArg = true ;
60
+ }
61
+
56
62
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
57
63
LocInfo, Flags, State, Info.IsFixed , IsRet, Info.Ty ,
58
- *Subtarget.getTargetLowering (), RVVDispatcher ))
64
+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
59
65
return true ;
60
66
61
67
StackSize = State.getStackSize ();
@@ -181,15 +187,14 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
181
187
// Whether this is assigning args from a return.
182
188
bool IsRet;
183
189
184
- RVVArgDispatcher &RVVDispatcher;
190
+ // true if assignArg has been called for a mask argument, false otherwise.
191
+ bool AssignedFirstMaskArg = false ;
185
192
186
193
public:
187
194
RISCVIncomingValueAssigner (
188
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
189
- RVVArgDispatcher &RVVDispatcher)
195
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
190
196
: CallLowering::IncomingValueAssigner(nullptr ),
191
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
192
- RVVDispatcher(RVVDispatcher) {}
197
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
193
198
194
199
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
195
200
CCValAssign::LocInfo LocInfo,
@@ -202,9 +207,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
202
207
if (LocVT.isScalableVector ())
203
208
MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
204
209
210
+ std::optional<unsigned > FirstMaskArgument;
211
+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
212
+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
213
+ FirstMaskArgument = ValNo;
214
+ AssignedFirstMaskArg = true ;
215
+ }
216
+
205
217
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
206
218
LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
207
- *Subtarget.getTargetLowering (), RVVDispatcher ))
219
+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
208
220
return true ;
209
221
210
222
StackSize = State.getStackSize ();
@@ -409,11 +421,9 @@ bool RISCVCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
409
421
SmallVector<ArgInfo, 4 > SplitRetInfos;
410
422
splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
411
423
412
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
413
- ArrayRef (F.getReturnType ())};
414
424
RISCVOutgoingValueAssigner Assigner (
415
425
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
416
- /* IsRet=*/ true , Dispatcher );
426
+ /* IsRet=*/ true );
417
427
RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
418
428
if (!determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
419
429
MIRBuilder, CC, F.isVarArg ()))
@@ -433,16 +443,24 @@ bool RISCVCallLowering::canLowerReturn(MachineFunction &MF,
433
443
CCState CCInfo (CallConv, IsVarArg, MF, ArgLocs,
434
444
MF.getFunction ().getContext ());
435
445
436
- RVVArgDispatcher Dispatcher{&MF, &TLI,
437
- ArrayRef (MF.getFunction ().getReturnType ())};
438
-
439
446
RISCVABI::ABI ABI = MF.getSubtarget <RISCVSubtarget>().getTargetABI ();
447
+ const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
448
+
449
+ std::optional<unsigned > FirstMaskArgument = std::nullopt;
450
+ // Preassign the first mask argument.
451
+ if (Subtarget.hasVInstructions ()) {
452
+ for (const auto &ArgIdx : enumerate(Outs)) {
453
+ MVT ArgVT = MVT::getVT (ArgIdx.value ().Ty );
454
+ if (ArgVT.isVector () && ArgVT.getVectorElementType () == MVT::i1)
455
+ FirstMaskArgument = ArgIdx.index ();
456
+ }
457
+ }
440
458
441
459
for (unsigned I = 0 , E = Outs.size (); I < E; ++I) {
442
460
MVT VT = MVT::getVT (Outs[I].Ty );
443
461
if (RISCV::CC_RISCV (MF.getDataLayout (), ABI, I, VT, VT, CCValAssign::Full,
444
462
Outs[I].Flags [0 ], CCInfo, /* IsFixed=*/ true ,
445
- /* isRet=*/ true , nullptr , TLI, Dispatcher ))
463
+ /* isRet=*/ true , nullptr , TLI, FirstMaskArgument ))
446
464
return false ;
447
465
}
448
466
return true ;
@@ -552,16 +570,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
552
570
// correspondingly and appended to SplitArgInfos.
553
571
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
554
572
555
- TypeList.push_back (Arg.getType ());
556
-
557
573
++Index;
558
574
}
559
575
560
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
561
- ArrayRef (TypeList)};
562
576
RISCVIncomingValueAssigner Assigner (
563
577
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
564
- /* IsRet=*/ false , Dispatcher );
578
+ /* IsRet=*/ false );
565
579
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
566
580
567
581
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -599,13 +613,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
599
613
600
614
SmallVector<ArgInfo, 32 > SplitArgInfos;
601
615
SmallVector<ISD::OutputArg, 8 > Outs;
602
- SmallVector<Type *, 4 > TypeList;
603
616
for (auto &AInfo : Info.OrigArgs ) {
604
617
// Handle any required unmerging of split value types from a given VReg into
605
618
// physical registers. ArgInfo objects are constructed correspondingly and
606
619
// appended to SplitArgInfos.
607
620
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
608
- TypeList.push_back (AInfo.Ty );
609
621
}
610
622
611
623
// TODO: Support tail calls.
@@ -623,11 +635,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
623
635
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
624
636
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
625
637
626
- RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(),
627
- ArrayRef (TypeList)};
628
638
RISCVOutgoingValueAssigner ArgAssigner (
629
639
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
630
- /* IsRet=*/ false , ArgDispatcher );
640
+ /* IsRet=*/ false );
631
641
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
632
642
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
633
643
MIRBuilder, CC, Info.IsVarArg ))
@@ -653,11 +663,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
653
663
SmallVector<ArgInfo, 4 > SplitRetInfos;
654
664
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
655
665
656
- RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
657
- ArrayRef (F.getReturnType ())};
658
666
RISCVIncomingValueAssigner RetAssigner (
659
667
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
660
- /* IsRet=*/ true , RetDispatcher );
668
+ /* IsRet=*/ true );
661
669
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
662
670
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
663
671
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments