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 | 728fd18c0fc8f5a578786644234a46d69e97f819 (patch) | |
| tree | c8ca804caec3947a289e169586b19cd7270d54f8 /lib | |
| parent | e12c067c83f3c533189ccd8844945e5da80b6295 (diff) | |
| download | external_llvm-728fd18c0fc8f5a578786644234a46d69e97f819.zip external_llvm-728fd18c0fc8f5a578786644234a46d69e97f819.tar.gz external_llvm-728fd18c0fc8f5a578786644234a46d69e97f819.tar.bz2 | |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79553 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Target/X86/X86ISelDAGToDAG.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 394a61c..b020e43 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/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; } |
