diff options
author | Jim Grosbach <grosbach@apple.com> | 2010-04-06 20:26:37 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2010-04-06 20:26:37 +0000 |
commit | fa85eb62378900a884a7eb4933a9deb6513d26ab (patch) | |
tree | ba680cbed4da06d765a15ea16ed65e7bbb845298 /lib/Target/X86/X86.h | |
parent | aa59c88a6e963cf0f71511ae81784da2873dbc78 (diff) |
Fix PR6696 and PR6663
When a frame pointer is not otherwise required, and dynamic stack alignment
is necessary solely due to the spilling of a register with larger alignment
requirements than the default stack alignment, the frame pointer can be both
used as a general purpose register and a frame pointer. That goes poorly, for
obvious reasons. This patch brings back a bit of old logic for identifying
the use of such registers and conservatively reserves the frame pointer
during register allocation in such cases.
For now, implement for X86 only since it's 32-bit linux which is hitting this,
and we want a targeted fix for 2.7. As a follow-on, this will be expanded
to handle other targets, as theoretically the problem could arise elsewhere
as well.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100559 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86.h')
-rw-r--r-- | lib/Target/X86/X86.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/Target/X86/X86.h b/lib/Target/X86/X86.h index 9be38a4b56..22e89a57f6 100644 --- a/lib/Target/X86/X86.h +++ b/lib/Target/X86/X86.h @@ -69,6 +69,12 @@ TargetAsmBackend *createX86_64AsmBackend(const Target &, const std::string &); /// FunctionPass *createEmitX86CodeToMemory(); +/// createX86MaxStackAlignmentHeuristicPass - This function returns a pass +/// which determines whether the frame pointer register should be +/// reserved in case dynamic stack alignment is later required. +/// +FunctionPass *createX86MaxStackAlignmentHeuristicPass(); + extern Target TheX86_32Target, TheX86_64Target; } // End llvm namespace |