Skip to content

Commit e1c03dd

Browse files
author
Chen Zheng
committed
[PowerPC] use r1 as the frame pointer when there is dynamic alloca
On PPC, when there is dynamic alloca, only r1 points to the backchain.
1 parent abaaa48 commit e1c03dd

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

llvm/lib/Target/PowerPC/PPCFrameLowering.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,10 @@ bool PPCFrameLowering::needsFP(const MachineFunction &MF) const {
384384
}
385385

386386
void PPCFrameLowering::replaceFPWithRealFP(MachineFunction &MF) const {
387-
bool is31 = needsFP(MF);
387+
// When there is dynamic alloca in this function, we can not use the frame
388+
// pointer X31/R31 for the frameaddress lowering. In this case, only X1/R1
389+
// always points to the backchain.
390+
bool is31 = needsFP(MF) && !MF.getFrameInfo().hasVarSizedObjects();
388391
unsigned FPReg = is31 ? PPC::R31 : PPC::R1;
389392
unsigned FP8Reg = is31 ? PPC::X31 : PPC::X1;
390393

llvm/test/CodeGen/PowerPC/frameaddr-alloca.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ define ptr @frame_1(i32 signext %num) nounwind {
1818
; AIX32-NEXT: lbz 4, 0(3)
1919
; AIX32-NEXT: addi 4, 4, 1
2020
; AIX32-NEXT: stb 4, 0(3)
21-
; AIX32-NEXT: lwz 3, 0(31)
21+
; AIX32-NEXT: lwz 3, 0(1)
2222
; AIX32-NEXT: lwz 1, 0(1)
2323
; AIX32-NEXT: lwz 31, -4(1)
2424
; AIX32-NEXT: blr
@@ -37,7 +37,7 @@ define ptr @frame_1(i32 signext %num) nounwind {
3737
; AIX64-NEXT: lbz 4, 0(3)
3838
; AIX64-NEXT: addi 4, 4, 1
3939
; AIX64-NEXT: stb 4, 0(3)
40-
; AIX64-NEXT: ld 3, 0(31)
40+
; AIX64-NEXT: ld 3, 0(1)
4141
; AIX64-NEXT: ld 1, 0(1)
4242
; AIX64-NEXT: ld 31, -8(1)
4343
; AIX64-NEXT: blr
@@ -56,7 +56,7 @@ define ptr @frame_1(i32 signext %num) nounwind {
5656
; LE-NEXT: lbz 4, 0(3)
5757
; LE-NEXT: addi 4, 4, 1
5858
; LE-NEXT: stb 4, 0(3)
59-
; LE-NEXT: ld 3, 0(31)
59+
; LE-NEXT: ld 3, 0(1)
6060
; LE-NEXT: ld 1, 0(1)
6161
; LE-NEXT: ld 31, -8(1)
6262
; LE-NEXT: blr
@@ -85,7 +85,7 @@ define ptr @frame_0(i32 signext %num) nounwind {
8585
; AIX32-NEXT: lbz 4, 0(3)
8686
; AIX32-NEXT: addi 4, 4, 1
8787
; AIX32-NEXT: stb 4, 0(3)
88-
; AIX32-NEXT: mr 3, 31
88+
; AIX32-NEXT: mr 3, 1
8989
; AIX32-NEXT: lwz 1, 0(1)
9090
; AIX32-NEXT: lwz 31, -4(1)
9191
; AIX32-NEXT: blr
@@ -104,7 +104,7 @@ define ptr @frame_0(i32 signext %num) nounwind {
104104
; AIX64-NEXT: lbz 4, 0(3)
105105
; AIX64-NEXT: addi 4, 4, 1
106106
; AIX64-NEXT: stb 4, 0(3)
107-
; AIX64-NEXT: mr 3, 31
107+
; AIX64-NEXT: mr 3, 1
108108
; AIX64-NEXT: ld 1, 0(1)
109109
; AIX64-NEXT: ld 31, -8(1)
110110
; AIX64-NEXT: blr
@@ -123,7 +123,7 @@ define ptr @frame_0(i32 signext %num) nounwind {
123123
; LE-NEXT: lbz 4, 0(3)
124124
; LE-NEXT: addi 4, 4, 1
125125
; LE-NEXT: stb 4, 0(3)
126-
; LE-NEXT: mr 3, 31
126+
; LE-NEXT: mr 3, 1
127127
; LE-NEXT: ld 1, 0(1)
128128
; LE-NEXT: ld 31, -8(1)
129129
; LE-NEXT: blr

0 commit comments

Comments
 (0)