mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-03 02:08:54 +00:00
ARM: correctly calculate the offset of FP in its push.
When we folded the DPR alignment gap into a push, we weren't noting the extra distance from the beginning of the push to the FP, and so FP ended up pointing at an incorrect offset. The .cfi_def_cfa_offset directives are still wrong in this case, but I think that can be improved by refactoring. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222056 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9aa6fd59b3
commit
d96893fd3d
@ -282,9 +282,15 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
|
||||
// Prolog/epilog inserter assumes we correctly align DPRs on the stack, so our
|
||||
// .cfi_offset operations will reflect that.
|
||||
unsigned adjustedGPRCS1Size = GPRCS1Size;
|
||||
if (DPRGapSize) {
|
||||
assert(DPRGapSize == 4 && "unexpected alignment requirements for DPRs");
|
||||
if (!tryFoldSPUpdateIntoPushPop(STI, MF, LastPush, DPRGapSize))
|
||||
if (tryFoldSPUpdateIntoPushPop(STI, MF, LastPush, DPRGapSize)) {
|
||||
if (LastPush == GPRCS1Push) {
|
||||
FramePtrOffsetInPush += DPRGapSize;
|
||||
adjustedGPRCS1Size += DPRGapSize;
|
||||
}
|
||||
} else
|
||||
emitSPUpdate(isARM, MBB, MBBI, dl, TII, -DPRGapSize,
|
||||
MachineInstr::FrameSetup);
|
||||
}
|
||||
@ -354,7 +360,6 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF) const {
|
||||
NumBytes = 0;
|
||||
}
|
||||
|
||||
unsigned adjustedGPRCS1Size = GPRCS1Size;
|
||||
if (NumBytes) {
|
||||
// Adjust SP after all the callee-save spills.
|
||||
if (tryFoldSPUpdateIntoPushPop(STI, MF, LastPush, NumBytes)) {
|
||||
|
@ -66,3 +66,12 @@ define void @test_nodpr_noalign(i8 %l, i8 %r) {
|
||||
call void @bar()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test_frame_pointer_offset() minsize "no-frame-pointer-elim"="true" {
|
||||
; CHECK-LABEL: test_frame_pointer_offset:
|
||||
; CHECK: push.w {r3, r4, r5, r6, r7, r8, r9, r10, r11, lr}
|
||||
; CHECK: add r7, sp, #16
|
||||
call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{d8}"()
|
||||
call void @bar()
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user