@@ -739,7 +739,17 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
739
739
740
740
// Transform the arguments stored on
741
741
// physical registers into virtual ones
742
- unsigned Reg = MF.addLiveIn (VA.getLocReg (), RC);
742
+ unsigned Reg = 0 ;
743
+ unsigned FrameReg = Subtarget.getRegisterInfo ()->getFrameRegister (MF);
744
+
745
+ // Argument passed in FrameReg we save in A8 (in emitPrologue),
746
+ // so load argument from A8
747
+ if (VA.getLocReg () == FrameReg) {
748
+ Reg = MF.addLiveIn (Xtensa::A8, RC);
749
+ } else {
750
+ Reg = MF.addLiveIn (VA.getLocReg (), RC);
751
+ }
752
+
743
753
SDValue ArgValue = DAG.getCopyFromReg (Chain, DL, Reg, RegVT);
744
754
745
755
// If this is an 8 or 16-bit value, it has been passed promoted
@@ -818,7 +828,16 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
818
828
// to the vararg save area.
819
829
for (unsigned I = Idx; I < ArgRegs.size (); ++I, VaArgOffset += RegSize) {
820
830
const unsigned Reg = RegInfo.createVirtualRegister (RC);
821
- RegInfo.addLiveIn (ArgRegs[I], Reg);
831
+ unsigned FrameReg = Subtarget.getRegisterInfo ()->getFrameRegister (MF);
832
+
833
+ // Argument passed in FrameReg we save in A8 (in emitPrologue),
834
+ // so load argument from A8
835
+ if (ArgRegs[I] == FrameReg) {
836
+ RegInfo.addLiveIn (Xtensa::A8, Reg);
837
+ } else {
838
+ RegInfo.addLiveIn (ArgRegs[I], Reg);
839
+ }
840
+
822
841
SDValue ArgValue = DAG.getCopyFromReg (Chain, DL, Reg, RegTy);
823
842
FI = MFI.CreateFixedObject (RegSize, VaArgOffset, true );
824
843
SDValue PtrOff = DAG.getFrameIndex (FI, getPointerTy (DAG.getDataLayout ()));
0 commit comments