Skip to content
This repository has been archived by the owner on Jan 20, 2024. It is now read-only.

Commit

Permalink
[RISCV][GISel] Disable call lowering for integers larger than 2*XLen.…
Browse files Browse the repository at this point in the history
… (#69144)

Types larger than 2*XLen are passed indirectly which is not supported
yet. Currently, we will incorrectly pass X10 multiple times.
  • Loading branch information
topperc authored Oct 20, 2023
1 parent 734b016 commit 3a4b0e9
Showing 1 changed file with 48 additions and 18 deletions.
66 changes: 48 additions & 18 deletions llvm/lib/Target/RISCV/GISel/RISCVCallLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,15 +193,52 @@ struct RISCVCallReturnHandler : public RISCVIncomingValueHandler {
RISCVCallLowering::RISCVCallLowering(const RISCVTargetLowering &TLI)
: CallLowering(&TLI) {}

// TODO: Support all argument types.
static bool isSupportedArgumentType(Type *T, const RISCVSubtarget &Subtarget) {
// TODO: Integers larger than 2*XLen are passed indirectly which is not
// supported yet.
if (T->isIntegerTy())
return T->getIntegerBitWidth() <= Subtarget.getXLen() * 2;
if (T->isPointerTy())
return true;
return false;
}

// TODO: Only integer, pointer and aggregate types are supported now.
static bool isSupportedReturnType(Type *T, const RISCVSubtarget &Subtarget) {
// TODO: Integers larger than 2*XLen are passed indirectly which is not
// supported yet.
if (T->isIntegerTy())
return T->getIntegerBitWidth() <= Subtarget.getXLen() * 2;
if (T->isPointerTy())
return true;

if (T->isArrayTy())
return isSupportedReturnType(T->getArrayElementType(), Subtarget);

if (T->isStructTy()) {
// For now we only allow homogeneous structs that we can manipulate with
// G_MERGE_VALUES and G_UNMERGE_VALUES
auto StructT = cast<StructType>(T);
for (unsigned i = 1, e = StructT->getNumElements(); i != e; ++i)
if (StructT->getElementType(i) != StructT->getElementType(0))
return false;
return isSupportedReturnType(StructT->getElementType(0), Subtarget);
}

return false;
}

bool RISCVCallLowering::lowerReturnVal(MachineIRBuilder &MIRBuilder,
const Value *Val,
ArrayRef<Register> VRegs,
MachineInstrBuilder &Ret) const {
if (!Val)
return true;

// TODO: Only integer, pointer and aggregate types are supported now.
if (!Val->getType()->isIntOrPtrTy() && !Val->getType()->isAggregateType())
const RISCVSubtarget &Subtarget =
MIRBuilder.getMF().getSubtarget<RISCVSubtarget>();
if (!isSupportedReturnType(Val->getType(), Subtarget))
return false;

MachineFunction &MF = MIRBuilder.getMF();
Expand Down Expand Up @@ -248,13 +285,11 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
if (F.isVarArg())
return false;

// TODO: Support all argument types.
const RISCVSubtarget &Subtarget =
MIRBuilder.getMF().getSubtarget<RISCVSubtarget>();
for (auto &Arg : F.args()) {
if (Arg.getType()->isIntegerTy())
continue;
if (Arg.getType()->isPointerTy())
continue;
return false;
if (!isSupportedArgumentType(Arg.getType(), Subtarget))
return false;
}

MachineFunction &MF = MIRBuilder.getMF();
Expand Down Expand Up @@ -292,15 +327,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
const Function &F = MF.getFunction();
CallingConv::ID CC = F.getCallingConv();

// TODO: Support all argument types.
const RISCVSubtarget &Subtarget =
MIRBuilder.getMF().getSubtarget<RISCVSubtarget>();
for (auto &AInfo : Info.OrigArgs) {
if (AInfo.Ty->isIntegerTy())
continue;
if (AInfo.Ty->isPointerTy())
continue;
if (AInfo.Ty->isFloatingPointTy())
continue;
return false;
if (!isSupportedArgumentType(AInfo.Ty, Subtarget))
return false;
}

SmallVector<ArgInfo, 32> SplitArgInfos;
Expand Down Expand Up @@ -337,8 +368,7 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
if (Info.OrigRet.Ty->isVoidTy())
return true;

// TODO: Only integer, pointer and aggregate types are supported now.
if (!Info.OrigRet.Ty->isIntOrPtrTy() && !Info.OrigRet.Ty->isAggregateType())
if (!isSupportedReturnType(Info.OrigRet.Ty, Subtarget))
return false;

SmallVector<ArgInfo, 4> SplitRetInfos;
Expand Down

0 comments on commit 3a4b0e9

Please sign in to comment.