diff options
author | Tim Northover <tnorthover@apple.com> | 2014-03-12 11:29:23 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2014-03-12 11:29:23 +0000 |
commit | d4517fa24da8d678e2541ec9b4def40b5b99753a (patch) | |
tree | a529372d70b820ba59e3f23b41659336a0f2640d /lib/Target/ARM/ARMFrameLowering.cpp | |
parent | 792a1d7191561cb0a3f7eba3844fd3a45b80d088 (diff) | |
download | llvm-d4517fa24da8d678e2541ec9b4def40b5b99753a.tar.gz llvm-d4517fa24da8d678e2541ec9b4def40b5b99753a.tar.bz2 llvm-d4517fa24da8d678e2541ec9b4def40b5b99753a.tar.xz |
ARM: correct Dwarf output for non-contiguous VFP saves.
When the list of VFP registers to be saved was non-contiguous (so multiple
vpush/vpop instructions were needed) these were being ordered oddly, as in:
vpush {d8, d9}
vpush {d11}
This led to the layout in memory being [d11, d8, d9] which is ugly and doesn't
match the CFI_INSTRUCTIONs we're generating either (so Dwarf info would be
broken).
This switches the order of vpush/vpop (in both prologue and epilogue,
obviously) so that the Dwarf locations are correct again.
rdar://problem/16264856
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203655 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMFrameLowering.cpp')
-rw-r--r-- | lib/Target/ARM/ARMFrameLowering.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMFrameLowering.cpp b/lib/Target/ARM/ARMFrameLowering.cpp index c35cd23b91..dcae66bc85 100644 --- a/lib/Target/ARM/ARMFrameLowering.cpp +++ b/lib/Target/ARM/ARMFrameLowering.cpp @@ -803,6 +803,11 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB, AddDefaultPred(MIB); } Regs.clear(); + + // Put any subsequent vpush instructions before this one: they will refer to + // higher register numbers so need to be pushed first in order to preserve + // monotonicity. + --MI; } } @@ -886,6 +891,10 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB, AddDefaultPred(MIB); } Regs.clear(); + + // Put any subsequent vpop instructions after this one: they will refer to + // higher register numbers so need to be popped afterwards. + ++MI; } } |