diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 7 | 
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)>;  | 

