[llvm] [GlobalISel][RISCV] SelectionDAG like indirect parameter passing (PR #216724)

Gábor Spaits via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 27 03:20:29 PDT 2026


================
@@ -1011,30 +1027,55 @@ bool CallLowering::handleAssignments(ValueHandler &Handler,
       // Finish the handling of indirect parameter passing when receiving
       // the value (we are in the called function or the caller when receiving
       // the return value).
-      if (VA.getLocInfo() == CCValAssign::Indirect &&
-          Handler.isIncomingArgumentHandler()) {
-        Align Alignment = DL.getABITypeAlign(Args[i].Ty);
+      if (IsIndirect && Handler.isIncomingArgumentHandler()) {
+        if (IsFirstIndirectPart)
+          IncomingIndirectValuePointer = ArgReg;
+
+        uint64_t OffsetBytes = NewLLT.getSizeInBytes()
+                                   .multiplyCoefficientBy(IndirectIdx)
+                                   .getKnownMinValue();
+        Align Alignment =
+            commonAlignment(DL.getABITypeAlign(Args[i].Ty), OffsetBytes);
         MachinePointerInfo MPO = MachinePointerInfo::getUnknownStack(MF);
-
+        Register PartPtrReg = IncomingIndirectValuePointer;
+        if (IndirectIdx > 0) {
+          LLT OffsetTy = LLT::scalar(PointerTy.getSizeInBits());
+          auto PartOffset = MIRBuilder.buildConstant(OffsetTy, OffsetBytes);
+          PartPtrReg = MIRBuilder
+                           .buildPtrAdd(PointerTy, IncomingIndirectValuePointer,
+                                        PartOffset)
+                           .getReg(0);
+        }
         // Since we are doing indirect parameter passing, we know that the value
         // in the temporary register is not the value passed to the function,
         // but rather a pointer to that value. Let's load that value into the
         // virtual register where the parameter should go.
-        MIRBuilder.buildLoad(Args[i].OrigRegs[0], Args[i].Regs[0], MPO,
-                             Alignment);
-
-        IndirectParameterPassingHandled = true;
+        LLT LoadedPartTy = getLLTForMVT(VA.getValVT());
+        Register LoadedPart;
+        if (NumParts == 1 && LoadedPartTy == OrigTy) {
+          LoadedPart = Args[i].OrigRegs[0];
+          MIRBuilder.buildLoad(LoadedPart, PartPtrReg, MPO, Alignment);
+        } else {
+          LoadedPart =
+              MIRBuilder.buildLoad(LoadedPartTy, PartPtrReg, MPO, Alignment)
+                  .getReg(0);
+        }
+        if (Part < Args[i].Regs.size())
+          Args[i].Regs[Part] = LoadedPart;
+        else
+          Args[i].Regs.push_back(LoadedPart);
----------------
spaits wrote:

I think https://github.com/llvm/llvm-project/pull/216724#discussion_r3870812564 also addresses this. 

https://github.com/llvm/llvm-project/pull/216724


More information about the llvm-commits mailing list