Correct PPC FRAMEADDR lowering using a pseudo-register
authorHal Finkel <hfinkel@anl.gov>
Thu, 21 Mar 2013 19:03:19 +0000 (19:03 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 21 Mar 2013 19:03:19 +0000 (19:03 +0000)
commite9cc0a09ae38c87b1b26a44f5e32222ede4f84e6
tree42e21d6c6941660042c344100602c339cb80b3bf
parent3382a840747c42c4a98eac802ee7b347a8ded1e4
Correct PPC FRAMEADDR lowering using a pseudo-register

The old code used to lower FRAMEADDR tried to replicate the logic in the real
frame-lowering code that determines whether or not the frame pointer (r31) will
be used. When it seemed as through the frame pointer would not be used, the
stack pointer (r1) was used instead. Unfortunately, because the stack size is
not yet known, this does not work. Instead, this change introduces new
always-reserved pseudo-registers (FP and FP8) that are replaced during prologue
insertion with the real frame-pointer register (either r1 or r31).

It is important that this intrinsic always return a valid frame address because
it is used by Clang to store the frame address as part of code generation for
__builtin_setjmp.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177653 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/PowerPC/PPCFrameLowering.cpp
lib/Target/PowerPC/PPCFrameLowering.h
lib/Target/PowerPC/PPCISelLowering.cpp
lib/Target/PowerPC/PPCRegisterInfo.cpp
lib/Target/PowerPC/PPCRegisterInfo.td
test/CodeGen/PowerPC/frameaddr.ll [new file with mode: 0644]