@@ -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 ();
@@ -175,15 +181,14 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
175
181
// Whether this is assigning args from a return.
176
182
bool IsRet;
177
183
178
- RVVArgDispatcher &RVVDispatcher;
184
+ // true if assignArg has been called for a mask argument, false otherwise.
185
+ bool AssignedFirstMaskArg = false ;
179
186
180
187
public:
181
188
RISCVIncomingValueAssigner (
182
- RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
183
- RVVArgDispatcher &RVVDispatcher)
189
+ RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
184
190
: CallLowering::IncomingValueAssigner(nullptr ),
185
- RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet),
186
- RVVDispatcher(RVVDispatcher) {}
191
+ RISCVAssignFn (RISCVAssignFn_), IsRet(IsRet) {}
187
192
188
193
bool assignArg (unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
189
194
CCValAssign::LocInfo LocInfo,
@@ -196,9 +201,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
196
201
if (LocVT.isScalableVector ())
197
202
MF.getInfo <RISCVMachineFunctionInfo>()->setIsVectorCall ();
198
203
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
+
199
211
if (RISCVAssignFn (DL, Subtarget.getTargetABI (), ValNo, ValVT, LocVT,
200
212
LocInfo, Flags, State, /* IsFixed=*/ true , IsRet, Info.Ty ,
201
- *Subtarget.getTargetLowering (), RVVDispatcher ))
213
+ *Subtarget.getTargetLowering (), FirstMaskArgument ))
202
214
return true ;
203
215
204
216
StackSize = State.getStackSize ();
@@ -408,11 +420,9 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
408
420
SmallVector<ArgInfo, 4 > SplitRetInfos;
409
421
splitToValueTypes (OrigRetInfo, SplitRetInfos, DL, CC);
410
422
411
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
412
- F.getReturnType ()};
413
423
RISCVOutgoingValueAssigner Assigner (
414
424
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
415
- /* IsRet=*/ true , Dispatcher );
425
+ /* IsRet=*/ true );
416
426
RISCVOutgoingValueHandler Handler (MIRBuilder, MF.getRegInfo (), Ret);
417
427
return determineAndHandleAssignments (Handler, Assigner, SplitRetInfos,
418
428
MIRBuilder, CC, F.isVarArg ());
@@ -521,7 +531,6 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
521
531
CallingConv::ID CC = F.getCallingConv ();
522
532
523
533
SmallVector<ArgInfo, 32 > SplitArgInfos;
524
- SmallVector<Type *, 4 > TypeList;
525
534
unsigned Index = 0 ;
526
535
for (auto &Arg : F.args ()) {
527
536
// Construct the ArgInfo object from destination register and argument type.
@@ -533,15 +542,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
533
542
// correspondingly and appended to SplitArgInfos.
534
543
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
535
544
536
- TypeList.push_back (Arg.getType ());
537
-
538
545
++Index;
539
546
}
540
547
541
- RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
542
548
RISCVIncomingValueAssigner Assigner (
543
549
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
544
- /* IsRet=*/ false , Dispatcher );
550
+ /* IsRet=*/ false );
545
551
RISCVFormalArgHandler Handler (MIRBuilder, MF.getRegInfo ());
546
552
547
553
SmallVector<CCValAssign, 16 > ArgLocs;
@@ -579,13 +585,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
579
585
580
586
SmallVector<ArgInfo, 32 > SplitArgInfos;
581
587
SmallVector<ISD::OutputArg, 8 > Outs;
582
- SmallVector<Type *, 4 > TypeList;
583
588
for (auto &AInfo : Info.OrigArgs ) {
584
589
// Handle any required unmerging of split value types from a given VReg into
585
590
// physical registers. ArgInfo objects are constructed correspondingly and
586
591
// appended to SplitArgInfos.
587
592
splitToValueTypes (AInfo, SplitArgInfos, DL, CC);
588
- TypeList.push_back (AInfo.Ty );
589
593
}
590
594
591
595
// TODO: Support tail calls.
@@ -603,10 +607,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
603
607
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo ();
604
608
Call.addRegMask (TRI->getCallPreservedMask (MF, Info.CallConv ));
605
609
606
- RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
607
610
RISCVOutgoingValueAssigner ArgAssigner (
608
611
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
609
- /* IsRet=*/ false , ArgDispatcher );
612
+ /* IsRet=*/ false );
610
613
RISCVOutgoingValueHandler ArgHandler (MIRBuilder, MF.getRegInfo (), Call);
611
614
if (!determineAndHandleAssignments (ArgHandler, ArgAssigner, SplitArgInfos,
612
615
MIRBuilder, CC, Info.IsVarArg ))
@@ -634,11 +637,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
634
637
SmallVector<ArgInfo, 4 > SplitRetInfos;
635
638
splitToValueTypes (Info.OrigRet , SplitRetInfos, DL, CC);
636
639
637
- RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
638
- F.getReturnType ()};
639
640
RISCVIncomingValueAssigner RetAssigner (
640
641
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
641
- /* IsRet=*/ true , RetDispatcher );
642
+ /* IsRet=*/ true );
642
643
RISCVCallReturnHandler RetHandler (MIRBuilder, MF.getRegInfo (), Call);
643
644
if (!determineAndHandleAssignments (RetHandler, RetAssigner, SplitRetInfos,
644
645
MIRBuilder, CC, Info.IsVarArg ))
0 commit comments