From: Evan Cheng Date: Thu, 12 Jan 2006 07:56:47 +0000 (+0000) Subject: * Materialize GlobalAddress and ExternalSym with MOV32ri rather than X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=002fe9baf2bdc50532c6238b92ac46191fd01c38;p=oota-llvm.git * Materialize GlobalAddress and ExternalSym with MOV32ri rather than LEA32r. * Do not lower GlobalAddress to TargetGlobalAddress. Let isel does it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25246 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 25ac370da9a..8b15727aaeb 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/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(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().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/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td index 9de818543bb..d6dc20a7a8b 100644 --- a/lib/Target/X86/X86InstrInfo.td +++ b/lib/Target/X86/X86InstrInfo.td @@ -153,8 +153,7 @@ def brtarget : Operand; // Define X86 specific addressing mode. def addr : ComplexPattern; def leaaddr : ComplexPattern; + [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)>;