Skip to content

Commit b5b8465

Browse files
committed
[RISCV] RISCV vector calling convention (2/2)
This commit handles vector arguments/return for function definition/call, the new class RVVArgDispatcher is added for doing all vector register assignment including mask types, data types as well as tuple types. It precomputes the register number for each argument as per https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#standard-vector-calling-convention-variant and it's passed to calling convention function to handle all vector arguments. Depends on: llvm#78550
1 parent 8c5e9cf commit b5b8465

File tree

6 files changed

+311
-83
lines changed

6 files changed

+311
-83
lines changed

llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,15 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
3434
// Whether this is assigning args for a return.
3535
bool IsRet;
3636

37-
// true if assignArg has been called for a mask argument, false otherwise.
38-
bool AssignedFirstMaskArg = false;
37+
RVVArgDispatcher RVVDispatcher;
3938

4039
public:
4140
RISCVOutgoingValueAssigner(
42-
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
41+
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
42+
RVVArgDispatcher &RVVDispatcher)
4343
: CallLowering::OutgoingValueAssigner(nullptr),
44-
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet) {}
44+
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet),
45+
RVVDispatcher(RVVDispatcher) {}
4546

4647
bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
4748
CCValAssign::LocInfo LocInfo,
@@ -51,16 +52,9 @@ struct RISCVOutgoingValueAssigner : public CallLowering::OutgoingValueAssigner {
5152
const DataLayout &DL = MF.getDataLayout();
5253
const RISCVSubtarget &Subtarget = MF.getSubtarget<RISCVSubtarget>();
5354

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-
6155
if (RISCVAssignFn(DL, Subtarget.getTargetABI(), ValNo, ValVT, LocVT,
6256
LocInfo, Flags, State, Info.IsFixed, IsRet, Info.Ty,
63-
*Subtarget.getTargetLowering(), FirstMaskArgument))
57+
*Subtarget.getTargetLowering(), RVVDispatcher))
6458
return true;
6559

6660
StackSize = State.getStackSize();
@@ -181,14 +175,15 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
181175
// Whether this is assigning args from a return.
182176
bool IsRet;
183177

184-
// true if assignArg has been called for a mask argument, false otherwise.
185-
bool AssignedFirstMaskArg = false;
178+
RVVArgDispatcher &RVVDispatcher;
186179

187180
public:
188181
RISCVIncomingValueAssigner(
189-
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
182+
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
183+
RVVArgDispatcher &RVVDispatcher)
190184
: CallLowering::IncomingValueAssigner(nullptr),
191-
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet) {}
185+
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet),
186+
RVVDispatcher(RVVDispatcher) {}
192187

193188
bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
194189
CCValAssign::LocInfo LocInfo,
@@ -201,16 +196,9 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
201196
if (LocVT.isScalableVector())
202197
MF.getInfo<RISCVMachineFunctionInfo>()->setIsVectorCall();
203198

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-
211199
if (RISCVAssignFn(DL, Subtarget.getTargetABI(), ValNo, ValVT, LocVT,
212200
LocInfo, Flags, State, /*IsFixed=*/true, IsRet, Info.Ty,
213-
*Subtarget.getTargetLowering(), FirstMaskArgument))
201+
*Subtarget.getTargetLowering(), RVVDispatcher))
214202
return true;
215203

216204
StackSize = State.getStackSize();
@@ -420,9 +408,10 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
420408
SmallVector<ArgInfo, 4> SplitRetInfos;
421409
splitToValueTypes(OrigRetInfo, SplitRetInfos, DL, CC);
422410

411+
RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), true};
423412
RISCVOutgoingValueAssigner Assigner(
424413
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
425-
/*IsRet=*/true);
414+
/*IsRet=*/true, Dispatcher);
426415
RISCVOutgoingValueHandler Handler(MIRBuilder, MF.getRegInfo(), Ret);
427416
return determineAndHandleAssignments(Handler, Assigner, SplitRetInfos,
428417
MIRBuilder, CC, F.isVarArg());
@@ -545,9 +534,10 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
545534
++Index;
546535
}
547536

537+
RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), false};
548538
RISCVIncomingValueAssigner Assigner(
549539
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
550-
/*IsRet=*/false);
540+
/*IsRet=*/false, Dispatcher);
551541
RISCVFormalArgHandler Handler(MIRBuilder, MF.getRegInfo());
552542

553543
SmallVector<CCValAssign, 16> ArgLocs;
@@ -607,9 +597,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
607597
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
608598
Call.addRegMask(TRI->getCallPreservedMask(MF, Info.CallConv));
609599

600+
RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), false,
601+
nullptr, &Info};
610602
RISCVOutgoingValueAssigner ArgAssigner(
611603
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
612-
/*IsRet=*/false);
604+
/*IsRet=*/false, ArgDispatcher);
613605
RISCVOutgoingValueHandler ArgHandler(MIRBuilder, MF.getRegInfo(), Call);
614606
if (!determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgInfos,
615607
MIRBuilder, CC, Info.IsVarArg))
@@ -637,9 +629,10 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
637629
SmallVector<ArgInfo, 4> SplitRetInfos;
638630
splitToValueTypes(Info.OrigRet, SplitRetInfos, DL, CC);
639631

632+
RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(), true};
640633
RISCVIncomingValueAssigner RetAssigner(
641634
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
642-
/*IsRet=*/true);
635+
/*IsRet=*/true, RetDispatcher);
643636
RISCVCallReturnHandler RetHandler(MIRBuilder, MF.getRegInfo(), Call);
644637
if (!determineAndHandleAssignments(RetHandler, RetAssigner, SplitRetInfos,
645638
MIRBuilder, CC, Info.IsVarArg))

0 commit comments

Comments
 (0)