[llvm] [GISel][RISCV]Implement indirect parameter passing for large scalars (PR #95429)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 14 02:12:14 PDT 2024
================
@@ -790,6 +804,32 @@ bool CallLowering::handleAssignments(ValueHandler &Handler,
CCValAssign &VA = ArgLocs[j + Idx];
const ISD::ArgFlagsTy Flags = Args[i].Flags[Part];
+ // We found an indirect parameter passing and we are at the first part of
+ // the value being passed. In this case copy the incoming pointer into a
+ // virtual register so later we can load it.
+ if (VA.getLocInfo() == CCValAssign::Indirect && Flags.isSplit()) {
+ IndirectParameterPassingHandled = true;
+ if (Handler.isIncomingArgumentHandler()) {
+ Handler.assignValueToReg(ArgReg, VA.getLocReg(), VA);
+ Handler.assignValueToAddress(Args[i].OrigRegs[Part],
+ Args[i].Regs[Part], OrigTy,
+ MachinePointerInfo{}, VA);
+ } else {
+ Align StackAlign = DL.getPrefTypeAlign(Args[i].Ty);
+ MachineFrameInfo &MFI = MF.getFrameInfo();
+ int FrameIdx = MFI.CreateStackObject(OrigTy.getScalarSizeInBits(),
+ StackAlign, false);
+
+ Register PointerToStackReg =
+ MIRBuilder.buildFrameIndex(PointerTy, FrameIdx).getReg(0);
+ Handler.assignValueToAddress(Args[i].OrigRegs[Part],
+ PointerToStackReg, OrigTy,
+ MachinePointerInfo{}, VA);
+ Handler.assignValueToReg(PointerToStackReg, VA.getLocReg(), VA);
----------------
s-barannikov wrote:
What I mean is that you can have e.g.:
define void @test(i64 %x0, i64 %x1, i64 %x2, ...., i128 %y)
`x` arguments occupy all registers available for argument passing. `y` is still passed indirectly, but the pointer to it is not in a register, but in memory.
https://github.com/llvm/llvm-project/pull/95429
More information about the llvm-commits
mailing list