diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2010-03-25 00:10:31 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2010-03-25 00:10:31 +0000 |
| commit | b07a29ecd4ca4f96b7f7f9731a761c58b7b1a9eb (patch) | |
| tree | 88bc7b6baf8bd998e6acab825f5dd8dca4561ae2 /clang/lib/Sema/SemaCXXCast.cpp | |
| parent | 2a020358dcc2e9b50dba411686e3a58a2766ad72 (diff) | |
| download | bcm5719-llvm-b07a29ecd4ca4f96b7f7f9731a761c58b7b1a9eb.tar.gz bcm5719-llvm-b07a29ecd4ca4f96b7f7f9731a761c58b7b1a9eb.zip | |
Disable folding loads into tail call in 32-bit PIC mode. It can introduce illegal code like this:
addl $12, %esp
popl %esi
popl %edi
popl %ebx
popl %ebp
jmpl *__Block_deallocator-L1$pb(%esi) # TAILCALL
The problem is the global base register is assigned GR32 register class. TCRETURNmi needs the registers making up the address mode to have the GR32_TC register class.
The *proper* fix is for X86DAGToDAGISel::getGlobalBaseReg() to return a copy from the global base register of the machine function rather than returning the register itself. But that has the potential of causing it to be coalesced to a more restrictive register class: GR32_TC. It can introduce additional copies and spills. For something as important the PIC base, it's not worth it especially since this is not an issue on 64-bit.
llvm-svn: 99455
Diffstat (limited to 'clang/lib/Sema/SemaCXXCast.cpp')
0 files changed, 0 insertions, 0 deletions

