summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-08-20 18:23:44 +0000
committerDan Gohman <gohman@apple.com>2009-08-20 18:23:44 +0000
commit05046085b6e0b9269c1586901656a301ba8e419a (patch)
tree68743b23844ce68386b8e050fe45d5bfbce81bab /llvm/lib
parentb841d1baa1d28267343a861f001a468ce1a96e9b (diff)
downloadbcm5719-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.cpp13
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;
}
OpenPOWER on IntegriCloud