Skip to content

Commit a5a002f

Browse files
committed
[Xtensa] Correct use of A7 register, because it maybe used as Frame Pointer and input function argument at the same time.
1 parent 10f9ef4 commit a5a002f

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

llvm/lib/Target/Xtensa/XtensaFrameLowering.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ void XtensaFrameLowering::emitPrologue(MachineFunction &MF,
127127
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::MOVSP), SP).addReg(TmpReg);
128128
}
129129

130+
// Store FP register in A8, because FP may be used to pass function
131+
// arguments
132+
if (STI.hasDensity()) {
133+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::MOV_N), Xtensa::A8).addReg(FP);
134+
} else {
135+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::OR), Xtensa::A8)
136+
.addReg(FP)
137+
.addReg(FP);
138+
}
139+
130140
// if framepointer enabled, set it to point to the stack pointer.
131141
if (hasFP(MF)) {
132142
// Insert instruction "move $fp, $sp" at this location.
@@ -158,7 +168,15 @@ void XtensaFrameLowering::emitPrologue(MachineFunction &MF,
158168
if (StackSize == 0 && !MFI.adjustsStack())
159169
return;
160170

161-
// MachineLocation DstML, SrcML;
171+
// Store FP register in A8, because FP may be used to pass function
172+
// arguments
173+
if (STI.hasDensity()) {
174+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::MOV_N), Xtensa::A8).addReg(FP);
175+
} else {
176+
BuildMI(MBB, MBBI, dl, TII.get(Xtensa::OR), Xtensa::A8)
177+
.addReg(FP)
178+
.addReg(FP);
179+
}
162180

163181
// Adjust stack.
164182
TII.adjustStackPtr(SP, -StackSize, MBB, MBBI);

llvm/lib/Target/Xtensa/XtensaISelLowering.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,17 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
739739

740740
// Transform the arguments stored on
741741
// 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+
743753
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegVT);
744754

745755
// If this is an 8 or 16-bit value, it has been passed promoted
@@ -818,7 +828,16 @@ SDValue XtensaTargetLowering::LowerFormalArguments(
818828
// to the vararg save area.
819829
for (unsigned I = Idx; I < ArgRegs.size(); ++I, VaArgOffset += RegSize) {
820830
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+
822841
SDValue ArgValue = DAG.getCopyFromReg(Chain, DL, Reg, RegTy);
823842
FI = MFI.CreateFixedObject(RegSize, VaArgOffset, true);
824843
SDValue PtrOff = DAG.getFrameIndex(FI, getPointerTy(DAG.getDataLayout()));

0 commit comments

Comments
 (0)