@@ -34,15 +34,14 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
34
34
// Whether this is assigning args for a return.
35
35
bool IsRet;
36
36
37
- RVVArgDispatcher &RVVDispatcher;
37
+ // true if assignArg has been called for a mask argument, false otherwise.
38
+ bool AssignedFirstMaskArg = false ;
38
39
39
40
public:
40
41
RISCVOutgoingValueAssigner (
41
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
42
- RVVArgDispatcher &RVVDispatcher)
42
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
43
43
: CallLowering::OutgoingValueAssigner(nullptr ),
44
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
45
- RVVDispatcher(RVVDispatcher) {}
44
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
46
45
47
46
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
48
47
CCValAssign::LocInfo LocInfo,
@@ -52,9 +51,16 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
52
51
const DataLayout &DL = MF.getDataLayout ();
53
52
const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
54
53
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
+
55
61
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
56
62
LocInfo, Flags, State, Info.IsFixed , IsRet, Info.Ty ,
57
- *Subtarget.getTargetLowering (), RVVDispatcher ))
63
+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
58
64
return true ;
59
65
60
66
StackSize = State.getStackSize ();
@@ -180,15 +186,14 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
180
186
// Whether this is assigning args from a return.
181
187
bool IsRet;
182
188
183
- RVVArgDispatcher &RVVDispatcher;
189
+ // true if assignArg has been called for a mask argument, false otherwise.
190
+ bool AssignedFirstMaskArg = false ;
184
191
185
192
public:
186
193
RISCVIncomingValueAssigner (
187
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
188
- RVVArgDispatcher &RVVDispatcher)
194
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
189
195
: CallLowering::IncomingValueAssigner(nullptr ),
190
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
191
- RVVDispatcher(RVVDispatcher) {}
196
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
192
197
193
198
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
194
199
CCValAssign::LocInfo LocInfo,
@@ -201,9 +206,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
201
206
if (LocVT.isScalableVector ())
202
207
MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
203
208
209
+ std::optional<unsigned > FirstMaskArgument;
210
+ if (Subtarget.hasVInstructions () && !AssignedFirstMaskArg &&
211
+ ValVT.isVector () && ValVT.getVectorElementType () == MVT::i1) {
212
+ FirstMaskArgument = ValNo;
213
+ AssignedFirstMaskArg = true ;
214
+ }
215
+
204
216
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
205
217
LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
206
- *Subtarget.getTargetLowering (), RVVDispatcher ))
218
+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
207
219
return true ;
208
220
209
221
StackSize = State.getStackSize ();
@@ -411,11 +423,9 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
411
423
SmallVector<ArgInfo, 4 > SplitRetInfos;
412
424
splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
413
425
414
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
415
- ArrayRef (F.getReturnType ())};
416
426
RISCVOutgoingValueAssigner Assigner (
417
427
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
418
- /* IsRet=*/ true , Dispatcher );
428
+ /* IsRet=*/ true );
419
429
RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
420
430
return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
421
431
MIRBuilder, CC, F.isVarArg ());
@@ -524,7 +534,6 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
524
534
CallingConv::ID CC = F.getCallingConv ();
525
535
526
536
SmallVector<ArgInfo, 32 > SplitArgInfos;
527
- SmallVector<Type *, 4 > TypeList;
528
537
unsigned Index = 0 ;
529
538
for (auto &Arg : F.args ()) {
530
539
// Construct the ArgInfo object from destination register and argument type.
@@ -536,16 +545,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
536
545
// correspondingly and appended to SplitArgInfos.
537
546
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
538
547
539
- TypeList.push_back (Arg.getType ());
540
-
541
548
++Index;
542
549
}
543
550
544
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
545
- ArrayRef (TypeList)};
546
551
RISCVIncomingValueAssigner Assigner (
547
552
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
548
- /* IsRet=*/ false , Dispatcher );
553
+ /* IsRet=*/ false );
549
554
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
550
555
551
556
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -583,13 +588,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
583
588
584
589
SmallVector<ArgInfo, 32 > SplitArgInfos;
585
590
SmallVector<ISD::OutputArg, 8 > Outs;
586
- SmallVector<Type *, 4 > TypeList;
587
591
for (auto &AInfo : Info.OrigArgs ) {
588
592
// Handle any required unmerging of split value types from a given VReg into
589
593
// physical registers. ArgInfo objects are constructed correspondingly and
590
594
// appended to SplitArgInfos.
591
595
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
592
- TypeList.push_back (AInfo.Ty );
593
596
}
594
597
595
598
// TODO: Support tail calls.
@@ -607,11 +610,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607
610
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
608
611
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
609
612
610
- RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(),
611
- ArrayRef (TypeList)};
612
613
RISCVOutgoingValueAssigner ArgAssigner (
613
614
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
614
- /* IsRet=*/ false , ArgDispatcher );
615
+ /* IsRet=*/ false );
615
616
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
616
617
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
617
618
MIRBuilder, CC, Info.IsVarArg ))
@@ -639,11 +640,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
639
640
SmallVector<ArgInfo, 4 > SplitRetInfos;
640
641
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
641
642
642
- RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
643
- ArrayRef (F.getReturnType ())};
644
643
RISCVIncomingValueAssigner RetAssigner (
645
644
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
646
- /* IsRet=*/ true , RetDispatcher );
645
+ /* IsRet=*/ true );
647
646
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
648
647
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
649
648
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments