[llvm] [GISel][RISCV]Implement indirect parameter passing (PR #95429)
Gábor Spaits via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 16 08:19:53 PDT 2024
================
@@ -790,6 +806,68 @@ 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 have an
+ // OutgoingValueHandler as our handler (so we are at the call site or the
+ // return value). In this case, start the construction of the following
+ // GMIR, that is responsible for the preparation of indirect parameter
+ // passing:
+ //
+ // %1(indirectly passed type) = The value to pass
+ // %3(pointer) = G_FRAME_INDEX %stack.0
+ // G_STORE %1, %3 :: (store (s128), align 8)
+ //
+ // After this GMIR, the remaining part of the loop body will decide how
+ // to get the value to the caller and we break out of the loop.
+ // NOTE: In the case, when the the pointer pointing to the value is passed
+ // in a register there is an exception to this, that is detailed bellow.
+ if (VA.getLocInfo() == CCValAssign::Indirect && Flags.isSplit() &&
+ !Handler.isIncomingArgumentHandler()) {
+ 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);
+
+ MachinePointerInfo DstMPO;
+
+ Align FlagAlignment{};
+ if (Flags.isByVal()) {
----------------
spaits wrote:
Sorry I was wrong. I did some debugging and found out, that you are right, it really can not be by val here. It is consistent and logically correct, that an indirect parameter passing is not by value, but currently I don't really understand, when and how is this attribute is set to by ref instead of by val, since the flag setting happens before checking the targets calling conventions and the calling conventions do not really play around with these flags (at least the riscv one doesn't if I am correct.) I take another look at the alignments here.
https://github.com/llvm/llvm-project/pull/95429
More information about the llvm-commits
mailing list