summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-01-12 07:56:47 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-01-12 07:56:47 +0000
commitb94db9e9a4e32c19a553311fc29be8806fa72f46 (patch)
treef088d5a8e41cb8f0c25edfa21cb26696c2c3dff7 /llvm/lib
parente6300aaabc081d9e1421a170e621aafdc011c912 (diff)
downloadbcm5719-llvm-b94db9e9a4e32c19a553311fc29be8806fa72f46.tar.gz
bcm5719-llvm-b94db9e9a4e32c19a553311fc29be8806fa72f46.zip
* Materialize GlobalAddress and ExternalSym with MOV32ri rather than
LEA32r. * Do not lower GlobalAddress to TargetGlobalAddress. Let isel does it. llvm-svn: 25246
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp11
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.td7
2 files changed, 10 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 25ac370da9a..8b15727aaeb 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -1723,8 +1723,8 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
DAG.getValueType(AVT), InFlag);
}
case ISD::GlobalAddress: {
+ SDOperand Result;
GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
- SDOperand GVOp = DAG.getTargetGlobalAddress(GV, getPointerTy());
// For Darwin, external and weak symbols are indirect, so we want to load
// the value at address GV, not the value of GV itself. This means that
// the GlobalAddress must be in the base or index register of the address,
@@ -1732,11 +1732,10 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
if (getTargetMachine().
getSubtarget<X86Subtarget>().getIndirectExternAndWeakGlobals() &&
(GV->hasWeakLinkage() || GV->isExternal()))
- return DAG.getLoad(MVT::i32, DAG.getEntryNode(),
- GVOp, DAG.getSrcValue(NULL));
- else
- return GVOp;
- break;
+ Result = DAG.getLoad(MVT::i32, DAG.getEntryNode(),
+ DAG.getTargetGlobalAddress(GV, getPointerTy()),
+ DAG.getSrcValue(NULL));
+ return Result;
}
}
}
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td
index 9de818543bb..d6dc20a7a8b 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.td
+++ b/llvm/lib/Target/X86/X86InstrInfo.td
@@ -153,8 +153,7 @@ def brtarget : Operand<OtherVT>;
// Define X86 specific addressing mode.
def addr : ComplexPattern<i32, 4, "SelectAddr", []>;
def leaaddr : ComplexPattern<i32, 4, "SelectLEAAddr",
- [add, frameindex, constpool,
- globaladdr, tglobaladdr, externalsym]>;
+ [add, frameindex, constpool]>;
//===----------------------------------------------------------------------===//
// X86 Instruction Format Definitions.
@@ -2958,6 +2957,10 @@ def RDTSC : I<0x31, RawFrm, (ops), "rdtsc", [(X86rdtsc)]>,
// Non-Instruction Patterns
//===----------------------------------------------------------------------===//
+// GlobalAddress and ExternalSymbol
+def : Pat<(i32 globaladdr:$dst), (MOV32ri globaladdr:$dst)>;
+def : Pat<(i32 externalsym:$dst), (MOV32ri externalsym:$dst)>;
+
// Calls
def : Pat<(X86call tglobaladdr:$dst),
(CALLpcrel32 tglobaladdr:$dst)>;
OpenPOWER on IntegriCloud