@@ -432,60 +432,63 @@ void RISCVCallLowering::saveVarArgRegisters(
432
432
const RISCVSubtarget &Subtarget = MF.getSubtarget <RISCVSubtarget>();
433
433
unsigned XLenInBytes = Subtarget.getXLen () / 8 ;
434
434
ArrayRef<MCPhysReg> ArgRegs = RISCV::getArgGPRs ();
435
+ MachineRegisterInfo &MRI = MF.getRegInfo ();
435
436
unsigned Idx = CCInfo.getFirstUnallocated (ArgRegs);
437
+ MachineFrameInfo &MFI = MF.getFrameInfo ();
438
+ RISCVMachineFunctionInfo *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
436
439
437
- // Offset of the first variable argument from stack pointer, and size of
438
- // the vararg save area. For now, the varargs save area is either zero or
439
- // large enough to hold a0-a7.
440
- int VaArgOffset;
440
+ // Size of the vararg save area. For now, the varargs save area is either
441
+ // zero or large enough to hold a0-a7.
441
442
int VarArgsSaveSize = XLenInBytes * (ArgRegs.size () - Idx);
443
+ int FI;
442
444
443
445
// If all registers are allocated, then all varargs must be passed on the
444
446
// stack and we don't need to save any argregs.
445
447
if (VarArgsSaveSize == 0 ) {
446
- VaArgOffset = Assigner.StackSize ;
448
+ int VaArgOffset = Assigner.StackSize ;
449
+ FI = MFI.CreateFixedObject (XLenInBytes, VaArgOffset, true );
447
450
} else {
448
- VaArgOffset = -VarArgsSaveSize;
451
+ int VaArgOffset = -VarArgsSaveSize;
452
+ FI = MFI.CreateFixedObject (VarArgsSaveSize, VaArgOffset, true );
453
+
454
+ // If saving an odd number of registers then create an extra stack slot to
455
+ // ensure that the frame pointer is 2*XLEN-aligned, which in turn ensures
456
+ // offsets to even-numbered registered remain 2*XLEN-aligned.
457
+ if (Idx % 2 ) {
458
+ MFI.CreateFixedObject (XLenInBytes,
459
+ VaArgOffset - static_cast <int >(XLenInBytes), true );
460
+ VarArgsSaveSize += XLenInBytes;
461
+ }
462
+
463
+ const LLT p0 = LLT::pointer (MF.getDataLayout ().getAllocaAddrSpace (),
464
+ Subtarget.getXLen ());
465
+ const LLT sXLen = LLT::scalar (Subtarget.getXLen ());
466
+
467
+ auto FIN = MIRBuilder.buildFrameIndex (p0, FI);
468
+ auto Offset = MIRBuilder.buildConstant (
469
+ MRI.createGenericVirtualRegister (sXLen ), XLenInBytes);
470
+
471
+ // Copy the integer registers that may have been used for passing varargs
472
+ // to the vararg save area.
473
+ const MVT XLenVT = Subtarget.getXLenVT ();
474
+ for (unsigned I = Idx; I < ArgRegs.size (); ++I) {
475
+ const Register VReg = MRI.createGenericVirtualRegister (sXLen );
476
+ Handler.assignValueToReg (
477
+ VReg, ArgRegs[I],
478
+ CCValAssign::getReg (I + MF.getFunction ().getNumOperands (), XLenVT,
479
+ ArgRegs[I], XLenVT, CCValAssign::Full));
480
+ auto MPO =
481
+ MachinePointerInfo::getFixedStack (MF, FI, (I - Idx) * XLenInBytes);
482
+ MIRBuilder.buildStore (VReg, FIN, MPO, inferAlignFromPtrInfo (MF, MPO));
483
+ FIN = MIRBuilder.buildPtrAdd (MRI.createGenericVirtualRegister (p0),
484
+ FIN.getReg (0 ), Offset);
485
+ }
449
486
}
450
487
451
488
// Record the frame index of the first variable argument which is a value
452
489
// necessary to G_VASTART.
453
- MachineFrameInfo &MFI = MF.getFrameInfo ();
454
- int FI = MFI.CreateFixedObject (XLenInBytes, VaArgOffset, true );
455
- RISCVMachineFunctionInfo *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
456
490
RVFI->setVarArgsFrameIndex (FI);
457
-
458
- // If saving an odd number of registers then create an extra stack slot to
459
- // ensure that the frame pointer is 2*XLEN-aligned, which in turn ensures
460
- // offsets to even-numbered registered remain 2*XLEN-aligned.
461
- if (Idx % 2 ) {
462
- MFI.CreateFixedObject (XLenInBytes, VaArgOffset - (int )XLenInBytes, true );
463
- VarArgsSaveSize += XLenInBytes;
464
- }
465
491
RVFI->setVarArgsSaveSize (VarArgsSaveSize);
466
-
467
- // Copy the integer registers that may have been used for passing varargs
468
- // to the vararg save area.
469
- const LLT p0 = LLT::pointer (MF.getDataLayout ().getAllocaAddrSpace (),
470
- Subtarget.getXLen ());
471
- const LLT sXLen = LLT::scalar (Subtarget.getXLen ());
472
- const MVT XLenVT = Subtarget.getXLenVT ();
473
- MachineRegisterInfo &MRI = MF.getRegInfo ();
474
- for (unsigned I = Idx; I < ArgRegs.size (); ++I, VaArgOffset += XLenInBytes) {
475
- const Register VReg = MRI.createGenericVirtualRegister (sXLen );
476
- Handler.assignValueToReg (
477
- VReg, ArgRegs[I],
478
- CCValAssign::getReg (I + MF.getFunction ().getNumOperands (), XLenVT,
479
- ArgRegs[I], XLenVT, CCValAssign::Full));
480
- FI = MFI.CreateFixedObject (XLenInBytes, VaArgOffset, true );
481
- auto FIN = MIRBuilder.buildFrameIndex (p0, FI);
482
- auto MPO = MachinePointerInfo::getFixedStack (MF, FI);
483
- auto Store =
484
- MIRBuilder.buildStore (VReg, FIN, MPO, inferAlignFromPtrInfo (MF, MPO));
485
- // This was taken from SelectionDAG, but we are not sure why it exists.
486
- // It is being investigated in github.com/llvm/llvm-project/issues/73735.
487
- Store->memoperands ()[0 ]->setValue ((Value *)nullptr );
488
- }
489
492
}
490
493
491
494
bool RISCVCallLowering::lowerFormalArguments (MachineIRBuilder &MIRBuilder,
0 commit comments