Skip to content

Commit 3fa8308

Browse files
authored
Revert "[RISCV] RISCV vector calling convention (2/2) (#79096)" (#88511)
This reverts commit 29e8bfc. This patch didn't handle vector return type correctly.
1 parent ea3d0db commit 3fa8308

File tree

6 files changed

+83
-320
lines changed

6 files changed

+83
-320
lines changed

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

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

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

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

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

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

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

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

180187
public:
181188
RISCVIncomingValueAssigner(
182-
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet,
183-
RVVArgDispatcher &RVVDispatcher)
189+
RISCVTargetLowering::RISCVCCAssignFn *RISCVAssignFn_, bool IsRet)
184190
: CallLowering::IncomingValueAssigner(nullptr),
185-
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet),
186-
RVVDispatcher(RVVDispatcher) {}
191+
RISCVAssignFn(RISCVAssignFn_), IsRet(IsRet) {}
187192

188193
bool assignArg(unsigned ValNo, EVT OrigVT, MVT ValVT, MVT LocVT,
189194
CCValAssign::LocInfo LocInfo,
@@ -196,9 +201,16 @@ struct RISCVIncomingValueAssigner : public CallLowering::IncomingValueAssigner {
196201
if (LocVT.isScalableVector())
197202
MF.getInfo<RISCVMachineFunctionInfo>()->setIsVectorCall();
198203

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

204216
StackSize = State.getStackSize();
@@ -408,11 +420,9 @@ bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
408420
SmallVector<ArgInfo, 4> SplitRetInfos;
409421
splitToValueTypes(OrigRetInfo, SplitRetInfos, DL, CC);
410422

411-
RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(),
412-
F.getReturnType()};
413423
RISCVOutgoingValueAssigner Assigner(
414424
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
415-
/*IsRet=*/true, Dispatcher);
425+
/*IsRet=*/true);
416426
RISCVOutgoingValueHandler Handler(MIRBuilder, MF.getRegInfo(), Ret);
417427
return determineAndHandleAssignments(Handler, Assigner, SplitRetInfos,
418428
MIRBuilder, CC, F.isVarArg());
@@ -521,7 +531,6 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
521531
CallingConv::ID CC = F.getCallingConv();
522532

523533
SmallVector<ArgInfo, 32> SplitArgInfos;
524-
SmallVector<Type *, 4> TypeList;
525534
unsigned Index = 0;
526535
for (auto &Arg : F.args()) {
527536
// Construct the ArgInfo object from destination register and argument type.
@@ -533,15 +542,12 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
533542
// correspondingly and appended to SplitArgInfos.
534543
splitToValueTypes(AInfo, SplitArgInfos, DL, CC);
535544

536-
TypeList.push_back(Arg.getType());
537-
538545
++Index;
539546
}
540547

541-
RVVArgDispatcher Dispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
542548
RISCVIncomingValueAssigner Assigner(
543549
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
544-
/*IsRet=*/false, Dispatcher);
550+
/*IsRet=*/false);
545551
RISCVFormalArgHandler Handler(MIRBuilder, MF.getRegInfo());
546552

547553
SmallVector<CCValAssign, 16> ArgLocs;
@@ -579,13 +585,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
579585

580586
SmallVector<ArgInfo, 32> SplitArgInfos;
581587
SmallVector<ISD::OutputArg, 8> Outs;
582-
SmallVector<Type *, 4> TypeList;
583588
for (auto &AInfo : Info.OrigArgs) {
584589
// Handle any required unmerging of split value types from a given VReg into
585590
// physical registers. ArgInfo objects are constructed correspondingly and
586591
// appended to SplitArgInfos.
587592
splitToValueTypes(AInfo, SplitArgInfos, DL, CC);
588-
TypeList.push_back(AInfo.Ty);
589593
}
590594

591595
// TODO: Support tail calls.
@@ -603,10 +607,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
603607
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
604608
Call.addRegMask(TRI->getCallPreservedMask(MF, Info.CallConv));
605609

606-
RVVArgDispatcher ArgDispatcher{&MF, getTLI<RISCVTargetLowering>(), TypeList};
607610
RISCVOutgoingValueAssigner ArgAssigner(
608611
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
609-
/*IsRet=*/false, ArgDispatcher);
612+
/*IsRet=*/false);
610613
RISCVOutgoingValueHandler ArgHandler(MIRBuilder, MF.getRegInfo(), Call);
611614
if (!determineAndHandleAssignments(ArgHandler, ArgAssigner, SplitArgInfos,
612615
MIRBuilder, CC, Info.IsVarArg))
@@ -634,11 +637,9 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
634637
SmallVector<ArgInfo, 4> SplitRetInfos;
635638
splitToValueTypes(Info.OrigRet, SplitRetInfos, DL, CC);
636639

637-
RVVArgDispatcher RetDispatcher{&MF, getTLI<RISCVTargetLowering>(),
638-
F.getReturnType()};
639640
RISCVIncomingValueAssigner RetAssigner(
640641
CC == CallingConv::Fast ? RISCV::CC_RISCV_FastCC : RISCV::CC_RISCV,
641-
/*IsRet=*/true, RetDispatcher);
642+
/*IsRet=*/true);
642643
RISCVCallReturnHandler RetHandler(MIRBuilder, MF.getRegInfo(), Call);
643644
if (!determineAndHandleAssignments(RetHandler, RetAssigner, SplitRetInfos,
644645
MIRBuilder, CC, Info.IsVarArg))

0 commit comments

Comments
 (0)