diff options
author | Dan Gohman <gohman@apple.com> | 2009-08-20 18:23:44 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-08-20 18:23:44 +0000 |
commit | 05046085b6e0b9269c1586901656a301ba8e419a (patch) | |
tree | 68743b23844ce68386b8e050fe45d5bfbce81bab /llvm/lib | |
parent | b841d1baa1d28267343a861f001a468ce1a96e9b (diff) | |
download | bcm5719-llvm-05046085b6e0b9269c1586901656a301ba8e419a.tar.gz bcm5719-llvm-05046085b6e0b9269c1586901656a301ba8e419a.zip |
Fix an x86 code size regression: prefer RIP-relative addressing
over absolute addressing even in non-PIC mode (unless the address
has an index or something else incompatible), because it has a
smaller encoding.
llvm-svn: 79553
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 394a61c7bcc..b020e433331 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -813,6 +813,19 @@ bool X86DAGToDAGISel::MatchAddress(SDValue N, X86ISelAddressMode &AM) { AM.Scale = 1; } + // Post-processing: Convert foo to foo(%rip), even in non-PIC mode, + // because it has a smaller encoding. + // TODO: Which other code models can use this? + if (TM.getCodeModel() == CodeModel::Small && + Subtarget->is64Bit() && + AM.Scale == 1 && + AM.BaseType == X86ISelAddressMode::RegBase && + AM.Base.Reg.getNode() == 0 && + AM.IndexReg.getNode() == 0 && + AM.SymbolFlags == 0 && + AM.hasSymbolicDisplacement()) + AM.Base.Reg = CurDAG->getRegister(X86::RIP, MVT::i64); + return false; } |