diff options
Diffstat (limited to 'lib/Target/PowerPC/PPCISelLowering.cpp')
| -rw-r--r-- | lib/Target/PowerPC/PPCISelLowering.cpp | 731 | 
1 files changed, 380 insertions, 351 deletions
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 14d1b154a5c9..8f623b859b55 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -38,17 +38,17 @@  #include "llvm/DerivedTypes.h"  using namespace llvm; -static bool CC_PPC_SVR4_Custom_Dummy(unsigned &ValNo, EVT &ValVT, EVT &LocVT, +static bool CC_PPC_SVR4_Custom_Dummy(unsigned &ValNo, MVT &ValVT, MVT &LocVT,                                       CCValAssign::LocInfo &LocInfo,                                       ISD::ArgFlagsTy &ArgFlags,                                       CCState &State); -static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, EVT &ValVT, -                                            EVT &LocVT, +static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, MVT &ValVT, +                                            MVT &LocVT,                                              CCValAssign::LocInfo &LocInfo,                                              ISD::ArgFlagsTy &ArgFlags,                                              CCState &State); -static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, EVT &ValVT, -                                              EVT &LocVT, +static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, MVT &ValVT, +                                              MVT &LocVT,                                                CCValAssign::LocInfo &LocInfo,                                                ISD::ArgFlagsTy &ArgFlags,                                                CCState &State); @@ -73,6 +73,10 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)    setUseUnderscoreSetJmp(true);    setUseUnderscoreLongJmp(true); +  // On PPC32/64, arguments smaller than 4/8 bytes are extended, so all +  // arguments are at least 4/8 bytes aligned. +  setMinStackArgumentAlignment(TM.getSubtarget<PPCSubtarget>().isPPC64() ? 8:4); +    // Set up the register classes.    addRegisterClass(MVT::i32, PPC::GPRCRegisterClass);    addRegisterClass(MVT::f32, PPC::F4RCRegisterClass); @@ -174,10 +178,10 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)    setOperationAction(ISD::SINT_TO_FP, MVT::i32, Expand);    setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand); -  setOperationAction(ISD::BIT_CONVERT, MVT::f32, Expand); -  setOperationAction(ISD::BIT_CONVERT, MVT::i32, Expand); -  setOperationAction(ISD::BIT_CONVERT, MVT::i64, Expand); -  setOperationAction(ISD::BIT_CONVERT, MVT::f64, Expand); +  setOperationAction(ISD::BITCAST, MVT::f32, Expand); +  setOperationAction(ISD::BITCAST, MVT::i32, Expand); +  setOperationAction(ISD::BITCAST, MVT::i64, Expand); +  setOperationAction(ISD::BITCAST, MVT::f64, Expand);    // We cannot sextinreg(i1).  Expand to shifts.    setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand); @@ -545,7 +549,7 @@ static bool isVMerge(ShuffleVectorSDNode *N, unsigned UnitSize,  /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for  /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes). -bool PPC::isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,  +bool PPC::isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,                               bool isUnary) {    if (!isUnary)      return isVMerge(N, UnitSize, 8, 24); @@ -554,7 +558,7 @@ bool PPC::isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,  /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for  /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes). -bool PPC::isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,  +bool PPC::isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,                               bool isUnary) {    if (!isUnary)      return isVMerge(N, UnitSize, 0, 16); @@ -569,7 +573,7 @@ int PPC::isVSLDOIShuffleMask(SDNode *N, bool isUnary) {           "PPC only supports shuffles by bytes!");    ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(N); -   +    // Find the first non-undef value in the shuffle mask.    unsigned i;    for (i = 0; i != 16 && SVOp->getMaskElt(i) < 0; ++i) @@ -607,7 +611,7 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {    // This is a splat operation if each element of the permute is the same, and    // if the value doesn't reference the second vector.    unsigned ElementBase = N->getMaskElt(0); -   +    // FIXME: Handle UNDEF elements too!    if (ElementBase >= 16)      return false; @@ -635,7 +639,7 @@ bool PPC::isAllNegativeZeroVector(SDNode *N) {    APInt APVal, APUndef;    unsigned BitSize;    bool HasAnyUndefs; -   +    if (BV->isConstantSplat(APVal, APUndef, BitSize, HasAnyUndefs, 32, true))      if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(N->getOperand(0)))        return CFP->getValueAPF().isNegZero(); @@ -1054,7 +1058,6 @@ bool PPCTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,      VT = LD->getMemoryVT();    } else if (StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) { -    ST = ST;      Ptr = ST->getBasePtr();      VT  = ST->getMemoryVT();    } else @@ -1094,158 +1097,126 @@ bool PPCTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,  //  LowerOperation implementation  //===----------------------------------------------------------------------===// -SDValue PPCTargetLowering::LowerConstantPool(SDValue Op, -                                             SelectionDAG &DAG) const { -  EVT PtrVT = Op.getValueType(); -  ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op); -  const Constant *C = CP->getConstVal(); -  SDValue CPI = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment()); -  SDValue Zero = DAG.getConstant(0, PtrVT); -  // FIXME there isn't really any debug info here -  DebugLoc dl = Op.getDebugLoc(); - -  const TargetMachine &TM = DAG.getTarget(); - -  SDValue Hi = DAG.getNode(PPCISD::Hi, dl, PtrVT, CPI, Zero); -  SDValue Lo = DAG.getNode(PPCISD::Lo, dl, PtrVT, CPI, Zero); - -  // If this is a non-darwin platform, we don't support non-static relo models -  // yet. -  if (TM.getRelocationModel() == Reloc::Static || -      !TM.getSubtarget<PPCSubtarget>().isDarwin()) { -    // Generate non-pic code that has direct accesses to the constant pool. -    // The address of the global is just (hi(&g)+lo(&g)). -    return DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); +/// GetLabelAccessInfo - Return true if we should reference labels using a +/// PICBase, set the HiOpFlags and LoOpFlags to the target MO flags. +static bool GetLabelAccessInfo(const TargetMachine &TM, unsigned &HiOpFlags, +                               unsigned &LoOpFlags, const GlobalValue *GV = 0) { +  HiOpFlags = PPCII::MO_HA16; +  LoOpFlags = PPCII::MO_LO16; + +  // Don't use the pic base if not in PIC relocation model.  Or if we are on a +  // non-darwin platform.  We don't support PIC on other platforms yet. +  bool isPIC = TM.getRelocationModel() == Reloc::PIC_ && +               TM.getSubtarget<PPCSubtarget>().isDarwin(); +  if (isPIC) { +    HiOpFlags |= PPCII::MO_PIC_FLAG; +    LoOpFlags |= PPCII::MO_PIC_FLAG;    } -  if (TM.getRelocationModel() == Reloc::PIC_) { -    // With PIC, the first instruction is actually "GR+hi(&G)". -    Hi = DAG.getNode(ISD::ADD, dl, PtrVT, -                     DAG.getNode(PPCISD::GlobalBaseReg, -                                 DebugLoc(), PtrVT), Hi); +  // If this is a reference to a global value that requires a non-lazy-ptr, make +  // sure that instruction lowering adds it. +  if (GV && TM.getSubtarget<PPCSubtarget>().hasLazyResolverStub(GV, TM)) { +    HiOpFlags |= PPCII::MO_NLP_FLAG; +    LoOpFlags |= PPCII::MO_NLP_FLAG; + +    if (GV->hasHiddenVisibility()) { +      HiOpFlags |= PPCII::MO_NLP_HIDDEN_FLAG; +      LoOpFlags |= PPCII::MO_NLP_HIDDEN_FLAG; +    }    } -  Lo = DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); -  return Lo; +  return isPIC;  } -SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const { -  EVT PtrVT = Op.getValueType(); -  JumpTableSDNode *JT = cast<JumpTableSDNode>(Op); -  SDValue JTI = DAG.getTargetJumpTable(JT->getIndex(), PtrVT); +static SDValue LowerLabelRef(SDValue HiPart, SDValue LoPart, bool isPIC, +                             SelectionDAG &DAG) { +  EVT PtrVT = HiPart.getValueType();    SDValue Zero = DAG.getConstant(0, PtrVT); -  // FIXME there isn't really any debug loc here -  DebugLoc dl = Op.getDebugLoc(); +  DebugLoc DL = HiPart.getDebugLoc(); -  const TargetMachine &TM = DAG.getTarget(); +  SDValue Hi = DAG.getNode(PPCISD::Hi, DL, PtrVT, HiPart, Zero); +  SDValue Lo = DAG.getNode(PPCISD::Lo, DL, PtrVT, LoPart, Zero); -  SDValue Hi = DAG.getNode(PPCISD::Hi, dl, PtrVT, JTI, Zero); -  SDValue Lo = DAG.getNode(PPCISD::Lo, dl, PtrVT, JTI, Zero); +  // With PIC, the first instruction is actually "GR+hi(&G)". +  if (isPIC) +    Hi = DAG.getNode(ISD::ADD, DL, PtrVT, +                     DAG.getNode(PPCISD::GlobalBaseReg, DL, PtrVT), Hi); -  // If this is a non-darwin platform, we don't support non-static relo models -  // yet. -  if (TM.getRelocationModel() == Reloc::Static || -      !TM.getSubtarget<PPCSubtarget>().isDarwin()) { -    // Generate non-pic code that has direct accesses to the constant pool. -    // The address of the global is just (hi(&g)+lo(&g)). -    return DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); -  } +  // Generate non-pic code that has direct accesses to the constant pool. +  // The address of the global is just (hi(&g)+lo(&g)). +  return DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Lo); +} -  if (TM.getRelocationModel() == Reloc::PIC_) { -    // With PIC, the first instruction is actually "GR+hi(&G)". -    Hi = DAG.getNode(ISD::ADD, dl, PtrVT, -                     DAG.getNode(PPCISD::GlobalBaseReg, -                                 DebugLoc(), PtrVT), Hi); -  } +SDValue PPCTargetLowering::LowerConstantPool(SDValue Op, +                                             SelectionDAG &DAG) const { +  EVT PtrVT = Op.getValueType(); +  ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op); +  const Constant *C = CP->getConstVal(); -  Lo = DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); -  return Lo; +  unsigned MOHiFlag, MOLoFlag; +  bool isPIC = GetLabelAccessInfo(DAG.getTarget(), MOHiFlag, MOLoFlag); +  SDValue CPIHi = +    DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(), 0, MOHiFlag); +  SDValue CPILo = +    DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment(), 0, MOLoFlag); +  return LowerLabelRef(CPIHi, CPILo, isPIC, DAG);  } -SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op, -                                                 SelectionDAG &DAG) const { -  llvm_unreachable("TLS not implemented for PPC."); -  return SDValue(); // Not reached +SDValue PPCTargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) const { +  EVT PtrVT = Op.getValueType(); +  JumpTableSDNode *JT = cast<JumpTableSDNode>(Op); + +  unsigned MOHiFlag, MOLoFlag; +  bool isPIC = GetLabelAccessInfo(DAG.getTarget(), MOHiFlag, MOLoFlag); +  SDValue JTIHi = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MOHiFlag); +  SDValue JTILo = DAG.getTargetJumpTable(JT->getIndex(), PtrVT, MOLoFlag); +  return LowerLabelRef(JTIHi, JTILo, isPIC, DAG);  }  SDValue PPCTargetLowering::LowerBlockAddress(SDValue Op,                                               SelectionDAG &DAG) const {    EVT PtrVT = Op.getValueType(); -  DebugLoc DL = Op.getDebugLoc();    const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress(); -  SDValue TgtBA = DAG.getBlockAddress(BA, PtrVT, /*isTarget=*/true); -  SDValue Zero = DAG.getConstant(0, PtrVT); -  SDValue Hi = DAG.getNode(PPCISD::Hi, DL, PtrVT, TgtBA, Zero); -  SDValue Lo = DAG.getNode(PPCISD::Lo, DL, PtrVT, TgtBA, Zero); - -  // If this is a non-darwin platform, we don't support non-static relo models -  // yet. -  const TargetMachine &TM = DAG.getTarget(); -  if (TM.getRelocationModel() == Reloc::Static || -      !TM.getSubtarget<PPCSubtarget>().isDarwin()) { -    // Generate non-pic code that has direct accesses to globals. -    // The address of the global is just (hi(&g)+lo(&g)). -    return DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Lo); -  } -  if (TM.getRelocationModel() == Reloc::PIC_) { -    // With PIC, the first instruction is actually "GR+hi(&G)". -    Hi = DAG.getNode(ISD::ADD, DL, PtrVT, -                     DAG.getNode(PPCISD::GlobalBaseReg, -                                 DebugLoc(), PtrVT), Hi); -  } - -  return DAG.getNode(ISD::ADD, DL, PtrVT, Hi, Lo); +  unsigned MOHiFlag, MOLoFlag; +  bool isPIC = GetLabelAccessInfo(DAG.getTarget(), MOHiFlag, MOLoFlag); +  SDValue TgtBAHi = DAG.getBlockAddress(BA, PtrVT, /*isTarget=*/true, MOHiFlag); +  SDValue TgtBALo = DAG.getBlockAddress(BA, PtrVT, /*isTarget=*/true, MOLoFlag); +  return LowerLabelRef(TgtBAHi, TgtBALo, isPIC, DAG);  }  SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op,                                                SelectionDAG &DAG) const {    EVT PtrVT = Op.getValueType();    GlobalAddressSDNode *GSDN = cast<GlobalAddressSDNode>(Op); -  // FIXME there isn't really any debug info here -  DebugLoc dl = GSDN->getDebugLoc(); +  DebugLoc DL = GSDN->getDebugLoc();    const GlobalValue *GV = GSDN->getGlobal(); -  SDValue GA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, GSDN->getOffset()); -  SDValue Zero = DAG.getConstant(0, PtrVT); - -  const TargetMachine &TM = DAG.getTarget();    // 64-bit SVR4 ABI code is always position-independent.    // The actual address of the GlobalValue is stored in the TOC.    if (PPCSubTarget.isSVR4ABI() && PPCSubTarget.isPPC64()) { -    return DAG.getNode(PPCISD::TOC_ENTRY, dl, MVT::i64, GA, +    SDValue GA = DAG.getTargetGlobalAddress(GV, DL, PtrVT, GSDN->getOffset()); +    return DAG.getNode(PPCISD::TOC_ENTRY, DL, MVT::i64, GA,                         DAG.getRegister(PPC::X2, MVT::i64));    } -  SDValue Hi = DAG.getNode(PPCISD::Hi, dl, PtrVT, GA, Zero); -  SDValue Lo = DAG.getNode(PPCISD::Lo, dl, PtrVT, GA, Zero); - -  // If this is a non-darwin platform, we don't support non-static relo models -  // yet. -  if (TM.getRelocationModel() == Reloc::Static || -      !TM.getSubtarget<PPCSubtarget>().isDarwin()) { -    // Generate non-pic code that has direct accesses to globals. -    // The address of the global is just (hi(&g)+lo(&g)). -    return DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); -  } - -  if (TM.getRelocationModel() == Reloc::PIC_) { -    // With PIC, the first instruction is actually "GR+hi(&G)". -    Hi = DAG.getNode(ISD::ADD, dl, PtrVT, -                     DAG.getNode(PPCISD::GlobalBaseReg, -                                 DebugLoc(), PtrVT), Hi); -  } +  unsigned MOHiFlag, MOLoFlag; +  bool isPIC = GetLabelAccessInfo(DAG.getTarget(), MOHiFlag, MOLoFlag, GV); -  Lo = DAG.getNode(ISD::ADD, dl, PtrVT, Hi, Lo); +  SDValue GAHi = +    DAG.getTargetGlobalAddress(GV, DL, PtrVT, GSDN->getOffset(), MOHiFlag); +  SDValue GALo = +    DAG.getTargetGlobalAddress(GV, DL, PtrVT, GSDN->getOffset(), MOLoFlag); -  if (!TM.getSubtarget<PPCSubtarget>().hasLazyResolverStub(GV, TM)) -    return Lo; +  SDValue Ptr = LowerLabelRef(GAHi, GALo, isPIC, DAG); -  // If the global is weak or external, we have to go through the lazy -  // resolution stub. -  return DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Lo, NULL, 0, -                     false, false, 0); +  // If the global reference is actually to a non-lazy-pointer, we have to do an +  // extra load to get the address of the global. +  if (MOHiFlag & PPCII::MO_NLP_FLAG) +    Ptr = DAG.getLoad(PtrVT, DL, DAG.getEntryNode(), Ptr, MachinePointerInfo(), +                      false, false, 0); +  return Ptr;  }  SDValue PPCTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const { @@ -1353,7 +1324,8 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,      EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();      SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);      const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue(); -    return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0, +    return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), +                        MachinePointerInfo(SV),                          false, false, 0);    } @@ -1406,43 +1378,47 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,    // Store first byte : number of int regs    SDValue firstStore = DAG.getTruncStore(Op.getOperand(0), dl, ArgGPR, -                                         Op.getOperand(1), SV, 0, MVT::i8, -                                         false, false, 0); +                                         Op.getOperand(1), +                                         MachinePointerInfo(SV), +                                         MVT::i8, false, false, 0);    uint64_t nextOffset = FPROffset;    SDValue nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, Op.getOperand(1),                                    ConstFPROffset);    // Store second byte : number of float regs    SDValue secondStore = -    DAG.getTruncStore(firstStore, dl, ArgFPR, nextPtr, SV, nextOffset, MVT::i8, +    DAG.getTruncStore(firstStore, dl, ArgFPR, nextPtr, +                      MachinePointerInfo(SV, nextOffset), MVT::i8,                        false, false, 0);    nextOffset += StackOffset;    nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, nextPtr, ConstStackOffset);    // Store second word : arguments given on stack    SDValue thirdStore = -    DAG.getStore(secondStore, dl, StackOffsetFI, nextPtr, SV, nextOffset, +    DAG.getStore(secondStore, dl, StackOffsetFI, nextPtr, +                 MachinePointerInfo(SV, nextOffset),                   false, false, 0);    nextOffset += FrameOffset;    nextPtr = DAG.getNode(ISD::ADD, dl, PtrVT, nextPtr, ConstFrameOffset);    // Store third word : arguments given in registers -  return DAG.getStore(thirdStore, dl, FR, nextPtr, SV, nextOffset, +  return DAG.getStore(thirdStore, dl, FR, nextPtr, +                      MachinePointerInfo(SV, nextOffset),                        false, false, 0);  }  #include "PPCGenCallingConv.inc" -static bool CC_PPC_SVR4_Custom_Dummy(unsigned &ValNo, EVT &ValVT, EVT &LocVT, +static bool CC_PPC_SVR4_Custom_Dummy(unsigned &ValNo, MVT &ValVT, MVT &LocVT,                                       CCValAssign::LocInfo &LocInfo,                                       ISD::ArgFlagsTy &ArgFlags,                                       CCState &State) {    return true;  } -static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, EVT &ValVT, -                                            EVT &LocVT, +static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, MVT &ValVT, +                                            MVT &LocVT,                                              CCValAssign::LocInfo &LocInfo,                                              ISD::ArgFlagsTy &ArgFlags,                                              CCState &State) { @@ -1451,7 +1427,7 @@ static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, EVT &ValVT,      PPC::R7, PPC::R8, PPC::R9, PPC::R10,    };    const unsigned NumArgRegs = array_lengthof(ArgRegs); -   +    unsigned RegNum = State.getFirstUnallocated(ArgRegs, NumArgRegs);    // Skip one register if the first unallocated register has an even register @@ -1461,15 +1437,15 @@ static bool CC_PPC_SVR4_Custom_AlignArgRegs(unsigned &ValNo, EVT &ValVT,    if (RegNum != NumArgRegs && RegNum % 2 == 1) {      State.AllocateReg(ArgRegs[RegNum]);    } -   +    // Always return false here, as this function only makes sure that the first    // unallocated register has an odd register number and does not actually    // allocate a register for the current argument.    return false;  } -static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, EVT &ValVT, -                                              EVT &LocVT, +static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, MVT &ValVT, +                                              MVT &LocVT,                                                CCValAssign::LocInfo &LocInfo,                                                ISD::ArgFlagsTy &ArgFlags,                                                CCState &State) { @@ -1479,7 +1455,7 @@ static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, EVT &ValVT,    };    const unsigned NumArgRegs = array_lengthof(ArgRegs); -   +    unsigned RegNum = State.getFirstUnallocated(ArgRegs, NumArgRegs);    // If there is only one Floating-point register left we need to put both f64 @@ -1487,7 +1463,7 @@ static bool CC_PPC_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, EVT &ValVT,    if (RegNum != NumArgRegs && ArgRegs[RegNum] == PPC::F8) {      State.AllocateReg(ArgRegs[RegNum]);    } -   +    // Always return false here, as this function only makes sure that the two f64    // values a ppc_fp128 value is split into are both passed in registers or both    // passed on the stack and does not actually allocate a register for the @@ -1572,7 +1548,7 @@ PPCTargetLowering::LowerFormalArguments_SVR4(    // Specifications:    //   System V Application Binary Interface PowerPC Processor Supplement    //   AltiVec Technology Programming Interface Manual -   +    MachineFunction &MF = DAG.getMachineFunction();    MachineFrameInfo *MFI = MF.getFrameInfo();    PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>(); @@ -1588,18 +1564,18 @@ PPCTargetLowering::LowerFormalArguments_SVR4(                   *DAG.getContext());    // Reserve space for the linkage area on the stack. -  CCInfo.AllocateStack(PPCFrameInfo::getLinkageSize(false, false), PtrByteSize); +  CCInfo.AllocateStack(PPCFrameLowering::getLinkageSize(false, false), PtrByteSize);    CCInfo.AnalyzeFormalArguments(Ins, CC_PPC_SVR4); -   +    for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {      CCValAssign &VA = ArgLocs[i]; -     +      // Arguments stored in registers.      if (VA.isRegLoc()) {        TargetRegisterClass *RC;        EVT ValVT = VA.getValVT(); -       +        switch (ValVT.getSimpleVT().SimpleTy) {          default:            llvm_unreachable("ValVT not supported by formal arguments Lowering"); @@ -1619,9 +1595,9 @@ PPCTargetLowering::LowerFormalArguments_SVR4(            RC = PPC::VRRCRegisterClass;            break;        } -       +        // Transform the arguments stored in physical registers into virtual ones. -      unsigned Reg = MF.addLiveIn(VA.getLocReg(), RC); +      unsigned Reg = MF.addLiveIn(VA.getLocReg(), RC, dl);        SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, ValVT);        InVals.push_back(ArgValue); @@ -1635,7 +1611,8 @@ PPCTargetLowering::LowerFormalArguments_SVR4(        // Create load nodes to retrieve arguments from the stack.        SDValue FIN = DAG.getFrameIndex(FI, PtrVT); -      InVals.push_back(DAG.getLoad(VA.getValVT(), dl, Chain, FIN, NULL, 0, +      InVals.push_back(DAG.getLoad(VA.getValVT(), dl, Chain, FIN, +                                   MachinePointerInfo(),                                     false, false, 0));      }    } @@ -1654,7 +1631,7 @@ PPCTargetLowering::LowerFormalArguments_SVR4(    // Area that is at least reserved in the caller of this function.    unsigned MinReservedArea = CCByValInfo.getNextStackOffset(); -   +    // Set the size that is at least reserved in caller of this function.  Tail    // call optimized function's reserved stack space needs to be aligned so that    // taking the difference between two stack areas will result in an aligned @@ -1663,17 +1640,17 @@ PPCTargetLowering::LowerFormalArguments_SVR4(    MinReservedArea =      std::max(MinReservedArea, -             PPCFrameInfo::getMinCallFrameSize(false, false)); -   -  unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameInfo()-> +             PPCFrameLowering::getMinCallFrameSize(false, false)); + +  unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameLowering()->      getStackAlignment();    unsigned AlignMask = TargetAlign-1;    MinReservedArea = (MinReservedArea + AlignMask) & ~AlignMask; -   +    FI->setMinReservedArea(MinReservedArea);    SmallVector<SDValue, 8> MemOps; -   +    // If the function takes variable number of arguments, make a frame index for    // the start of the first vararg value... for expansion of llvm.va_start.    if (isVarArg) { @@ -1705,28 +1682,18 @@ PPCTargetLowering::LowerFormalArguments_SVR4(      FuncInfo->setVarArgsFrameIndex(MFI->CreateStackObject(Depth, 8, false));      SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT); -    // The fixed integer arguments of a variadic function are -    // stored to the VarArgsFrameIndex on the stack. -    unsigned GPRIndex = 0; -    for (; GPRIndex != FuncInfo->getVarArgsNumGPR(); ++GPRIndex) { -      SDValue Val = DAG.getRegister(GPArgRegs[GPRIndex], PtrVT); -      SDValue Store = DAG.getStore(Chain, dl, Val, FIN, NULL, 0, -                                   false, false, 0); -      MemOps.push_back(Store); -      // Increment the address by four for the next argument to store -      SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, PtrVT); -      FIN = DAG.getNode(ISD::ADD, dl, PtrOff.getValueType(), FIN, PtrOff); -    } - -    // If this function is vararg, store any remaining integer argument regs -    // to their spots on the stack so that they may be loaded by deferencing the -    // result of va_next. -    for (; GPRIndex != NumGPArgRegs; ++GPRIndex) { -      unsigned VReg = MF.addLiveIn(GPArgRegs[GPRIndex], &PPC::GPRCRegClass); +    // The fixed integer arguments of a variadic function are stored to the +    // VarArgsFrameIndex on the stack so that they may be loaded by deferencing +    // the result of va_next. +    for (unsigned GPRIndex = 0; GPRIndex != NumGPArgRegs; ++GPRIndex) { +      // Get an existing live-in vreg, or add a new one. +      unsigned VReg = MF.getRegInfo().getLiveInVirtReg(GPArgRegs[GPRIndex]); +      if (!VReg) +        VReg = MF.addLiveIn(GPArgRegs[GPRIndex], &PPC::GPRCRegClass, dl);        SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT); -      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, NULL, 0, -                                   false, false, 0); +      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, +                                   MachinePointerInfo(), false, false, 0);        MemOps.push_back(Store);        // Increment the address by four for the next argument to store        SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, PtrVT); @@ -1735,27 +1702,17 @@ PPCTargetLowering::LowerFormalArguments_SVR4(      // FIXME 32-bit SVR4: We only need to save FP argument registers if CR bit 6      // is set. -          // The double arguments are stored to the VarArgsFrameIndex      // on the stack. -    unsigned FPRIndex = 0; -    for (FPRIndex = 0; FPRIndex != FuncInfo->getVarArgsNumFPR(); ++FPRIndex) { -      SDValue Val = DAG.getRegister(FPArgRegs[FPRIndex], MVT::f64); -      SDValue Store = DAG.getStore(Chain, dl, Val, FIN, NULL, 0, -                                   false, false, 0); -      MemOps.push_back(Store); -      // Increment the address by eight for the next argument to store -      SDValue PtrOff = DAG.getConstant(EVT(MVT::f64).getSizeInBits()/8, -                                         PtrVT); -      FIN = DAG.getNode(ISD::ADD, dl, PtrOff.getValueType(), FIN, PtrOff); -    } - -    for (; FPRIndex != NumFPArgRegs; ++FPRIndex) { -      unsigned VReg = MF.addLiveIn(FPArgRegs[FPRIndex], &PPC::F8RCRegClass); +    for (unsigned FPRIndex = 0; FPRIndex != NumFPArgRegs; ++FPRIndex) { +      // Get an existing live-in vreg, or add a new one. +      unsigned VReg = MF.getRegInfo().getLiveInVirtReg(FPArgRegs[FPRIndex]); +      if (!VReg) +        VReg = MF.addLiveIn(FPArgRegs[FPRIndex], &PPC::F8RCRegClass, dl);        SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::f64); -      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, NULL, 0, -                                   false, false, 0); +      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, +                                   MachinePointerInfo(), false, false, 0);        MemOps.push_back(Store);        // Increment the address by eight for the next argument to store        SDValue PtrOff = DAG.getConstant(EVT(MVT::f64).getSizeInBits()/8, @@ -1791,7 +1748,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(    bool isImmutable = !(GuaranteedTailCallOpt && (CallConv==CallingConv::Fast));    unsigned PtrByteSize = isPPC64 ? 8 : 4; -  unsigned ArgOffset = PPCFrameInfo::getLinkageSize(isPPC64, true); +  unsigned ArgOffset = PPCFrameLowering::getLinkageSize(isPPC64, true);    // Area that is at least reserved in caller of this function.    unsigned MinReservedArea = ArgOffset; @@ -1915,18 +1872,18 @@ PPCTargetLowering::LowerFormalArguments_Darwin(        InVals.push_back(FIN);        if (ObjSize==1 || ObjSize==2) {          if (GPR_idx != Num_GPR_Regs) { -          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass); +          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass, dl);            SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT);            SDValue Store = DAG.getTruncStore(Val.getValue(1), dl, Val, FIN, -                                            NULL, 0, +                                            MachinePointerInfo(),                                              ObjSize==1 ? MVT::i8 : MVT::i16,                                              false, false, 0);            MemOps.push_back(Store);            ++GPR_idx;          } -         +          ArgOffset += PtrByteSize; -         +          continue;        }        for (unsigned j = 0; j < ArgSize; j += PtrByteSize) { @@ -1934,11 +1891,12 @@ PPCTargetLowering::LowerFormalArguments_Darwin(          // to memory.  ArgVal will be address of the beginning of          // the object.          if (GPR_idx != Num_GPR_Regs) { -          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass); +          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass, dl);            int FI = MFI->CreateFixedObject(PtrByteSize, ArgOffset, true);            SDValue FIN = DAG.getFrameIndex(FI, PtrVT);            SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT); -          SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, NULL, 0, +          SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, +                                       MachinePointerInfo(),                                         false, false, 0);            MemOps.push_back(Store);            ++GPR_idx; @@ -1956,7 +1914,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(      case MVT::i32:        if (!isPPC64) {          if (GPR_idx != Num_GPR_Regs) { -          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass); +          unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass, dl);            ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);            ++GPR_idx;          } else { @@ -1970,7 +1928,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(        // FALLTHROUGH      case MVT::i64:  // PPC64        if (GPR_idx != Num_GPR_Regs) { -        unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass); +        unsigned VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass, dl);          ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i64);          if (ObjectVT == MVT::i32) { @@ -2008,9 +1966,9 @@ PPCTargetLowering::LowerFormalArguments_Darwin(          unsigned VReg;          if (ObjectVT == MVT::f32) -          VReg = MF.addLiveIn(FPR[FPR_idx], &PPC::F4RCRegClass); +          VReg = MF.addLiveIn(FPR[FPR_idx], &PPC::F4RCRegClass, dl);          else -          VReg = MF.addLiveIn(FPR[FPR_idx], &PPC::F8RCRegClass); +          VReg = MF.addLiveIn(FPR[FPR_idx], &PPC::F8RCRegClass, dl);          ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, ObjectVT);          ++FPR_idx; @@ -2028,7 +1986,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(        // Note that vector arguments in registers don't reserve stack space,        // except in varargs functions.        if (VR_idx != Num_VR_Regs) { -        unsigned VReg = MF.addLiveIn(VR[VR_idx], &PPC::VRRCRegClass); +        unsigned VReg = MF.addLiveIn(VR[VR_idx], &PPC::VRRCRegClass, dl);          ArgVal = DAG.getCopyFromReg(Chain, dl, VReg, ObjectVT);          if (isVarArg) {            while ((ArgOffset % 16) != 0) { @@ -2063,7 +2021,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(                                        CurArgOffset + (ArgSize - ObjSize),                                        isImmutable);        SDValue FIN = DAG.getFrameIndex(FI, PtrVT); -      ArgVal = DAG.getLoad(ObjectVT, dl, Chain, FIN, NULL, 0, +      ArgVal = DAG.getLoad(ObjectVT, dl, Chain, FIN, MachinePointerInfo(),                             false, false, 0);      } @@ -2082,8 +2040,8 @@ PPCTargetLowering::LowerFormalArguments_Darwin(    }    MinReservedArea =      std::max(MinReservedArea, -             PPCFrameInfo::getMinCallFrameSize(isPPC64, true)); -  unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameInfo()-> +             PPCFrameLowering::getMinCallFrameSize(isPPC64, true)); +  unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameLowering()->      getStackAlignment();    unsigned AlignMask = TargetAlign-1;    MinReservedArea = (MinReservedArea + AlignMask) & ~AlignMask; @@ -2104,15 +2062,15 @@ PPCTargetLowering::LowerFormalArguments_Darwin(      // result of va_next.      for (; GPR_idx != Num_GPR_Regs; ++GPR_idx) {        unsigned VReg; -       +        if (isPPC64) -        VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass); +        VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::G8RCRegClass, dl);        else -        VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass); +        VReg = MF.addLiveIn(GPR[GPR_idx], &PPC::GPRCRegClass, dl);        SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, PtrVT); -      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, NULL, 0, -                                   false, false, 0); +      SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN, +                                   MachinePointerInfo(), false, false, 0);        MemOps.push_back(Store);        // Increment the address by four for the next argument to store        SDValue PtrOff = DAG.getConstant(PtrVT.getSizeInBits()/8, PtrVT); @@ -2141,7 +2099,7 @@ CalculateParameterAndLinkageAreaSize(SelectionDAG &DAG,    // Count how many bytes are to be pushed on the stack, including the linkage    // area, and parameter passing area.  We start with 24/48 bytes, which is    // prereserved space for [SP][CR][LR][3 x unused]. -  unsigned NumBytes = PPCFrameInfo::getLinkageSize(isPPC64, true); +  unsigned NumBytes = PPCFrameLowering::getLinkageSize(isPPC64, true);    unsigned NumOps = Outs.size();    unsigned PtrByteSize = isPPC64 ? 8 : 4; @@ -2153,7 +2111,6 @@ CalculateParameterAndLinkageAreaSize(SelectionDAG &DAG,    // 16-byte aligned.    nAltivecParamsAtEnd = 0;    for (unsigned i = 0; i != NumOps; ++i) { -    SDValue Arg = OutVals[i];      ISD::ArgFlagsTy Flags = Outs[i].Flags;      EVT ArgVT = Outs[i].VT;      // Varargs Altivec parameters are padded to a 16 byte boundary. @@ -2183,11 +2140,11 @@ CalculateParameterAndLinkageAreaSize(SelectionDAG &DAG,    // conservatively assume that it is needed.  As such, make sure we have at    // least enough stack space for the caller to store the 8 GPRs.    NumBytes = std::max(NumBytes, -                      PPCFrameInfo::getMinCallFrameSize(isPPC64, true)); +                      PPCFrameLowering::getMinCallFrameSize(isPPC64, true));    // Tail call needs the stack to be aligned.    if (CC==CallingConv::Fast && GuaranteedTailCallOpt) { -    unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameInfo()-> +    unsigned TargetAlign = DAG.getMachineFunction().getTarget().getFrameLowering()->        getStackAlignment();      unsigned AlignMask = TargetAlign-1;      NumBytes = (NumBytes + AlignMask) & ~AlignMask; @@ -2292,8 +2249,8 @@ StoreTailCallArgumentsToStackSlot(SelectionDAG &DAG,      int FI = TailCallArgs[i].FrameIdx;      // Store relative to framepointer.      MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, FIN, -                                       PseudoSourceValue::getFixedStack(FI), -                                       0, false, false, 0)); +                                       MachinePointerInfo::getFixedStack(FI), +                                       false, false, 0));    }  } @@ -2311,26 +2268,26 @@ static SDValue EmitTailCallStoreFPAndRetAddr(SelectionDAG &DAG,    if (SPDiff) {      // Calculate the new stack slot for the return address.      int SlotSize = isPPC64 ? 8 : 4; -    int NewRetAddrLoc = SPDiff + PPCFrameInfo::getReturnSaveOffset(isPPC64, +    int NewRetAddrLoc = SPDiff + PPCFrameLowering::getReturnSaveOffset(isPPC64,                                                                     isDarwinABI);      int NewRetAddr = MF.getFrameInfo()->CreateFixedObject(SlotSize,                                                            NewRetAddrLoc, true);      EVT VT = isPPC64 ? MVT::i64 : MVT::i32;      SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewRetAddr, VT);      Chain = DAG.getStore(Chain, dl, OldRetAddr, NewRetAddrFrIdx, -                         PseudoSourceValue::getFixedStack(NewRetAddr), 0, +                         MachinePointerInfo::getFixedStack(NewRetAddr),                           false, false, 0);      // When using the 32/64-bit SVR4 ABI there is no need to move the FP stack      // slot as the FP is never overwritten.      if (isDarwinABI) {        int NewFPLoc = -        SPDiff + PPCFrameInfo::getFramePointerSaveOffset(isPPC64, isDarwinABI); +        SPDiff + PPCFrameLowering::getFramePointerSaveOffset(isPPC64, isDarwinABI);        int NewFPIdx = MF.getFrameInfo()->CreateFixedObject(SlotSize, NewFPLoc,                                                            true);        SDValue NewFramePtrIdx = DAG.getFrameIndex(NewFPIdx, VT);        Chain = DAG.getStore(Chain, dl, OldFP, NewFramePtrIdx, -                           PseudoSourceValue::getFixedStack(NewFPIdx), 0, +                           MachinePointerInfo::getFixedStack(NewFPIdx),                             false, false, 0);      }    } @@ -2369,15 +2326,15 @@ SDValue PPCTargetLowering::EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,      // Load the LR and FP stack slot for later adjusting.      EVT VT = PPCSubTarget.isPPC64() ? MVT::i64 : MVT::i32;      LROpOut = getReturnAddrFrameIndex(DAG); -    LROpOut = DAG.getLoad(VT, dl, Chain, LROpOut, NULL, 0, +    LROpOut = DAG.getLoad(VT, dl, Chain, LROpOut, MachinePointerInfo(),                            false, false, 0);      Chain = SDValue(LROpOut.getNode(), 1); -     +      // When using the 32/64-bit SVR4 ABI there is no need to load the FP stack      // slot as the FP is never overwritten.      if (isDarwinABI) {        FPOpOut = getFramePointerFrameIndex(DAG); -      FPOpOut = DAG.getLoad(VT, dl, Chain, FPOpOut, NULL, 0, +      FPOpOut = DAG.getLoad(VT, dl, Chain, FPOpOut, MachinePointerInfo(),                              false, false, 0);        Chain = SDValue(FPOpOut.getNode(), 1);      } @@ -2397,7 +2354,8 @@ CreateCopyOfByValArgument(SDValue Src, SDValue Dst, SDValue Chain,                            DebugLoc dl) {    SDValue SizeNode = DAG.getConstant(Flags.getByValSize(), MVT::i32);    return DAG.getMemcpy(Chain, dl, Dst, Src, SizeNode, Flags.getByValAlign(), -                       false, false, NULL, 0, NULL, 0); +                       false, false, MachinePointerInfo(0), +                       MachinePointerInfo(0));  }  /// LowerMemOpCallTo - Store the argument to the stack or remember it in case of @@ -2407,7 +2365,7 @@ LowerMemOpCallTo(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain,                   SDValue Arg, SDValue PtrOff, int SPDiff,                   unsigned ArgOffset, bool isPPC64, bool isTailCall,                   bool isVector, SmallVector<SDValue, 8> &MemOpChains, -                 SmallVector<TailCallArgumentInfo, 8>& TailCallArguments, +                 SmallVector<TailCallArgumentInfo, 8> &TailCallArguments,                   DebugLoc dl) {    EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();    if (!isTailCall) { @@ -2420,8 +2378,8 @@ LowerMemOpCallTo(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain,        PtrOff = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr,                             DAG.getConstant(ArgOffset, PtrVT));      } -    MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, NULL, 0, -                                       false, false, 0)); +    MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, +                                       MachinePointerInfo(), false, false, 0));    // Calculate and remember argument location.    } else CalculateTailCallArgDest(DAG, MF, isPPC64, Arg, SPDiff, ArgOffset,                                    TailCallArguments); @@ -2460,10 +2418,14 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,                       SDValue &Chain, DebugLoc dl, int SPDiff, bool isTailCall,                       SmallVector<std::pair<unsigned, SDValue>, 8> &RegsToPass,                       SmallVector<SDValue, 8> &Ops, std::vector<EVT> &NodeTys, -                     bool isPPC64, bool isSVR4ABI) { +                     const PPCSubtarget &PPCSubTarget) { + +  bool isPPC64 = PPCSubTarget.isPPC64(); +  bool isSVR4ABI = PPCSubTarget.isSVR4ABI(); +    EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();    NodeTys.push_back(MVT::Other);   // Returns a chain -  NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use. +  NodeTys.push_back(MVT::Glue);    // Returns a flag for retval copy to use.    unsigned CallOpc = isSVR4ABI ? PPCISD::CALL_SVR4 : PPCISD::CALL_Darwin; @@ -2473,24 +2435,49 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,      Callee = SDValue(Dest, 0);      needIndirectCall = false;    } -  // XXX Work around for http://llvm.org/bugs/show_bug.cgi?id=5201 -  // Use indirect calls for ALL functions calls in JIT mode, since the -  // far-call stubs may be outside relocation limits for a BL instruction. -  if (!DAG.getTarget().getSubtarget<PPCSubtarget>().isJITCodeModel()) { -    // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every -    // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol -    // node so that legalize doesn't hack it. -    if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { + +  if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { +    // XXX Work around for http://llvm.org/bugs/show_bug.cgi?id=5201 +    // Use indirect calls for ALL functions calls in JIT mode, since the +    // far-call stubs may be outside relocation limits for a BL instruction. +    if (!DAG.getTarget().getSubtarget<PPCSubtarget>().isJITCodeModel()) { +      unsigned OpFlags = 0; +      if (DAG.getTarget().getRelocationModel() != Reloc::Static && +          PPCSubTarget.getDarwinVers() < 9 && +          (G->getGlobal()->isDeclaration() || +           G->getGlobal()->isWeakForLinker())) { +        // PC-relative references to external symbols should go through $stub, +        // unless we're building with the leopard linker or later, which +        // automatically synthesizes these stubs. +        OpFlags = PPCII::MO_DARWIN_STUB; +      } + +      // If the callee is a GlobalAddress/ExternalSymbol node (quite common, +      // every direct call is) turn it into a TargetGlobalAddress / +      // TargetExternalSymbol node so that legalize doesn't hack it.        Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl, -					  Callee.getValueType()); +                                          Callee.getValueType(), +                                          0, OpFlags);        needIndirectCall = false;      }    } +    if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) { -      Callee = DAG.getTargetExternalSymbol(S->getSymbol(), -					   Callee.getValueType()); -      needIndirectCall = false; +    unsigned char OpFlags = 0; + +    if (DAG.getTarget().getRelocationModel() != Reloc::Static && +        PPCSubTarget.getDarwinVers() < 9) { +      // PC-relative references to external symbols should go through $stub, +      // unless we're building with the leopard linker or later, which +      // automatically synthesizes these stubs. +      OpFlags = PPCII::MO_DARWIN_STUB; +    } + +    Callee = DAG.getTargetExternalSymbol(S->getSymbol(), Callee.getValueType(), +                                         OpFlags); +    needIndirectCall = false;    } +    if (needIndirectCall) {      // Otherwise, this is an indirect call.  We have to use a MTCTR/BCTRL pair      // to do the call, we can't use PPCISD::CALL. @@ -2525,7 +2512,7 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,        // Load the address of the function entry point from the function        // descriptor. -      SDVTList VTs = DAG.getVTList(MVT::i64, MVT::Other, MVT::Flag); +      SDVTList VTs = DAG.getVTList(MVT::i64, MVT::Other, MVT::Glue);        SDValue LoadFuncPtr = DAG.getNode(PPCISD::LOAD, dl, VTs, MTCTROps,                                          InFlag.getNode() ? 3 : 2);        Chain = LoadFuncPtr.getValue(1); @@ -2552,7 +2539,7 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,        // prevents the register allocator from allocating it), resulting in an        // additional register being allocated and an unnecessary move instruction        // being generated. -      VTs = DAG.getVTList(MVT::Other, MVT::Flag); +      VTs = DAG.getVTList(MVT::Other, MVT::Glue);        SDValue LoadTOCPtr = DAG.getNode(PPCISD::LOAD_TOC, dl, VTs, Chain,                                         Callee, InFlag);        Chain = LoadTOCPtr.getValue(0); @@ -2569,7 +2556,7 @@ unsigned PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag,      NodeTys.clear();      NodeTys.push_back(MVT::Other); -    NodeTys.push_back(MVT::Flag); +    NodeTys.push_back(MVT::Glue);      Ops.push_back(Chain);      CallOpc = isSVR4ABI ? PPCISD::BCTRL_SVR4 : PPCISD::BCTRL_Darwin;      Callee.setNode(0); @@ -2637,8 +2624,7 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, DebugLoc dl,    SmallVector<SDValue, 8> Ops;    unsigned CallOpc = PrepareCall(DAG, Callee, InFlag, Chain, dl, SPDiff,                                   isTailCall, RegsToPass, Ops, NodeTys, -                                 PPCSubTarget.isPPC64(), -                                 PPCSubTarget.isSVR4ABI()); +                                 PPCSubTarget);    // When performing tail call optimization the callee pops its arguments off    // the stack. Account for this here so these bytes can be pushed back on in @@ -2684,7 +2670,7 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, DebugLoc dl,    // stack frame. If caller and callee belong to the same module (and have the    // same TOC), the NOP will remain unchanged.    if (!isTailCall && PPCSubTarget.isSVR4ABI()&& PPCSubTarget.isPPC64()) { -    SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Flag); +    SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Glue);      if (CallOpc == PPCISD::BCTRL_SVR4) {        // This is a call through a function pointer.        // Restore the caller TOC from the save area into R2. @@ -2699,7 +2685,7 @@ PPCTargetLowering::FinishCall(CallingConv::ID CallConv, DebugLoc dl,        InFlag = Chain.getValue(1);      } else {        // Otherwise insert NOP. -      InFlag = DAG.getNode(PPCISD::NOP, dl, MVT::Flag, InFlag); +      InFlag = DAG.getNode(PPCISD::NOP, dl, MVT::Glue, InFlag);      }    } @@ -2726,15 +2712,14 @@ PPCTargetLowering::LowerCall(SDValue Chain, SDValue Callee,      isTailCall = IsEligibleForTailCallOptimization(Callee, CallConv, isVarArg,                                                     Ins, DAG); -  if (PPCSubTarget.isSVR4ABI() && !PPCSubTarget.isPPC64()) { +  if (PPCSubTarget.isSVR4ABI() && !PPCSubTarget.isPPC64())      return LowerCall_SVR4(Chain, Callee, CallConv, isVarArg,                            isTailCall, Outs, OutVals, Ins,                            dl, DAG, InVals); -  } else { -    return LowerCall_Darwin(Chain, Callee, CallConv, isVarArg, -                            isTailCall, Outs, OutVals, Ins, -                            dl, DAG, InVals); -  } + +  return LowerCall_Darwin(Chain, Callee, CallConv, isVarArg, +                          isTailCall, Outs, OutVals, Ins, +                          dl, DAG, InVals);  }  SDValue @@ -2763,7 +2748,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,    // in this function's (MF) stack pointer stack slot 0(SP).    if (GuaranteedTailCallOpt && CallConv==CallingConv::Fast)      MF.getInfo<PPCFunctionInfo>()->setHasFastCall(); -   +    // Count how many bytes are to be pushed on the stack, including the linkage    // area, parameter list area and the part of the local variable space which    // contains copies of aggregates which are passed by value. @@ -2774,19 +2759,19 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,                   ArgLocs, *DAG.getContext());    // Reserve space for the linkage area on the stack. -  CCInfo.AllocateStack(PPCFrameInfo::getLinkageSize(false, false), PtrByteSize); +  CCInfo.AllocateStack(PPCFrameLowering::getLinkageSize(false, false), PtrByteSize);    if (isVarArg) {      // Handle fixed and variable vector arguments differently.      // Fixed vector arguments go into registers as long as registers are      // available. Variable vector arguments always go into memory.      unsigned NumArgs = Outs.size(); -     +      for (unsigned i = 0; i != NumArgs; ++i) { -      EVT ArgVT = Outs[i].VT; +      MVT ArgVT = Outs[i].VT;        ISD::ArgFlagsTy ArgFlags = Outs[i].Flags;        bool Result; -       +        if (Outs[i].IsFixed) {          Result = CC_PPC_SVR4(i, ArgVT, ArgVT, CCValAssign::Full, ArgFlags,                               CCInfo); @@ -2794,11 +2779,11 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,          Result = CC_PPC_SVR4_VarArg(i, ArgVT, ArgVT, CCValAssign::Full,                                      ArgFlags, CCInfo);        } -       +        if (Result) {  #ifndef NDEBUG          errs() << "Call operand #" << i << " has unhandled type " -             << ArgVT.getEVTString() << "\n"; +             << EVT(ArgVT).getEVTString() << "\n";  #endif          llvm_unreachable(0);        } @@ -2807,7 +2792,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,      // All arguments are treated the same.      CCInfo.AnalyzeCallOperands(Outs, CC_PPC_SVR4);    } -   +    // Assign locations to all of the outgoing aggregate by value arguments.    SmallVector<CCValAssign, 16> ByValArgLocs;    CCState CCByValInfo(CallConv, isVarArg, getTargetMachine(), ByValArgLocs, @@ -2822,7 +2807,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,    // space variable where copies of aggregates which are passed by value are    // stored.    unsigned NumBytes = CCByValInfo.getNextStackOffset(); -   +    // Calculate by how many bytes the stack has to be adjusted in case of tail    // call optimization.    int SPDiff = CalculateTailCallSPDiff(DAG, isTailCall, NumBytes); @@ -2842,7 +2827,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,    // arguments that may not fit in the registers available for argument    // passing.    SDValue StackPtr = DAG.getRegister(PPC::R1, MVT::i32); -   +    SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;    SmallVector<TailCallArgumentInfo, 8> TailCallArguments;    SmallVector<SDValue, 8> MemOpChains; @@ -2854,7 +2839,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,      CCValAssign &VA = ArgLocs[i];      SDValue Arg = OutVals[i];      ISD::ArgFlagsTy Flags = Outs[i].Flags; -     +      if (Flags.isByVal()) {        // Argument is an aggregate which is passed by value, thus we need to        // create a copy of it in the local variable space of the current stack @@ -2863,33 +2848,33 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,        assert((j < ByValArgLocs.size()) && "Index out of bounds!");        CCValAssign &ByValVA = ByValArgLocs[j++];        assert((VA.getValNo() == ByValVA.getValNo()) && "ValNo mismatch!"); -       +        // Memory reserved in the local variable space of the callers stack frame.        unsigned LocMemOffset = ByValVA.getLocMemOffset(); -       +        SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset);        PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff); -       +        // Create a copy of the argument in the local area of the current        // stack frame.        SDValue MemcpyCall =          CreateCopyOfByValArgument(Arg, PtrOff,                                    CallSeqStart.getNode()->getOperand(0),                                    Flags, DAG, dl); -       +        // This must go outside the CALLSEQ_START..END.        SDValue NewCallSeqStart = DAG.getCALLSEQ_START(MemcpyCall,                             CallSeqStart.getNode()->getOperand(1));        DAG.ReplaceAllUsesWith(CallSeqStart.getNode(),                               NewCallSeqStart.getNode());        Chain = CallSeqStart = NewCallSeqStart; -       +        // Pass the address of the aggregate copy on the stack either in a        // physical register or in the parameter list area of the current stack        // frame to the callee.        Arg = PtrOff;      } -     +      if (VA.isRegLoc()) {        // Put argument in a physical register.        RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg)); @@ -2903,7 +2888,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,          PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);          MemOpChains.push_back(DAG.getStore(Chain, dl, Arg, PtrOff, -                                           PseudoSourceValue::getStack(), LocMemOffset, +                                           MachinePointerInfo(),                                             false, false, 0));        } else {          // Calculate and remember argument location. @@ -2912,11 +2897,11 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,        }      }    } -   +    if (!MemOpChains.empty())      Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,                          &MemOpChains[0], MemOpChains.size()); -   +    // Build a sequence of copy-to-reg nodes chained together with token chain    // and flag operands which copy the outgoing args into the appropriate regs.    SDValue InFlag; @@ -2925,7 +2910,7 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,                               RegsToPass[i].second, InFlag);      InFlag = Chain.getValue(1);    } -   +    // Set CR6 to true if this is a vararg call.    if (isVarArg) {      SDValue SetCR(DAG.getMachineNode(PPC::CRSET, dl, MVT::i32), 0); @@ -2933,10 +2918,9 @@ PPCTargetLowering::LowerCall_SVR4(SDValue Chain, SDValue Callee,      InFlag = Chain.getValue(1);    } -  if (isTailCall) { +  if (isTailCall)      PrepareTailCall(DAG, InFlag, Chain, dl, false, SPDiff, NumBytes, LROp, FPOp,                      false, TailCallArguments); -  }    return FinishCall(CallConv, dl, isTailCall, isVarArg, DAG,                      RegsToPass, InFlag, Chain, Callee, SPDiff, NumBytes, @@ -3012,7 +2996,7 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,    // memory.  Also, if this is a vararg function, floating point operations    // must be stored to our stack, and loaded into integer regs as well, if    // any integer regs are available for argument passing. -  unsigned ArgOffset = PPCFrameInfo::getLinkageSize(isPPC64, true); +  unsigned ArgOffset = PPCFrameLowering::getLinkageSize(isPPC64, true);    unsigned GPR_idx = 0, FPR_idx = 0, VR_idx = 0;    static const unsigned GPR_32[] = {           // 32-bit registers. @@ -3066,8 +3050,9 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,          // Everything else is passed left-justified.          EVT VT = (Size==1) ? MVT::i8 : MVT::i16;          if (GPR_idx != NumGPRs) { -          SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, PtrVT, dl, Chain, Arg, -                                        NULL, 0, VT, false, false, 0); +          SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, PtrVT, Chain, Arg, +                                        MachinePointerInfo(), VT, +                                        false, false, 0);            MemOpChains.push_back(Load.getValue(1));            RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); @@ -3104,7 +3089,8 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,          SDValue Const = DAG.getConstant(j, PtrOff.getValueType());          SDValue AddArg = DAG.getNode(ISD::ADD, dl, PtrVT, Arg, Const);          if (GPR_idx != NumGPRs) { -          SDValue Load = DAG.getLoad(PtrVT, dl, Chain, AddArg, NULL, 0, +          SDValue Load = DAG.getLoad(PtrVT, dl, Chain, AddArg, +                                     MachinePointerInfo(),                                       false, false, 0);            MemOpChains.push_back(Load.getValue(1));            RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); @@ -3136,21 +3122,22 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,          RegsToPass.push_back(std::make_pair(FPR[FPR_idx++], Arg));          if (isVarArg) { -          SDValue Store = DAG.getStore(Chain, dl, Arg, PtrOff, NULL, 0, -                                       false, false, 0); +          SDValue Store = DAG.getStore(Chain, dl, Arg, PtrOff, +                                       MachinePointerInfo(), false, false, 0);            MemOpChains.push_back(Store);            // Float varargs are always shadowed in available integer registers            if (GPR_idx != NumGPRs) { -            SDValue Load = DAG.getLoad(PtrVT, dl, Store, PtrOff, NULL, 0, -                                       false, false, 0); +            SDValue Load = DAG.getLoad(PtrVT, dl, Store, PtrOff, +                                       MachinePointerInfo(), false, false, 0);              MemOpChains.push_back(Load.getValue(1));              RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load));            }            if (GPR_idx != NumGPRs && Arg.getValueType() == MVT::f64 && !isPPC64){              SDValue ConstFour = DAG.getConstant(4, PtrOff.getValueType());              PtrOff = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff, ConstFour); -            SDValue Load = DAG.getLoad(PtrVT, dl, Store, PtrOff, NULL, 0, +            SDValue Load = DAG.getLoad(PtrVT, dl, Store, PtrOff, +                                       MachinePointerInfo(),                                         false, false, 0);              MemOpChains.push_back(Load.getValue(1));              RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); @@ -3194,11 +3181,12 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,          // entirely in R registers.  Maybe later.          PtrOff = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr,                              DAG.getConstant(ArgOffset, PtrVT)); -        SDValue Store = DAG.getStore(Chain, dl, Arg, PtrOff, NULL, 0, -                                     false, false, 0); +        SDValue Store = DAG.getStore(Chain, dl, Arg, PtrOff, +                                     MachinePointerInfo(), false, false, 0);          MemOpChains.push_back(Store);          if (VR_idx != NumVRs) { -          SDValue Load = DAG.getLoad(MVT::v4f32, dl, Store, PtrOff, NULL, 0, +          SDValue Load = DAG.getLoad(MVT::v4f32, dl, Store, PtrOff, +                                     MachinePointerInfo(),                                       false, false, 0);            MemOpChains.push_back(Load.getValue(1));            RegsToPass.push_back(std::make_pair(VR[VR_idx++], Load)); @@ -3209,7 +3197,7 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,              break;            SDValue Ix = DAG.getNode(ISD::ADD, dl, PtrVT, PtrOff,                                    DAG.getConstant(i, PtrVT)); -          SDValue Load = DAG.getLoad(PtrVT, dl, Store, Ix, NULL, 0, +          SDValue Load = DAG.getLoad(PtrVT, dl, Store, Ix, MachinePointerInfo(),                                       false, false, 0);            MemOpChains.push_back(Load.getValue(1));            RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); @@ -3275,14 +3263,14 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,      // TOC save area offset.      SDValue PtrOff = DAG.getIntPtrConstant(40);      SDValue AddPtr = DAG.getNode(ISD::ADD, dl, PtrVT, StackPtr, PtrOff); -    Chain = DAG.getStore(Val.getValue(1), dl, Val, AddPtr, NULL, 0, +    Chain = DAG.getStore(Val.getValue(1), dl, Val, AddPtr, MachinePointerInfo(),                           false, false, 0);    }    // On Darwin, R12 must contain the address of an indirect callee.  This does    // not mean the MTCTR instruction must use R12; it's easier to model this as    // an extra parameter, so do that. -  if (!isTailCall &&  +  if (!isTailCall &&        !dyn_cast<GlobalAddressSDNode>(Callee) &&        !dyn_cast<ExternalSymbolSDNode>(Callee) &&        !isBLACompatibleAddress(Callee, DAG)) @@ -3298,10 +3286,9 @@ PPCTargetLowering::LowerCall_Darwin(SDValue Chain, SDValue Callee,      InFlag = Chain.getValue(1);    } -  if (isTailCall) { +  if (isTailCall)      PrepareTailCall(DAG, InFlag, Chain, dl, isPPC64, SPDiff, NumBytes, LROp,                      FPOp, true, TailCallArguments); -  }    return FinishCall(CallConv, dl, isTailCall, isVarArg, DAG,                      RegsToPass, InFlag, Chain, Callee, SPDiff, NumBytes, @@ -3362,14 +3349,15 @@ SDValue PPCTargetLowering::LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,    SDValue SaveSP = Op.getOperand(1);    // Load the old link SP. -  SDValue LoadLinkSP = DAG.getLoad(PtrVT, dl, Chain, StackPtr, NULL, 0, +  SDValue LoadLinkSP = DAG.getLoad(PtrVT, dl, Chain, StackPtr, +                                   MachinePointerInfo(),                                     false, false, 0);    // Restore the stack pointer.    Chain = DAG.getCopyToReg(LoadLinkSP.getValue(1), dl, SP, SaveSP);    // Store the old link SP. -  return DAG.getStore(Chain, dl, LoadLinkSP, StackPtr, NULL, 0, +  return DAG.getStore(Chain, dl, LoadLinkSP, StackPtr, MachinePointerInfo(),                        false, false, 0);  } @@ -3390,7 +3378,7 @@ PPCTargetLowering::getReturnAddrFrameIndex(SelectionDAG & DAG) const {    // If the frame pointer save index hasn't been defined yet.    if (!RASI) {      // Find out what the fix offset of the frame pointer save area. -    int LROffset = PPCFrameInfo::getReturnSaveOffset(isPPC64, isDarwinABI); +    int LROffset = PPCFrameLowering::getReturnSaveOffset(isPPC64, isDarwinABI);      // Allocate the frame index for frame pointer save area.      RASI = MF.getFrameInfo()->CreateFixedObject(isPPC64? 8 : 4, LROffset, true);      // Save the result. @@ -3414,7 +3402,7 @@ PPCTargetLowering::getFramePointerFrameIndex(SelectionDAG & DAG) const {    // If the frame pointer save index hasn't been defined yet.    if (!FPSI) {      // Find out what the fix offset of the frame pointer save area. -    int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(isPPC64, +    int FPOffset = PPCFrameLowering::getFramePointerSaveOffset(isPPC64,                                                             isDarwinABI);      // Allocate the frame index for frame pointer save area. @@ -3533,7 +3521,7 @@ SDValue PPCTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,    default: llvm_unreachable("Unhandled FP_TO_INT type in custom expander!");    case MVT::i32:      Tmp = DAG.getNode(Op.getOpcode()==ISD::FP_TO_SINT ? PPCISD::FCTIWZ : -                                                         PPCISD::FCTIDZ,  +                                                         PPCISD::FCTIDZ,                        dl, MVT::f64, Src);      break;    case MVT::i64: @@ -3545,15 +3533,15 @@ SDValue PPCTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG,    SDValue FIPtr = DAG.CreateStackTemporary(MVT::f64);    // Emit a store to the stack slot. -  SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl, Tmp, FIPtr, NULL, 0, -                               false, false, 0); +  SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl, Tmp, FIPtr, +                               MachinePointerInfo(), false, false, 0);    // Result is a load from the stack slot.  If loading 4 bytes, make sure to    // add in a bias.    if (Op.getValueType() == MVT::i32)      FIPtr = DAG.getNode(ISD::ADD, dl, FIPtr.getValueType(), FIPtr,                          DAG.getConstant(4, FIPtr.getValueType())); -  return DAG.getLoad(Op.getValueType(), dl, Chain, FIPtr, NULL, 0, +  return DAG.getLoad(Op.getValueType(), dl, Chain, FIPtr, MachinePointerInfo(),                       false, false, 0);  } @@ -3565,8 +3553,7 @@ SDValue PPCTargetLowering::LowerSINT_TO_FP(SDValue Op,      return SDValue();    if (Op.getOperand(0).getValueType() == MVT::i64) { -    SDValue Bits = DAG.getNode(ISD::BIT_CONVERT, dl, -                               MVT::f64, Op.getOperand(0)); +    SDValue Bits = DAG.getNode(ISD::BITCAST, dl, MVT::f64, Op.getOperand(0));      SDValue FP = DAG.getNode(PPCISD::FCFID, dl, MVT::f64, Bits);      if (Op.getValueType() == MVT::f32)        FP = DAG.getNode(ISD::FP_ROUND, dl, @@ -3591,14 +3578,15 @@ SDValue PPCTargetLowering::LowerSINT_TO_FP(SDValue Op,    // STD the extended value into the stack slot.    MachineMemOperand *MMO = -    MF.getMachineMemOperand(PseudoSourceValue::getFixedStack(FrameIdx), -                            MachineMemOperand::MOStore, 0, 8, 8); +    MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FrameIdx), +                            MachineMemOperand::MOStore, 8, 8);    SDValue Ops[] = { DAG.getEntryNode(), Ext64, FIdx };    SDValue Store =      DAG.getMemIntrinsicNode(PPCISD::STD_32, dl, DAG.getVTList(MVT::Other),                              Ops, 4, MVT::i64, MMO);    // Load the value as a double. -  SDValue Ld = DAG.getLoad(MVT::f64, dl, Store, FIdx, NULL, 0, false, false, 0); +  SDValue Ld = DAG.getLoad(MVT::f64, dl, Store, FIdx, MachinePointerInfo(), +                           false, false, 0);    // FCFID it and return it.    SDValue FP = DAG.getNode(PPCISD::FCFID, dl, MVT::f64, Ld); @@ -3637,19 +3625,19 @@ SDValue PPCTargetLowering::LowerFLT_ROUNDS_(SDValue Op,    // Save FP Control Word to register    NodeTys.push_back(MVT::f64);    // return register -  NodeTys.push_back(MVT::Flag);   // unused in this context +  NodeTys.push_back(MVT::Glue);   // unused in this context    SDValue Chain = DAG.getNode(PPCISD::MFFS, dl, NodeTys, &InFlag, 0);    // Save FP register to stack slot    int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8, false);    SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);    SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Chain, -                               StackSlot, NULL, 0, false, false, 0); +                               StackSlot, MachinePointerInfo(), false, false,0);    // Load FP Control Word from low 32 bits of stack slot.    SDValue Four = DAG.getConstant(4, PtrVT);    SDValue Addr = DAG.getNode(ISD::ADD, dl, PtrVT, StackSlot, Four); -  SDValue CWD = DAG.getLoad(MVT::i32, dl, Store, Addr, NULL, 0, +  SDValue CWD = DAG.getLoad(MVT::i32, dl, Store, Addr, MachinePointerInfo(),                              false, false, 0);    // Transform as necessary @@ -3786,7 +3774,7 @@ static SDValue BuildSplatI(int Val, unsigned SplatSize, EVT VT,    Ops.assign(CanonicalVT.getVectorNumElements(), Elt);    SDValue Res = DAG.getNode(ISD::BUILD_VECTOR, dl, CanonicalVT,                                &Ops[0], Ops.size()); -  return DAG.getNode(ISD::BIT_CONVERT, dl, ReqVT, Res); +  return DAG.getNode(ISD::BITCAST, dl, ReqVT, Res);  }  /// BuildIntrinsicOp - Return a binary operator intrinsic node with the @@ -3815,14 +3803,14 @@ static SDValue BuildIntrinsicOp(unsigned IID, SDValue Op0, SDValue Op1,  static SDValue BuildVSLDOI(SDValue LHS, SDValue RHS, unsigned Amt,                               EVT VT, SelectionDAG &DAG, DebugLoc dl) {    // Force LHS/RHS to be the right type. -  LHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, LHS); -  RHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, RHS); +  LHS = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, LHS); +  RHS = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, RHS);    int Ops[16];    for (unsigned i = 0; i != 16; ++i)      Ops[i] = i + Amt;    SDValue T = DAG.getVectorShuffle(MVT::v16i8, dl, LHS, RHS, Ops); -  return DAG.getNode(ISD::BIT_CONVERT, dl, VT, T); +  return DAG.getNode(ISD::BITCAST, dl, VT, T);  }  // If this is a case we can't handle, return null and let the default @@ -3856,7 +3844,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,      if (Op.getValueType() != MVT::v4i32 || HasAnyUndefs) {        SDValue Z = DAG.getConstant(0, MVT::i32);        Z = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Z, Z, Z, Z); -      Op = DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Z); +      Op = DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Z);      }      return Op;    } @@ -3875,7 +3863,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,    if (SextVal >= -32 && SextVal <= 30 && (SextVal & 1) == 0) {      SDValue Res = BuildSplatI(SextVal >> 1, SplatSize, MVT::Other, DAG, dl);      Res = DAG.getNode(ISD::ADD, dl, Res.getValueType(), Res, Res); -    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +    return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);    }    // If this is 0x8000_0000 x 4, turn into vspltisw + vslw.  If it is @@ -3891,7 +3879,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,      // xor by OnesV to invert it.      Res = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Res, OnesV); -    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +    return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);    }    // Check to see if this is a wide variety of vsplti*, binop self cases. @@ -3917,7 +3905,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,          Intrinsic::ppc_altivec_vslw        };        Res = BuildIntrinsicOp(IIDs[SplatSize-1], Res, Res, DAG, dl); -      return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +      return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);      }      // vsplti + srl self. @@ -3928,7 +3916,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,          Intrinsic::ppc_altivec_vsrw        };        Res = BuildIntrinsicOp(IIDs[SplatSize-1], Res, Res, DAG, dl); -      return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +      return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);      }      // vsplti + sra self. @@ -3939,7 +3927,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,          Intrinsic::ppc_altivec_vsraw        };        Res = BuildIntrinsicOp(IIDs[SplatSize-1], Res, Res, DAG, dl); -      return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +      return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);      }      // vsplti + rol self. @@ -3951,7 +3939,7 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,          Intrinsic::ppc_altivec_vrlw        };        Res = BuildIntrinsicOp(IIDs[SplatSize-1], Res, Res, DAG, dl); -      return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Res); +      return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Res);      }      // t = vsplti c, result = vsldoi t, t, 1 @@ -3978,14 +3966,14 @@ SDValue PPCTargetLowering::LowerBUILD_VECTOR(SDValue Op,      SDValue LHS = BuildSplatI(SextVal-16, SplatSize, MVT::Other, DAG, dl);      SDValue RHS = BuildSplatI(-16, SplatSize, MVT::Other, DAG, dl);      LHS = DAG.getNode(ISD::SUB, dl, LHS.getValueType(), LHS, RHS); -    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), LHS); +    return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), LHS);    }    // Odd, in range [-31,-17]:  (vsplti C)+(vsplti -16).    if (SextVal >= -31 && SextVal <= 0) {      SDValue LHS = BuildSplatI(SextVal+16, SplatSize, MVT::Other, DAG, dl);      SDValue RHS = BuildSplatI(-16, SplatSize, MVT::Other, DAG, dl);      LHS = DAG.getNode(ISD::ADD, dl, LHS.getValueType(), LHS, RHS); -    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), LHS); +    return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), LHS);    }    return SDValue(); @@ -4062,10 +4050,10 @@ static SDValue GeneratePerfectShuffle(unsigned PFEntry, SDValue LHS,      return BuildVSLDOI(OpLHS, OpRHS, 12, OpLHS.getValueType(), DAG, dl);    }    EVT VT = OpLHS.getValueType(); -  OpLHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, OpLHS); -  OpRHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, OpRHS); +  OpLHS = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, OpLHS); +  OpRHS = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, OpRHS);    SDValue T = DAG.getVectorShuffle(MVT::v16i8, dl, OpLHS, OpRHS, ShufIdxs); -  return DAG.getNode(ISD::BIT_CONVERT, dl, VT, T); +  return DAG.getNode(ISD::BITCAST, dl, VT, T);  }  /// LowerVECTOR_SHUFFLE - Return the code we lower for VECTOR_SHUFFLE.  If this @@ -4118,7 +4106,7 @@ SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,    // perfect shuffle table to emit an optimal matching sequence.    SmallVector<int, 16> PermMask;    SVOp->getMask(PermMask); -   +    unsigned PFIndexes[4];    bool isFourElementShuffle = true;    for (unsigned i = 0; i != 4 && isFourElementShuffle; ++i) { // Element number @@ -4253,7 +4241,7 @@ SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,      SDValue Tmp = DAG.getNode(PPCISD::VCMP, dl, Op.getOperand(2).getValueType(),                                Op.getOperand(1), Op.getOperand(2),                                DAG.getConstant(CompareOpc, MVT::i32)); -    return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Tmp); +    return DAG.getNode(ISD::BITCAST, dl, Op.getValueType(), Tmp);    }    // Create the PPCISD altivec 'dot' comparison node. @@ -4264,7 +4252,7 @@ SDValue PPCTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,    };    std::vector<EVT> VTs;    VTs.push_back(Op.getOperand(2).getValueType()); -  VTs.push_back(MVT::Flag); +  VTs.push_back(MVT::Glue);    SDValue CompNode = DAG.getNode(PPCISD::VCMPo, dl, VTs, Ops, 3);    // Now that we have the comparison, emit a copy from the CR to a GPR. @@ -4317,10 +4305,10 @@ SDValue PPCTargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op,    // Store the input value into Value#0 of the stack slot.    SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, -                               Op.getOperand(0), FIdx, NULL, 0, +                               Op.getOperand(0), FIdx, MachinePointerInfo(),                                 false, false, 0);    // Load it out. -  return DAG.getLoad(Op.getValueType(), dl, Store, FIdx, NULL, 0, +  return DAG.getLoad(Op.getValueType(), dl, Store, FIdx, MachinePointerInfo(),                       false, false, 0);  } @@ -4336,9 +4324,9 @@ SDValue PPCTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {        BuildIntrinsicOp(Intrinsic::ppc_altivec_vrlw, RHS, Neg16, DAG, dl);      // Shrinkify inputs to v8i16. -    LHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, LHS); -    RHS = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, RHS); -    RHSSwap = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, RHSSwap); +    LHS = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, LHS); +    RHS = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, RHS); +    RHSSwap = DAG.getNode(ISD::BITCAST, dl, MVT::v8i16, RHSSwap);      // Low parts multiplied together, generating 32-bit results (we ignore the      // top parts). @@ -4364,12 +4352,12 @@ SDValue PPCTargetLowering::LowerMUL(SDValue Op, SelectionDAG &DAG) const {      // Multiply the even 8-bit parts, producing 16-bit sums.      SDValue EvenParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmuleub,                                             LHS, RHS, DAG, dl, MVT::v8i16); -    EvenParts = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, EvenParts); +    EvenParts = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, EvenParts);      // Multiply the odd 8-bit parts, producing 16-bit sums.      SDValue OddParts = BuildIntrinsicOp(Intrinsic::ppc_altivec_vmuloub,                                            LHS, RHS, DAG, dl, MVT::v8i16); -    OddParts = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, OddParts); +    OddParts = DAG.getNode(ISD::BITCAST, dl, MVT::v16i8, OddParts);      // Merge the results together.      int Ops[16]; @@ -4391,7 +4379,7 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {    case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);    case ISD::BlockAddress:       return LowerBlockAddress(Op, DAG);    case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG); -  case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG); +  case ISD::GlobalTLSAddress:   llvm_unreachable("TLS not implemented for PPC");    case ISD::JumpTable:          return LowerJumpTable(Op, DAG);    case ISD::SETCC:              return LowerSETCC(Op, DAG);    case ISD::TRAMPOLINE:         return LowerTRAMPOLINE(Op, DAG); @@ -4456,20 +4444,20 @@ void PPCTargetLowering::ReplaceNodeResults(SDNode *N,      SDValue Ops[4], Result, MFFSreg, InFlag, FPreg;      NodeTys.push_back(MVT::f64);   // Return register -    NodeTys.push_back(MVT::Flag);    // Returns a flag for later insns +    NodeTys.push_back(MVT::Glue);    // Returns a flag for later insns      Result = DAG.getNode(PPCISD::MFFS, dl, NodeTys, &InFlag, 0);      MFFSreg = Result.getValue(0);      InFlag = Result.getValue(1);      NodeTys.clear(); -    NodeTys.push_back(MVT::Flag);   // Returns a flag +    NodeTys.push_back(MVT::Glue);   // Returns a flag      Ops[0] = DAG.getConstant(31, MVT::i32);      Ops[1] = InFlag;      Result = DAG.getNode(PPCISD::MTFSB1, dl, NodeTys, Ops, 2);      InFlag = Result.getValue(0);      NodeTys.clear(); -    NodeTys.push_back(MVT::Flag);   // Returns a flag +    NodeTys.push_back(MVT::Glue);   // Returns a flag      Ops[0] = DAG.getConstant(30, MVT::i32);      Ops[1] = InFlag;      Result = DAG.getNode(PPCISD::MTFSB0, dl, NodeTys, Ops, 2); @@ -4477,7 +4465,7 @@ void PPCTargetLowering::ReplaceNodeResults(SDNode *N,      NodeTys.clear();      NodeTys.push_back(MVT::f64);    // result of add -    NodeTys.push_back(MVT::Flag);   // Returns a flag +    NodeTys.push_back(MVT::Glue);   // Returns a flag      Ops[0] = Lo;      Ops[1] = Hi;      Ops[2] = InFlag; @@ -5283,7 +5271,7 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,          DAG.getConstant(CompareOpc, MVT::i32)        };        VTs.push_back(LHS.getOperand(2).getValueType()); -      VTs.push_back(MVT::Flag); +      VTs.push_back(MVT::Glue);        SDValue CompNode = DAG.getNode(PPCISD::VCMPo, dl, VTs, Ops, 3);        // Unpack the result based on how the target uses it. @@ -5377,6 +5365,47 @@ PPCTargetLowering::getConstraintType(const std::string &Constraint) const {    return TargetLowering::getConstraintType(Constraint);  } +/// Examine constraint type and operand type and determine a weight value. +/// This object must already have been set up with the operand type +/// and the current alternative constraint selected. +TargetLowering::ConstraintWeight +PPCTargetLowering::getSingleConstraintMatchWeight( +    AsmOperandInfo &info, const char *constraint) const { +  ConstraintWeight weight = CW_Invalid; +  Value *CallOperandVal = info.CallOperandVal; +    // If we don't have a value, we can't do a match, +    // but allow it at the lowest weight. +  if (CallOperandVal == NULL) +    return CW_Default; +  const Type *type = CallOperandVal->getType(); +  // Look at the constraint type. +  switch (*constraint) { +  default: +    weight = TargetLowering::getSingleConstraintMatchWeight(info, constraint); +    break; +  case 'b': +    if (type->isIntegerTy()) +      weight = CW_Register; +    break; +  case 'f': +    if (type->isFloatTy()) +      weight = CW_Register; +    break; +  case 'd': +    if (type->isDoubleTy()) +      weight = CW_Register; +    break; +  case 'v': +    if (type->isVectorTy()) +      weight = CW_Register; +    break; +  case 'y': +    weight = CW_Register; +    break; +  } +  return weight; +} +  std::pair<unsigned, const TargetRegisterClass*>  PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,                                                  EVT VT) const { @@ -5536,19 +5565,19 @@ SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op,    if (Depth > 0) {      SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);      SDValue Offset = -     -      DAG.getConstant(PPCFrameInfo::getReturnSaveOffset(isPPC64, isDarwinABI), + +      DAG.getConstant(PPCFrameLowering::getReturnSaveOffset(isPPC64, isDarwinABI),                        isPPC64? MVT::i64 : MVT::i32);      return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),                         DAG.getNode(ISD::ADD, dl, getPointerTy(),                                     FrameAddr, Offset), -                       NULL, 0, false, false, 0); +                       MachinePointerInfo(), false, false, 0);    }    // Just load the return address off the stack.    SDValue RetAddrFI = getReturnAddrFrameIndex(DAG);    return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), -                     RetAddrFI, NULL, 0, false, false, 0); +                     RetAddrFI, MachinePointerInfo(), false, false, 0);  }  SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op, @@ -5571,7 +5600,7 @@ SDValue PPCTargetLowering::LowerFRAMEADDR(SDValue Op,                                           PtrVT);    while (Depth--)      FrameAddr = DAG.getLoad(Op.getValueType(), dl, DAG.getEntryNode(), -                            FrameAddr, NULL, 0, false, false, 0); +                            FrameAddr, MachinePointerInfo(), false, false, 0);    return FrameAddr;  }  | 
