diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:01:33 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:01:33 +0000 | 
| commit | ee8648bdac07986a0f1ec897b02ec82a2f144d46 (patch) | |
| tree | 52d1861acda1205241ee35a94aa63129c604d469 /lib/CodeGen/SelectionDAG | |
| parent | 1a82d4c088707c791c792f6822f611b47a12bdfe (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/SelectionDAG')
22 files changed, 1052 insertions, 875 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 6056d93ddc7a..52d620b1d540 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -443,8 +443,9 @@ namespace {        assert(LHSTy.isInteger() && "Shift amount is not an integer type!");        if (LHSTy.isVector())          return LHSTy; -      return LegalTypes ? TLI.getScalarShiftAmountTy(LHSTy) -                        : TLI.getPointerTy(); +      auto &DL = DAG.getDataLayout(); +      return LegalTypes ? TLI.getScalarShiftAmountTy(DL, LHSTy) +                        : TLI.getPointerTy(DL);      }      /// This method returns true if we are running before type legalization or @@ -456,7 +457,7 @@ namespace {      /// Convenience wrapper around TargetLowering::getSetCCResultType      EVT getSetCCResultType(EVT VT) const { -      return TLI.getSetCCResultType(*DAG.getContext(), VT); +      return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);      }    };  } @@ -3111,7 +3112,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {            // For big endian targets, we need to add an offset to the pointer            // to load the correct bytes.  For little endian systems, we merely            // need to read fewer bytes from the same pointer. -          if (TLI.isBigEndian()) { +          if (DAG.getDataLayout().isBigEndian()) {              unsigned LVTStoreBytes = LoadedVT.getStoreSize();              unsigned EVTStoreBytes = ExtVT.getStoreSize();              unsigned PtrOff = LVTStoreBytes - EVTStoreBytes; @@ -6675,7 +6676,7 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {    // For big endian targets, we need to adjust the offset to the pointer to    // load the correct bytes. -  if (TLI.isBigEndian()) { +  if (DAG.getDataLayout().isBigEndian()) {      unsigned LVTStoreBits = LN0->getMemoryVT().getStoreSizeInBits();      unsigned EVTStoreBits = ExtVT.getStoreSizeInBits();      ShAmt = LVTStoreBits - EVTStoreBits - ShAmt; @@ -6873,7 +6874,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND_VECTOR_INREG(SDNode *N) {  SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {    SDValue N0 = N->getOperand(0);    EVT VT = N->getValueType(0); -  bool isLE = TLI.isLittleEndian(); +  bool isLE = DAG.getDataLayout().isLittleEndian();    // noop truncate    if (N0.getValueType() == N->getValueType(0)) @@ -6926,7 +6927,7 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {      SDValue EltNo = N0->getOperand(1);      if (isa<ConstantSDNode>(EltNo) && isTypeLegal(NVT)) {        int Elt = cast<ConstantSDNode>(EltNo)->getZExtValue(); -      EVT IndexTy = TLI.getVectorIdxTy(); +      EVT IndexTy = TLI.getVectorIdxTy(DAG.getDataLayout());        int Index = isLE ? (Elt*SizeRatio) : (Elt*SizeRatio + (SizeRatio-1));        SDValue V = DAG.getNode(ISD::BITCAST, SDLoc(N), @@ -7093,8 +7094,8 @@ SDValue DAGCombiner::CombineConsecutiveLoads(SDNode *N, EVT VT) {        !LD2->isVolatile() &&        DAG.isConsecutiveLoad(LD2, LD1, LD1VT.getSizeInBits()/8, 1)) {      unsigned Align = LD1->getAlignment(); -    unsigned NewAlign = TLI.getDataLayout()-> -      getABITypeAlignment(VT.getTypeForEVT(*DAG.getContext())); +    unsigned NewAlign = DAG.getDataLayout().getABITypeAlignment( +        VT.getTypeForEVT(*DAG.getContext()));      if (NewAlign <= Align &&          (!LegalOperations || TLI.isOperationLegal(ISD::LOAD, VT))) @@ -7150,13 +7151,13 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {        // Do not change the width of a volatile load.        !cast<LoadSDNode>(N0)->isVolatile() &&        // Do not remove the cast if the types differ in endian layout. -      TLI.hasBigEndianPartOrdering(N0.getValueType()) == -      TLI.hasBigEndianPartOrdering(VT) && +      TLI.hasBigEndianPartOrdering(N0.getValueType(), DAG.getDataLayout()) == +          TLI.hasBigEndianPartOrdering(VT, DAG.getDataLayout()) &&        (!LegalOperations || TLI.isOperationLegal(ISD::LOAD, VT)) &&        TLI.isLoadBitCastBeneficial(N0.getValueType(), VT)) {      LoadSDNode *LN0 = cast<LoadSDNode>(N0); -    unsigned Align = TLI.getDataLayout()-> -      getABITypeAlignment(VT.getTypeForEVT(*DAG.getContext())); +    unsigned Align = DAG.getDataLayout().getABITypeAlignment( +        VT.getTypeForEVT(*DAG.getContext()));      unsigned OrigAlign = LN0->getAlignment();      if (Align <= OrigAlign) { @@ -7368,7 +7369,7 @@ ConstantFoldBITCASTofBUILD_VECTOR(SDNode *BV, EVT DstEltVT) {      SmallVector<SDValue, 8> Ops;      for (unsigned i = 0, e = BV->getNumOperands(); i != e;           i += NumInputsPerOutput) { -      bool isLE = TLI.isLittleEndian(); +      bool isLE = DAG.getDataLayout().isLittleEndian();        APInt NewBits = APInt(DstBitSize, 0);        bool EltIsUndef = true;        for (unsigned j = 0; j != NumInputsPerOutput; ++j) { @@ -7415,7 +7416,7 @@ ConstantFoldBITCASTofBUILD_VECTOR(SDNode *BV, EVT DstEltVT) {      }      // For big endian targets, swap the order of the pieces of each element. -    if (TLI.isBigEndian()) +    if (DAG.getDataLayout().isBigEndian())        std::reverse(Ops.end()-NumOutputsPerInput, Ops.end());    } @@ -8373,6 +8374,9 @@ SDValue DAGCombiner::visitFDIV(SDNode *N) {      if (TLI.combineRepeatedFPDivisors(Users.size())) {        SDValue FPOne = DAG.getConstantFP(1.0, DL, VT); +      // FIXME: This optimization requires some level of fast-math, so the +      // created reciprocal node should at least have the 'allowReciprocal' +      // fast-math-flag set.        SDValue Reciprocal = DAG.getNode(ISD::FDIV, DL, VT, FPOne, N1);        // Dividend / Divisor -> Dividend * Reciprocal @@ -8381,10 +8385,14 @@ SDValue DAGCombiner::visitFDIV(SDNode *N) {          if (Dividend != FPOne) {            SDValue NewNode = DAG.getNode(ISD::FMUL, SDLoc(U), VT, Dividend,                                          Reciprocal); -          DAG.ReplaceAllUsesWith(U, NewNode.getNode()); +          CombineTo(U, NewNode); +        } else if (U != Reciprocal.getNode()) { +          // In the absence of fast-math-flags, this user node is always the +          // same node as Reciprocal, but with FMF they may be different nodes. +          CombineTo(U, Reciprocal);          }        } -      return SDValue(); +      return SDValue(N, 0);  // N was replaced.      }    } @@ -8406,30 +8414,29 @@ SDValue DAGCombiner::visitFREM(SDNode *N) {  }  SDValue DAGCombiner::visitFSQRT(SDNode *N) { -  if (DAG.getTarget().Options.UnsafeFPMath && -      !TLI.isFsqrtCheap()) { -    // Compute this as X * (1/sqrt(X)) = X * (X ** -0.5) -    if (SDValue RV = BuildRsqrtEstimate(N->getOperand(0))) { -      EVT VT = RV.getValueType(); -      SDLoc DL(N); -      RV = DAG.getNode(ISD::FMUL, DL, VT, N->getOperand(0), RV); -      AddToWorklist(RV.getNode()); +  if (!DAG.getTarget().Options.UnsafeFPMath || TLI.isFsqrtCheap()) +    return SDValue(); -      // Unfortunately, RV is now NaN if the input was exactly 0. -      // Select out this case and force the answer to 0. -      SDValue Zero = DAG.getConstantFP(0.0, DL, VT); -      SDValue ZeroCmp = -        DAG.getSetCC(DL, TLI.getSetCCResultType(*DAG.getContext(), VT), -                     N->getOperand(0), Zero, ISD::SETEQ); -      AddToWorklist(ZeroCmp.getNode()); -      AddToWorklist(RV.getNode()); +  // Compute this as X * (1/sqrt(X)) = X * (X ** -0.5) +  SDValue RV = BuildRsqrtEstimate(N->getOperand(0)); +  if (!RV) +    return SDValue(); +   +  EVT VT = RV.getValueType(); +  SDLoc DL(N); +  RV = DAG.getNode(ISD::FMUL, DL, VT, N->getOperand(0), RV); +  AddToWorklist(RV.getNode()); -      RV = DAG.getNode(VT.isVector() ? ISD::VSELECT : ISD::SELECT, -                       DL, VT, ZeroCmp, Zero, RV); -      return RV; -    } -  } -  return SDValue(); +  // Unfortunately, RV is now NaN if the input was exactly 0. +  // Select out this case and force the answer to 0. +  SDValue Zero = DAG.getConstantFP(0.0, DL, VT); +  EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT); +  SDValue ZeroCmp = DAG.getSetCC(DL, CCVT, N->getOperand(0), Zero, ISD::SETEQ); +  AddToWorklist(ZeroCmp.getNode()); +  AddToWorklist(RV.getNode()); + +  return DAG.getNode(VT.isVector() ? ISD::VSELECT : ISD::SELECT, DL, VT, +                     ZeroCmp, Zero, RV);  }  SDValue DAGCombiner::visitFCOPYSIGN(SDNode *N) { @@ -9144,7 +9151,8 @@ static bool canFoldInAddressingMode(SDNode *N, SDNode *Use,    } else      return false; -  return TLI.isLegalAddressingMode(AM, VT.getTypeForEVT(*DAG.getContext()), AS); +  return TLI.isLegalAddressingMode(DAG.getDataLayout(), AM, +                                   VT.getTypeForEVT(*DAG.getContext()), AS);  }  /// Try turning a load/store into a pre-indexed load/store when the base @@ -9869,8 +9877,7 @@ struct LoadedSlice {    /// \pre DAG != nullptr.    uint64_t getOffsetFromBase() const {      assert(DAG && "Missing context."); -    bool IsBigEndian = -        DAG->getTargetLoweringInfo().getDataLayout()->isBigEndian(); +    bool IsBigEndian = DAG->getDataLayout().isBigEndian();      assert(!(Shift & 0x7) && "Shifts not aligned on Bytes are not supported.");      uint64_t Offset = Shift / 8;      unsigned TySizeInBytes = Origin->getValueSizeInBits(0) / 8; @@ -9953,7 +9960,7 @@ struct LoadedSlice {      // Check if it will be merged with the load.      // 1. Check the alignment constraint. -    unsigned RequiredAlignment = TLI.getDataLayout()->getABITypeAlignment( +    unsigned RequiredAlignment = DAG->getDataLayout().getABITypeAlignment(          ResVT.getTypeForEVT(*DAG->getContext()));      if (RequiredAlignment > getAlignment()) @@ -10321,7 +10328,7 @@ ShrinkLoadReplaceStoreWithStore(const std::pair<unsigned, unsigned> &MaskInfo,    unsigned StOffset;    unsigned NewAlign = St->getAlignment(); -  if (DAG.getTargetLoweringInfo().isLittleEndian()) +  if (DAG.getDataLayout().isLittleEndian())      StOffset = ByteShift;    else      StOffset = IVal.getValueType().getStoreSize() - ByteShift - NumBytes; @@ -10434,12 +10441,12 @@ SDValue DAGCombiner::ReduceLoadOpStoreWidth(SDNode *N) {        uint64_t PtrOff = ShAmt / 8;        // For big endian targets, we need to adjust the offset to the pointer to        // load the correct bytes. -      if (TLI.isBigEndian()) +      if (DAG.getDataLayout().isBigEndian())          PtrOff = (BitWidth + 7 - NewBW) / 8 - PtrOff;        unsigned NewAlign = MinAlign(LD->getAlignment(), PtrOff);        Type *NewVTTy = NewVT.getTypeForEVT(*DAG.getContext()); -      if (NewAlign < TLI.getDataLayout()->getABITypeAlignment(NewVTTy)) +      if (NewAlign < DAG.getDataLayout().getABITypeAlignment(NewVTTy))          return SDValue();        SDValue NewPtr = DAG.getNode(ISD::ADD, SDLoc(LD), @@ -10503,7 +10510,7 @@ SDValue DAGCombiner::TransformFPLoadStorePair(SDNode *N) {      unsigned LDAlign = LD->getAlignment();      unsigned STAlign = ST->getAlignment();      Type *IntVTTy = IntVT.getTypeForEVT(*DAG.getContext()); -    unsigned ABIAlign = TLI.getDataLayout()->getABITypeAlignment(IntVTTy); +    unsigned ABIAlign = DAG.getDataLayout().getABITypeAlignment(IntVTTy);      if (LDAlign < ABIAlign || STAlign < ABIAlign)        return SDValue(); @@ -10685,7 +10692,7 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(      // Construct a single integer constant which is made of the smaller      // constant inputs. -    bool IsLE = TLI.isLittleEndian(); +    bool IsLE = DAG.getDataLayout().isLittleEndian();      for (unsigned i = 0; i < NumElem ; ++i) {        unsigned Idx = IsLE ? (NumElem - 1 - i) : i;        StoreSDNode *St  = cast<StoreSDNode>(StoreNodes[Idx].MemNode); @@ -10743,7 +10750,7 @@ static bool allowableAlignment(const SelectionDAG &DAG,      return true;    Type *Ty = EVTTy.getTypeForEVT(*DAG.getContext()); -  unsigned ABIAlignment = TLI.getDataLayout()->getPrefTypeAlignment(Ty); +  unsigned ABIAlignment = DAG.getDataLayout().getPrefTypeAlignment(Ty);    return (Align >= ABIAlignment);  } @@ -11205,8 +11212,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {        ST->isUnindexed()) {      unsigned OrigAlign = ST->getAlignment();      EVT SVT = Value.getOperand(0).getValueType(); -    unsigned Align = TLI.getDataLayout()-> -      getABITypeAlignment(SVT.getTypeForEVT(*DAG.getContext())); +    unsigned Align = DAG.getDataLayout().getABITypeAlignment( +        SVT.getTypeForEVT(*DAG.getContext()));      if (Align <= OrigAlign &&          ((!LegalOperations && !ST->isVolatile()) ||           TLI.isOperationLegalOrCustom(ISD::STORE, SVT))) @@ -11265,7 +11272,8 @@ SDValue DAGCombiner::visitSTORE(SDNode *N) {            uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue();            SDValue Lo = DAG.getConstant(Val & 0xFFFFFFFF, SDLoc(CFP), MVT::i32);            SDValue Hi = DAG.getConstant(Val >> 32, SDLoc(CFP), MVT::i32); -          if (TLI.isBigEndian()) std::swap(Lo, Hi); +          if (DAG.getDataLayout().isBigEndian()) +            std::swap(Lo, Hi);            unsigned Alignment = ST->getAlignment();            bool isVolatile = ST->isVolatile(); @@ -11514,7 +11522,7 @@ SDValue DAGCombiner::ReplaceExtractVectorEltOfLoadWithNarrowedLoad(    EVT ResultVT = EVE->getValueType(0);    EVT VecEltVT = InVecVT.getVectorElementType();    unsigned Align = OriginalLoad->getAlignment(); -  unsigned NewAlign = TLI.getDataLayout()->getABITypeAlignment( +  unsigned NewAlign = DAG.getDataLayout().getABITypeAlignment(        VecEltVT.getTypeForEVT(*DAG.getContext()));    if (NewAlign > Align || !TLI.isOperationLegalOrCustom(ISD::LOAD, VecEltVT)) @@ -11648,7 +11656,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {      // scalar_to_vector here as well.      if (!LegalOperations) { -      EVT IndexTy = TLI.getVectorIdxTy(); +      EVT IndexTy = TLI.getVectorIdxTy(DAG.getDataLayout());        return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(N), NVT, SVInVec,                           DAG.getConstant(OrigElt, SDLoc(SVOp), IndexTy));      } @@ -11825,7 +11833,7 @@ SDValue DAGCombiner::reduceBuildVecExtToExtBuildVec(SDNode *N) {    if (!ValidTypes)      return SDValue(); -  bool isLE = TLI.isLittleEndian(); +  bool isLE = DAG.getDataLayout().isLittleEndian();    unsigned ElemRatio = OutScalarTy.getSizeInBits()/SourceType.getSizeInBits();    assert(ElemRatio > 1 && "Invalid element size ratio");    SDValue Filler = AllAnyExt ? DAG.getUNDEF(SourceType): @@ -12079,10 +12087,13 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {          // Try to replace VecIn1 with two extract_subvectors          // No need to update the masks, they should still be correct. -        VecIn2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1, -          DAG.getConstant(VT.getVectorNumElements(), dl, TLI.getVectorIdxTy())); -        VecIn1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1, -          DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +        VecIn2 = DAG.getNode( +            ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1, +            DAG.getConstant(VT.getVectorNumElements(), dl, +                            TLI.getVectorIdxTy(DAG.getDataLayout()))); +        VecIn1 = DAG.getNode( +            ISD::EXTRACT_SUBVECTOR, dl, VT, VecIn1, +            DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        } else          return SDValue();      } @@ -13354,12 +13365,13 @@ SDValue DAGCombiner::SimplifySelectCC(SDLoc DL, SDValue N0, SDValue N1,            const_cast<ConstantFP*>(TV->getConstantFPValue())          };          Type *FPTy = Elts[0]->getType(); -        const DataLayout &TD = *TLI.getDataLayout(); +        const DataLayout &TD = DAG.getDataLayout();          // Create a ConstantArray of the two constants.          Constant *CA = ConstantArray::get(ArrayType::get(FPTy, 2), Elts); -        SDValue CPIdx = DAG.getConstantPool(CA, TLI.getPointerTy(), -                                            TD.getPrefTypeAlignment(FPTy)); +        SDValue CPIdx = +            DAG.getConstantPool(CA, TLI.getPointerTy(DAG.getDataLayout()), +                                TD.getPrefTypeAlignment(FPTy));          unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();          // Get the offsets to the 0 and 1 element of the array so that we can @@ -13832,6 +13844,15 @@ bool DAGCombiner::isAlias(LSBaseSDNode *Op0, LSBaseSDNode *Op1) const {    // If they are both volatile then they cannot be reordered.    if (Op0->isVolatile() && Op1->isVolatile()) return true; +  // If one operation reads from invariant memory, and the other may store, they +  // cannot alias. These should really be checking the equivalent of mayWrite, +  // but it only matters for memory nodes other than load /store. +  if (Op0->isInvariant() && Op1->writeMem()) +    return false; + +  if (Op1->isInvariant() && Op0->writeMem()) +    return false; +    // Gather base node and offset information.    SDValue Base1, Base2;    int64_t Offset1, Offset2; diff --git a/lib/CodeGen/SelectionDAG/FastISel.cpp b/lib/CodeGen/SelectionDAG/FastISel.cpp index 5452b1721bb4..2b9ba2c1b534 100644 --- a/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -166,7 +166,7 @@ bool FastISel::hasTrivialKill(const Value *V) {  }  unsigned FastISel::getRegForValue(const Value *V) { -  EVT RealVT = TLI.getValueType(V->getType(), /*AllowUnknown=*/true); +  EVT RealVT = TLI.getValueType(DL, V->getType(), /*AllowUnknown=*/true);    // Don't handle non-simple values in FastISel.    if (!RealVT.isSimple())      return 0; @@ -228,7 +228,7 @@ unsigned FastISel::materializeConstant(const Value *V, MVT VT) {      if (!Reg) {        // Try to emit the constant by using an integer constant with a cast.        const APFloat &Flt = CF->getValueAPF(); -      EVT IntVT = TLI.getPointerTy(); +      EVT IntVT = TLI.getPointerTy(DL);        uint64_t x[2];        uint32_t IntBitWidth = IntVT.getSizeInBits(); @@ -321,7 +321,7 @@ std::pair<unsigned, bool> FastISel::getRegForGEPIndex(const Value *Idx) {    bool IdxNIsKill = hasTrivialKill(Idx);    // If the index is smaller or larger than intptr_t, truncate or extend it. -  MVT PtrVT = TLI.getPointerTy(); +  MVT PtrVT = TLI.getPointerTy(DL);    EVT IdxVT = EVT::getEVT(Idx->getType(), /*HandleUnknown=*/false);    if (IdxVT.bitsLT(PtrVT)) {      IdxN = fastEmit_r(IdxVT.getSimpleVT(), PtrVT, ISD::SIGN_EXTEND, IdxN, @@ -493,7 +493,7 @@ bool FastISel::selectGetElementPtr(const User *I) {    // FIXME: What's a good SWAG number for MaxOffs?    uint64_t MaxOffs = 2048;    Type *Ty = I->getOperand(0)->getType(); -  MVT VT = TLI.getPointerTy(); +  MVT VT = TLI.getPointerTy(DL);    for (GetElementPtrInst::const_op_iterator OI = I->op_begin() + 1,                                              E = I->op_end();         OI != E; ++OI) { @@ -908,10 +908,10 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {    // Handle the incoming return values from the call.    CLI.clearIns();    SmallVector<EVT, 4> RetTys; -  ComputeValueVTs(TLI, CLI.RetTy, RetTys); +  ComputeValueVTs(TLI, DL, CLI.RetTy, RetTys);    SmallVector<ISD::OutputArg, 4> Outs; -  GetReturnInfo(CLI.RetTy, getReturnAttrs(CLI), Outs, TLI); +  GetReturnInfo(CLI.RetTy, getReturnAttrs(CLI), Outs, TLI, DL);    bool CanLowerReturn = TLI.CanLowerReturn(        CLI.CallConv, *FuncInfo.MF, CLI.IsVarArg, Outs, CLI.RetTy->getContext()); @@ -976,7 +976,7 @@ bool FastISel::lowerCallTo(CallLoweringInfo &CLI) {        // not there, but there are cases it cannot get right.        unsigned FrameAlign = Arg.Alignment;        if (!FrameAlign) -        FrameAlign = TLI.getByValTypeAlignment(ElementTy); +        FrameAlign = TLI.getByValTypeAlignment(ElementTy, DL);        Flags.setByValSize(FrameSize);        Flags.setByValAlign(FrameAlign);      } @@ -1245,8 +1245,8 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {  }  bool FastISel::selectCast(const User *I, unsigned Opcode) { -  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); -  EVT DstVT = TLI.getValueType(I->getType()); +  EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType()); +  EVT DstVT = TLI.getValueType(DL, I->getType());    if (SrcVT == MVT::Other || !SrcVT.isSimple() || DstVT == MVT::Other ||        !DstVT.isSimple()) @@ -1288,8 +1288,8 @@ bool FastISel::selectBitCast(const User *I) {    }    // Bitcasts of other values become reg-reg copies or BITCAST operators. -  EVT SrcEVT = TLI.getValueType(I->getOperand(0)->getType()); -  EVT DstEVT = TLI.getValueType(I->getType()); +  EVT SrcEVT = TLI.getValueType(DL, I->getOperand(0)->getType()); +  EVT DstEVT = TLI.getValueType(DL, I->getType());    if (SrcEVT == MVT::Other || DstEVT == MVT::Other ||        !TLI.isTypeLegal(SrcEVT) || !TLI.isTypeLegal(DstEVT))      // Unhandled type. Halt "fast" selection and bail. @@ -1413,7 +1413,7 @@ bool FastISel::selectFNeg(const User *I) {    bool OpRegIsKill = hasTrivialKill(I);    // If the target has ISD::FNEG, use it. -  EVT VT = TLI.getValueType(I->getType()); +  EVT VT = TLI.getValueType(DL, I->getType());    unsigned ResultReg = fastEmit_r(VT.getSimpleVT(), VT.getSimpleVT(), ISD::FNEG,                                    OpReg, OpRegIsKill);    if (ResultReg) { @@ -1456,7 +1456,7 @@ bool FastISel::selectExtractValue(const User *U) {    // Make sure we only try to handle extracts with a legal result.  But also    // allow i1 because it's easy. -  EVT RealVT = TLI.getValueType(EVI->getType(), /*AllowUnknown=*/true); +  EVT RealVT = TLI.getValueType(DL, EVI->getType(), /*AllowUnknown=*/true);    if (!RealVT.isSimple())      return false;    MVT VT = RealVT.getSimpleVT(); @@ -1480,7 +1480,7 @@ bool FastISel::selectExtractValue(const User *U) {    unsigned VTIndex = ComputeLinearIndex(AggTy, EVI->getIndices());    SmallVector<EVT, 4> AggValueVTs; -  ComputeValueVTs(TLI, AggTy, AggValueVTs); +  ComputeValueVTs(TLI, DL, AggTy, AggValueVTs);    for (unsigned i = 0; i < VTIndex; i++)      ResultReg += TLI.getNumRegisters(FuncInfo.Fn->getContext(), AggValueVTs[i]); @@ -1582,8 +1582,8 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {    case Instruction::IntToPtr: // Deliberate fall-through.    case Instruction::PtrToInt: { -    EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); -    EVT DstVT = TLI.getValueType(I->getType()); +    EVT SrcVT = TLI.getValueType(DL, I->getOperand(0)->getType()); +    EVT DstVT = TLI.getValueType(DL, I->getType());      if (DstVT.bitsGT(SrcVT))        return selectCast(I, ISD::ZERO_EXTEND);      if (DstVT.bitsLT(SrcVT)) @@ -1612,7 +1612,7 @@ FastISel::FastISel(FunctionLoweringInfo &FuncInfo,                     bool SkipTargetIndependentISel)      : FuncInfo(FuncInfo), MF(FuncInfo.MF), MRI(FuncInfo.MF->getRegInfo()),        MFI(*FuncInfo.MF->getFrameInfo()), MCP(*FuncInfo.MF->getConstantPool()), -      TM(FuncInfo.MF->getTarget()), DL(*TM.getDataLayout()), +      TM(FuncInfo.MF->getTarget()), DL(MF->getDataLayout()),        TII(*MF->getSubtarget().getInstrInfo()),        TLI(*MF->getSubtarget().getTargetLowering()),        TRI(*MF->getSubtarget().getRegisterInfo()), LibInfo(LibInfo), @@ -2037,7 +2037,7 @@ bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {        // own moves. Second, this check is necessary because FastISel doesn't        // use CreateRegs to create registers, so it always creates        // exactly one register for each non-void instruction. -      EVT VT = TLI.getValueType(PN->getType(), /*AllowUnknown=*/true); +      EVT VT = TLI.getValueType(DL, PN->getType(), /*AllowUnknown=*/true);        if (VT == MVT::Other || !TLI.isTypeLegal(VT)) {          // Handle integer promotions, though, because they're common and easy.          if (!(VT == MVT::i1 || VT == MVT::i8 || VT == MVT::i16)) { diff --git a/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index ecaa2c972719..cc306cbf5ae4 100644 --- a/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -90,7 +90,8 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,    // Check whether the function can return without sret-demotion.    SmallVector<ISD::OutputArg, 4> Outs; -  GetReturnInfo(Fn->getReturnType(), Fn->getAttributes(), Outs, *TLI); +  GetReturnInfo(Fn->getReturnType(), Fn->getAttributes(), Outs, *TLI, +                mf.getDataLayout());    CanLowerReturn = TLI->CanLowerReturn(Fn->getCallingConv(), *MF,                                         Fn->isVarArg(), Outs, Fn->getContext()); @@ -106,9 +107,9 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,          if (AI->isStaticAlloca()) {            const ConstantInt *CUI = cast<ConstantInt>(AI->getArraySize());            Type *Ty = AI->getAllocatedType(); -          uint64_t TySize = TLI->getDataLayout()->getTypeAllocSize(Ty); +          uint64_t TySize = MF->getDataLayout().getTypeAllocSize(Ty);            unsigned Align = -              std::max((unsigned)TLI->getDataLayout()->getPrefTypeAlignment(Ty), +              std::max((unsigned)MF->getDataLayout().getPrefTypeAlignment(Ty),                         AI->getAlignment());            TySize *= CUI->getZExtValue();   // Get total allocated size. @@ -118,10 +119,10 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,              MF->getFrameInfo()->CreateStackObject(TySize, Align, false, AI);          } else { -          unsigned Align = std::max( -              (unsigned)TLI->getDataLayout()->getPrefTypeAlignment( -                AI->getAllocatedType()), -              AI->getAlignment()); +          unsigned Align = +              std::max((unsigned)MF->getDataLayout().getPrefTypeAlignment( +                           AI->getAllocatedType()), +                       AI->getAlignment());            unsigned StackAlign =                MF->getSubtarget().getFrameLowering()->getStackAlignment();            if (Align <= StackAlign) @@ -138,7 +139,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,            unsigned SP = TLI->getStackPointerRegisterToSaveRestore();            const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();            std::vector<TargetLowering::AsmOperandInfo> Ops = -              TLI->ParseConstraints(TRI, CS); +              TLI->ParseConstraints(Fn->getParent()->getDataLayout(), TRI, CS);            for (size_t I = 0, E = Ops.size(); I != E; ++I) {              TargetLowering::AsmOperandInfo &Op = Ops[I];              if (Op.Type == InlineAsm::isClobber) { @@ -148,7 +149,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,                    TLI->getRegForInlineAsmConstraint(TRI, Op.ConstraintCode,                                                      Op.ConstraintVT);                if (PhysReg.first == SP) -                MF->getFrameInfo()->setHasInlineAsmWithSPAdjust(true); +                MF->getFrameInfo()->setHasOpaqueSPAdjustment(true);              }            }          } @@ -236,7 +237,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,        assert(PHIReg && "PHI node does not have an assigned virtual register!");        SmallVector<EVT, 4> ValueVTs; -      ComputeValueVTs(*TLI, PN->getType(), ValueVTs); +      ComputeValueVTs(*TLI, MF->getDataLayout(), PN->getType(), ValueVTs);        for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {          EVT VT = ValueVTs[vti];          unsigned NumRegisters = TLI->getNumRegisters(Fn->getContext(), VT); @@ -366,7 +367,7 @@ unsigned FunctionLoweringInfo::CreateRegs(Type *Ty) {    const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();    SmallVector<EVT, 4> ValueVTs; -  ComputeValueVTs(*TLI, Ty, ValueVTs); +  ComputeValueVTs(*TLI, MF->getDataLayout(), Ty, ValueVTs);    unsigned FirstReg = 0;    for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) { @@ -413,7 +414,7 @@ void FunctionLoweringInfo::ComputePHILiveOutRegInfo(const PHINode *PN) {      return;    SmallVector<EVT, 1> ValueVTs; -  ComputeValueVTs(*TLI, Ty, ValueVTs); +  ComputeValueVTs(*TLI, MF->getDataLayout(), Ty, ValueVTs);    assert(ValueVTs.size() == 1 &&           "PHIs with non-vector integer types should have a single VT.");    EVT IntVT = ValueVTs[0]; diff --git a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp index 42595cb010c2..5ec10308dc28 100644 --- a/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ b/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -406,10 +406,10 @@ void InstrEmitter::AddOperand(MachineInstrBuilder &MIB,      Type *Type = CP->getType();      // MachineConstantPool wants an explicit alignment.      if (Align == 0) { -      Align = MF->getTarget().getDataLayout()->getPrefTypeAlignment(Type); +      Align = MF->getDataLayout().getPrefTypeAlignment(Type);        if (Align == 0) {          // Alignment of vector types.  FIXME! -        Align = MF->getTarget().getDataLayout()->getTypeAllocSize(Type); +        Align = MF->getDataLayout().getTypeAllocSize(Type);        }      } diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index c0d7871bf08b..21ab07234c81 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -65,7 +65,7 @@ class SelectionDAGLegalize {    SmallSetVector<SDNode *, 16> *UpdatedNodes;    EVT getSetCCResultType(EVT VT) const { -    return TLI.getSetCCResultType(*DAG.getContext(), VT); +    return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);    }    // Libcall insertion helpers. @@ -269,7 +269,8 @@ SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP) {      }    } -  SDValue CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); +  SDValue CPIdx = +      DAG.getConstantPool(LLVMC, TLI.getPointerTy(DAG.getDataLayout()));    unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();    if (Extend) {      SDValue Result = @@ -331,7 +332,8 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,      SDValue Store = DAG.getTruncStore(Chain, dl,                                        Val, StackPtr, MachinePointerInfo(),                                        StoredVT, false, false, 0); -    SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy(AS)); +    SDValue Increment = DAG.getConstant( +        RegBytes, dl, TLI.getPointerTy(DAG.getDataLayout(), AS));      SmallVector<SDValue, 8> Stores;      unsigned Offset = 0; @@ -385,24 +387,27 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,    int IncrementSize = NumBits / 8;    // Divide the stored value in two parts. -  SDValue ShiftAmount = DAG.getConstant(NumBits, dl, -                                      TLI.getShiftAmountTy(Val.getValueType())); +  SDValue ShiftAmount = +      DAG.getConstant(NumBits, dl, TLI.getShiftAmountTy(Val.getValueType(), +                                                        DAG.getDataLayout()));    SDValue Lo = Val;    SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);    // Store the two parts    SDValue Store1, Store2; -  Store1 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Lo:Hi, Ptr, -                             ST->getPointerInfo(), NewStoredVT, +  Store1 = DAG.getTruncStore(Chain, dl, +                             DAG.getDataLayout().isLittleEndian() ? Lo : Hi, +                             Ptr, ST->getPointerInfo(), NewStoredVT,                               ST->isVolatile(), ST->isNonTemporal(), Alignment);    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, -                    DAG.getConstant(IncrementSize, dl, TLI.getPointerTy(AS))); +                    DAG.getConstant(IncrementSize, dl, +                                    TLI.getPointerTy(DAG.getDataLayout(), AS)));    Alignment = MinAlign(Alignment, IncrementSize); -  Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr, -                             ST->getPointerInfo().getWithOffset(IncrementSize), -                             NewStoredVT, ST->isVolatile(), ST->isNonTemporal(), -                             Alignment, ST->getAAInfo()); +  Store2 = DAG.getTruncStore( +      Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr, +      ST->getPointerInfo().getWithOffset(IncrementSize), NewStoredVT, +      ST->isVolatile(), ST->isNonTemporal(), Alignment, ST->getAAInfo());    SDValue Result =      DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2); @@ -448,7 +453,8 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,      // Make sure the stack slot is also aligned for the register type.      SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT); -    SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy()); +    SDValue Increment = +        DAG.getConstant(RegBytes, dl, TLI.getPointerTy(DAG.getDataLayout()));      SmallVector<SDValue, 8> Stores;      SDValue StackPtr = StackBase;      unsigned Offset = 0; @@ -522,7 +528,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,    // Load the value in two parts    SDValue Lo, Hi; -  if (TLI.isLittleEndian()) { +  if (DAG.getDataLayout().isLittleEndian()) {      Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),                          NewLoadedVT, LD->isVolatile(),                          LD->isNonTemporal(), LD->isInvariant(), Alignment, @@ -549,8 +555,9 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,    }    // aggregate the two parts -  SDValue ShiftAmount = DAG.getConstant(NumBits, dl, -                                       TLI.getShiftAmountTy(Hi.getValueType())); +  SDValue ShiftAmount = +      DAG.getConstant(NumBits, dl, TLI.getShiftAmountTy(Hi.getValueType(), +                                                        DAG.getDataLayout()));    SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);    Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo); @@ -581,7 +588,7 @@ PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,    EVT VT    = Tmp1.getValueType();    EVT EltVT = VT.getVectorElementType();    EVT IdxVT = Tmp3.getValueType(); -  EVT PtrVT = TLI.getPointerTy(); +  EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());    SDValue StackPtr = DAG.CreateStackTemporary(VT);    int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex(); @@ -677,7 +684,8 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {          const APInt &IntVal = CFP->getValueAPF().bitcastToAPInt();          SDValue Lo = DAG.getConstant(IntVal.trunc(32), dl, MVT::i32);          SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), dl, MVT::i32); -        if (TLI.isBigEndian()) std::swap(Lo, Hi); +        if (DAG.getDataLayout().isBigEndian()) +          std::swap(Lo, Hi);          Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(), isVolatile,                            isNonTemporal, Alignment, AAInfo); @@ -724,7 +732,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {            unsigned Align = ST->getAlignment();            if (!TLI.allowsMisalignedMemoryAccesses(ST->getMemoryVT(), AS, Align)) {              Type *Ty = ST->getMemoryVT().getTypeForEVT(*DAG.getContext()); -            unsigned ABIAlignment= TLI.getDataLayout()->getABITypeAlignment(Ty); +            unsigned ABIAlignment = DAG.getDataLayout().getABITypeAlignment(Ty);              if (Align < ABIAlignment)                ExpandUnalignedStore(cast<StoreSDNode>(Node), DAG, TLI, this);            } @@ -756,6 +764,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {        EVT StVT = ST->getMemoryVT();        unsigned StWidth = StVT.getSizeInBits(); +      auto &DL = DAG.getDataLayout();        if (StWidth != StVT.getStoreSizeInBits()) {          // Promote to a byte-sized store with upper bits zero if not @@ -782,7 +791,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {          SDValue Lo, Hi;          unsigned IncrementSize; -        if (TLI.isLittleEndian()) { +        if (DL.isLittleEndian()) {            // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16)            // Store the bottom RoundWidth bits.            Lo = DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(), @@ -795,9 +804,10 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {            Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,                              DAG.getConstant(IncrementSize, dl,                                              Ptr.getValueType())); -          Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value, -                           DAG.getConstant(RoundWidth, dl, -                                   TLI.getShiftAmountTy(Value.getValueType()))); +          Hi = DAG.getNode( +              ISD::SRL, dl, Value.getValueType(), Value, +              DAG.getConstant(RoundWidth, dl, +                              TLI.getShiftAmountTy(Value.getValueType(), DL)));            Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr,                               ST->getPointerInfo().getWithOffset(IncrementSize),                                   ExtraVT, isVolatile, isNonTemporal, @@ -806,9 +816,10 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {            // Big endian - avoid unaligned stores.            // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X            // Store the top RoundWidth bits. -          Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value, -                           DAG.getConstant(ExtraWidth, dl, -                                   TLI.getShiftAmountTy(Value.getValueType()))); +          Hi = DAG.getNode( +              ISD::SRL, dl, Value.getValueType(), Value, +              DAG.getConstant(ExtraWidth, dl, +                              TLI.getShiftAmountTy(Value.getValueType(), DL)));            Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, ST->getPointerInfo(),                                   RoundVT, isVolatile, isNonTemporal, Alignment,                                   AAInfo); @@ -838,7 +849,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {            // expand it.            if (!TLI.allowsMisalignedMemoryAccesses(ST->getMemoryVT(), AS, Align)) {              Type *Ty = ST->getMemoryVT().getTypeForEVT(*DAG.getContext()); -            unsigned ABIAlignment= TLI.getDataLayout()->getABITypeAlignment(Ty); +            unsigned ABIAlignment = DL.getABITypeAlignment(Ty);              if (Align < ABIAlignment)                ExpandUnalignedStore(cast<StoreSDNode>(Node), DAG, TLI, this);            } @@ -890,8 +901,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {        // expand it.        if (!TLI.allowsMisalignedMemoryAccesses(LD->getMemoryVT(), AS, Align)) {          Type *Ty = LD->getMemoryVT().getTypeForEVT(*DAG.getContext()); -        unsigned ABIAlignment = -          TLI.getDataLayout()->getABITypeAlignment(Ty); +        unsigned ABIAlignment = DAG.getDataLayout().getABITypeAlignment(Ty);          if (Align < ABIAlignment){            ExpandUnalignedLoad(cast<LoadSDNode>(Node), DAG, TLI, RVal, RChain);          } @@ -995,8 +1005,9 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {      EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth);      SDValue Lo, Hi, Ch;      unsigned IncrementSize; +    auto &DL = DAG.getDataLayout(); -    if (TLI.isLittleEndian()) { +    if (DL.isLittleEndian()) {        // EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16)        // Load the bottom RoundWidth bits.        Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0), @@ -1020,9 +1031,10 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {                         Hi.getValue(1));        // Move the top bits to the right place. -      Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, -                       DAG.getConstant(RoundWidth, dl, -                                      TLI.getShiftAmountTy(Hi.getValueType()))); +      Hi = DAG.getNode( +          ISD::SHL, dl, Hi.getValueType(), Hi, +          DAG.getConstant(RoundWidth, dl, +                          TLI.getShiftAmountTy(Hi.getValueType(), DL)));        // Join the hi and lo parts.        Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); @@ -1051,9 +1063,10 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {                         Hi.getValue(1));        // Move the top bits to the right place. -      Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, -                       DAG.getConstant(ExtraWidth, dl, -                                      TLI.getShiftAmountTy(Hi.getValueType()))); +      Hi = DAG.getNode( +          ISD::SHL, dl, Hi.getValueType(), Hi, +          DAG.getConstant(ExtraWidth, dl, +                          TLI.getShiftAmountTy(Hi.getValueType(), DL)));        // Join the hi and lo parts.        Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); @@ -1086,7 +1099,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {          unsigned Align = LD->getAlignment();          if (!TLI.allowsMisalignedMemoryAccesses(MemVT, AS, Align)) {            Type *Ty = LD->getMemoryVT().getTypeForEVT(*DAG.getContext()); -          unsigned ABIAlignment = TLI.getDataLayout()->getABITypeAlignment(Ty); +          unsigned ABIAlignment = DAG.getDataLayout().getABITypeAlignment(Ty);            if (Align < ABIAlignment){              ExpandUnalignedLoad(cast<LoadSDNode>(Node), DAG, TLI, Value, Chain);            } @@ -1439,7 +1452,7 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {    Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,                      DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType())); -  Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy()); +  Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy(DAG.getDataLayout()));    StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr);    SDValue NewLoad; @@ -1491,7 +1504,7 @@ SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {    Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,                      DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType())); -  Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy()); +  Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy(DAG.getDataLayout()));    SDValue SubStackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx,                                      StackPtr); @@ -1569,15 +1582,16 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {      // Convert to an integer with the same sign bit.      SignBit = DAG.getNode(ISD::BITCAST, dl, IVT, Tmp2);    } else { +    auto &DL = DAG.getDataLayout();      // Store the float to memory, then load the sign part out as an integer. -    MVT LoadTy = TLI.getPointerTy(); +    MVT LoadTy = TLI.getPointerTy(DL);      // First create a temporary that is aligned for both the load and store.      SDValue StackPtr = DAG.CreateStackTemporary(FloatVT, LoadTy);      // Then store the float to it.      SDValue Ch =        DAG.getStore(DAG.getEntryNode(), dl, Tmp2, StackPtr, MachinePointerInfo(),                     false, false, 0); -    if (TLI.isBigEndian()) { +    if (DL.isBigEndian()) {        assert(FloatVT.isByteSized() && "Unsupported floating point type!");        // Load out a legal integer with the same sign bit as the float.        SignBit = DAG.getLoad(LoadTy, dl, Ch, StackPtr, MachinePointerInfo(), @@ -1599,9 +1613,10 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {          (FloatVT.getSizeInBits() - 8 * ByteOffset);        assert(BitShift < LoadTy.getSizeInBits() && "Pointer advanced wrong?");        if (BitShift) -        SignBit = DAG.getNode(ISD::SHL, dl, LoadTy, SignBit, -                              DAG.getConstant(BitShift, dl, -                                 TLI.getShiftAmountTy(SignBit.getValueType()))); +        SignBit = DAG.getNode( +            ISD::SHL, dl, LoadTy, SignBit, +            DAG.getConstant(BitShift, dl, +                            TLI.getShiftAmountTy(SignBit.getValueType(), DL)));      }    }    // Now get the sign bit proper, by seeing whether the value is negative. @@ -1777,9 +1792,8 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,                                                 EVT DestVT,                                                 SDLoc dl) {    // Create the stack frame object. -  unsigned SrcAlign = -    TLI.getDataLayout()->getPrefTypeAlignment(SrcOp.getValueType(). -                                              getTypeForEVT(*DAG.getContext())); +  unsigned SrcAlign = DAG.getDataLayout().getPrefTypeAlignment( +      SrcOp.getValueType().getTypeForEVT(*DAG.getContext()));    SDValue FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign);    FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr); @@ -1790,7 +1804,7 @@ SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp,    unsigned SlotSize = SlotVT.getSizeInBits();    unsigned DestSize = DestVT.getSizeInBits();    Type *DestType = DestVT.getTypeForEVT(*DAG.getContext()); -  unsigned DestAlign = TLI.getDataLayout()->getPrefTypeAlignment(DestType); +  unsigned DestAlign = DAG.getDataLayout().getPrefTypeAlignment(DestType);    // Emit a store to the stack slot.  Use a truncstore if the input value is    // later than DestVT. @@ -1994,7 +2008,8 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) {        }      }      Constant *CP = ConstantVector::get(CV); -    SDValue CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); +    SDValue CPIdx = +        DAG.getConstantPool(CP, TLI.getPointerTy(DAG.getDataLayout()));      unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();      return DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,                         MachinePointerInfo::getConstantPool(), @@ -2058,7 +2073,7 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,      Args.push_back(Entry);    }    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); @@ -2106,7 +2121,7 @@ SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, EVT RetVT,      Args.push_back(Entry);    }    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); @@ -2140,7 +2155,7 @@ SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC,      Args.push_back(Entry);    }    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); @@ -2277,7 +2292,7 @@ SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,    Args.push_back(Entry);    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    SDLoc dl(Node);    TargetLowering::CallLoweringInfo CLI(DAG); @@ -2389,7 +2404,7 @@ SelectionDAGLegalize::ExpandSinCosLibCall(SDNode *Node,    Args.push_back(Entry);    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    SDLoc dl(Node);    TargetLowering::CallLoweringInfo CLI(DAG); @@ -2426,7 +2441,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,      SDValue Hi = StackSlot;      SDValue Lo = DAG.getNode(ISD::ADD, dl, StackSlot.getValueType(),                               StackSlot, WordOff); -    if (TLI.isLittleEndian()) +    if (DAG.getDataLayout().isLittleEndian())        std::swap(Hi, Lo);      // if signed map to unsigned space @@ -2509,8 +2524,8 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,      if (!isSigned) {        SDValue Fast = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, Op0); -      SDValue ShiftConst = -          DAG.getConstant(1, dl, TLI.getShiftAmountTy(Op0.getValueType())); +      SDValue ShiftConst = DAG.getConstant( +          1, dl, TLI.getShiftAmountTy(Op0.getValueType(), DAG.getDataLayout()));        SDValue Shr = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0, ShiftConst);        SDValue AndConst = DAG.getConstant(1, dl, MVT::i64);        SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, AndConst); @@ -2545,7 +2560,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,                                                MVT::i64),                                ISD::SETUGE);      SDValue Sel2 = DAG.getSelect(dl, MVT::i64, Ge, Sel, Op0); -    EVT SHVT = TLI.getShiftAmountTy(Sel2.getValueType()); +    EVT SHVT = TLI.getShiftAmountTy(Sel2.getValueType(), DAG.getDataLayout());      SDValue Sh = DAG.getNode(ISD::SRL, dl, MVT::i64, Sel2,                               DAG.getConstant(32, dl, SHVT)); @@ -2584,11 +2599,13 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,    case MVT::i32: FF = 0x4F800000ULL; break;  // 2^32 (as a float)    case MVT::i64: FF = 0x5F800000ULL; break;  // 2^64 (as a float)    } -  if (TLI.isLittleEndian()) FF <<= 32; +  if (DAG.getDataLayout().isLittleEndian()) +    FF <<= 32;    Constant *FudgeFactor = ConstantInt::get(                                         Type::getInt64Ty(*DAG.getContext()), FF); -  SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); +  SDValue CPIdx = +      DAG.getConstantPool(FudgeFactor, TLI.getPointerTy(DAG.getDataLayout()));    unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment();    CPIdx = DAG.getNode(ISD::ADD, dl, CPIdx.getValueType(), CPIdx, CstOffset);    Alignment = std::min(Alignment, 4u); @@ -2699,7 +2716,7 @@ SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp,  /// Open code the operations for BSWAP of the specified operation.  SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, SDLoc dl) {    EVT VT = Op.getValueType(); -  EVT SHVT = TLI.getShiftAmountTy(VT); +  EVT SHVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());    SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;    switch (VT.getSimpleVT().SimpleTy) {    default: llvm_unreachable("Unhandled Expand type in BSWAP!"); @@ -2756,7 +2773,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,    default: llvm_unreachable("Cannot expand this yet!");    case ISD::CTPOP: {      EVT VT = Op.getValueType(); -    EVT ShVT = TLI.getShiftAmountTy(VT); +    EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());      unsigned Len = VT.getSizeInBits();      assert(VT.isInteger() && Len <= 128 && Len % 8 == 0 && @@ -2814,7 +2831,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,      //      // Ref: "Hacker's Delight" by Henry Warren      EVT VT = Op.getValueType(); -    EVT ShVT = TLI.getShiftAmountTy(VT); +    EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());      unsigned len = VT.getSizeInBits();      for (unsigned i = 0; (1U << i) <= (len / 2); ++i) {        SDValue Tmp3 = DAG.getConstant(1ULL << i, dl, ShVT); @@ -2903,10 +2920,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      TargetLowering::ArgListTy Args;      TargetLowering::CallLoweringInfo CLI(DAG); -    CLI.setDebugLoc(dl).setChain(Node->getOperand(0)) -      .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), -                 DAG.getExternalSymbol("__sync_synchronize", -                 TLI.getPointerTy()), std::move(Args), 0); +    CLI.setDebugLoc(dl) +        .setChain(Node->getOperand(0)) +        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), +                   DAG.getExternalSymbol("__sync_synchronize", +                                         TLI.getPointerTy(DAG.getDataLayout())), +                   std::move(Args), 0);      std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI); @@ -3002,10 +3021,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      // If this operation is not supported, lower it to 'abort()' call      TargetLowering::ArgListTy Args;      TargetLowering::CallLoweringInfo CLI(DAG); -    CLI.setDebugLoc(dl).setChain(Node->getOperand(0)) -      .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), -                 DAG.getExternalSymbol("abort", TLI.getPointerTy()), -                 std::move(Args), 0); +    CLI.setDebugLoc(dl) +        .setChain(Node->getOperand(0)) +        .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), +                   DAG.getExternalSymbol("abort", +                                         TLI.getPointerTy(DAG.getDataLayout())), +                   std::move(Args), 0);      std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);      Results.push_back(CallResult.second); @@ -3028,7 +3049,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      // SAR.  However, it is doubtful that any exist.      EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT();      EVT VT = Node->getValueType(0); -    EVT ShiftAmountTy = TLI.getShiftAmountTy(VT); +    EVT ShiftAmountTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());      if (VT.isVector())        ShiftAmountTy = VT;      unsigned BitsDiff = VT.getScalarType().getSizeInBits() - @@ -3092,9 +3113,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      Tmp2 = Node->getOperand(1);      unsigned Align = Node->getConstantOperandVal(3); -    SDValue VAListLoad = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, -                                     MachinePointerInfo(V), -                                     false, false, false, 0); +    SDValue VAListLoad = +        DAG.getLoad(TLI.getPointerTy(DAG.getDataLayout()), dl, Tmp1, Tmp2, +                    MachinePointerInfo(V), false, false, false, 0);      SDValue VAList = VAListLoad;      if (Align > TLI.getMinStackArgumentAlignment()) { @@ -3111,10 +3132,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      // Increment the pointer, VAList, to the next vaarg      Tmp3 = DAG.getNode(ISD::ADD, dl, VAList.getValueType(), VAList, -                       DAG.getConstant(TLI.getDataLayout()-> -                          getTypeAllocSize(VT.getTypeForEVT(*DAG.getContext())), -                                       dl, -                                       VAList.getValueType())); +                       DAG.getConstant(DAG.getDataLayout().getTypeAllocSize( +                                           VT.getTypeForEVT(*DAG.getContext())), +                                       dl, VAList.getValueType()));      // Store the incremented VAList to the legalized pointer      Tmp3 = DAG.getStore(VAListLoad.getValue(1), dl, Tmp3, Tmp2,                          MachinePointerInfo(V), false, false, 0); @@ -3129,9 +3149,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      // output, returning the chain.      const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();      const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue(); -    Tmp1 = DAG.getLoad(TLI.getPointerTy(), dl, Node->getOperand(0), -                       Node->getOperand(2), MachinePointerInfo(VS), -                       false, false, false, 0); +    Tmp1 = DAG.getLoad(TLI.getPointerTy(DAG.getDataLayout()), dl, +                       Node->getOperand(0), Node->getOperand(2), +                       MachinePointerInfo(VS), false, false, false, 0);      Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),                          MachinePointerInfo(VD), false, false, 0);      Results.push_back(Tmp1); @@ -3226,14 +3246,14 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {        }        unsigned Idx = Mask[i];        if (Idx < NumElems) -        Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, -                                  Op0, -                                  DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()))); +        Ops.push_back(DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op0, +            DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));        else -        Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, -                                  Op1, -                                  DAG.getConstant(Idx - NumElems, dl, -                                                  TLI.getVectorIdxTy()))); +        Ops.push_back(DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Op1, +            DAG.getConstant(Idx - NumElems, dl, +                            TLI.getVectorIdxTy(DAG.getDataLayout()))));      }      Tmp1 = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops); @@ -3247,8 +3267,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {        // 1 -> Hi        Tmp1 = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0), -                         DAG.getConstant(OpTy.getSizeInBits()/2, dl, -                    TLI.getShiftAmountTy(Node->getOperand(0).getValueType()))); +                         DAG.getConstant(OpTy.getSizeInBits() / 2, dl, +                                         TLI.getShiftAmountTy( +                                             Node->getOperand(0).getValueType(), +                                             DAG.getDataLayout())));        Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1);      } else {        // 0 -> Lo @@ -3646,8 +3668,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {          TLI.expandMUL(Node, Lo, Hi, HalfType, DAG)) {        Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);        Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Hi); -      SDValue Shift = DAG.getConstant(HalfType.getSizeInBits(), dl, -                                      TLI.getShiftAmountTy(HalfType)); +      SDValue Shift = +          DAG.getConstant(HalfType.getSizeInBits(), dl, +                          TLI.getShiftAmountTy(HalfType, DAG.getDataLayout()));        Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);        Results.push_back(DAG.getNode(ISD::OR, dl, VT, Lo, Hi));        break; @@ -3759,12 +3782,14 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {        // The high part is obtained by SRA'ing all but one of the bits of low        // part.        unsigned LoSize = VT.getSizeInBits(); -      SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, RHS, -                                  DAG.getConstant(LoSize - 1, dl, -                                                  TLI.getPointerTy())); -      SDValue HiRHS = DAG.getNode(ISD::SRA, dl, VT, LHS, -                                  DAG.getConstant(LoSize - 1, dl, -                                                  TLI.getPointerTy())); +      SDValue HiLHS = +          DAG.getNode(ISD::SRA, dl, VT, RHS, +                      DAG.getConstant(LoSize - 1, dl, +                                      TLI.getPointerTy(DAG.getDataLayout()))); +      SDValue HiRHS = +          DAG.getNode(ISD::SRA, dl, VT, LHS, +                      DAG.getConstant(LoSize - 1, dl, +                                      TLI.getPointerTy(DAG.getDataLayout())));        // Here we're passing the 2 arguments explicitly as 4 arguments that are        // pre-lowered to the correct types. This all depends upon WideVT not @@ -3785,8 +3810,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      }      if (isSigned) { -      Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1, dl, -                             TLI.getShiftAmountTy(BottomHalf.getValueType())); +      Tmp1 = DAG.getConstant( +          VT.getSizeInBits() - 1, dl, +          TLI.getShiftAmountTy(BottomHalf.getValueType(), DAG.getDataLayout()));        Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, Tmp1);        TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf, Tmp1,                               ISD::SETNE); @@ -3802,9 +3828,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      EVT PairTy = Node->getValueType(0);      Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, PairTy, Node->getOperand(0));      Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Node->getOperand(1)); -    Tmp2 = DAG.getNode(ISD::SHL, dl, PairTy, Tmp2, -                       DAG.getConstant(PairTy.getSizeInBits()/2, dl, -                                       TLI.getShiftAmountTy(PairTy))); +    Tmp2 = DAG.getNode( +        ISD::SHL, dl, PairTy, Tmp2, +        DAG.getConstant(PairTy.getSizeInBits() / 2, dl, +                        TLI.getShiftAmountTy(PairTy, DAG.getDataLayout())));      Results.push_back(DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2));      break;    } @@ -3828,9 +3855,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      SDValue Table = Node->getOperand(1);      SDValue Index = Node->getOperand(2); -    EVT PTy = TLI.getPointerTy(); +    EVT PTy = TLI.getPointerTy(DAG.getDataLayout()); -    const DataLayout &TD = *TLI.getDataLayout(); +    const DataLayout &TD = DAG.getDataLayout();      unsigned EntrySize =        DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(TD); @@ -3936,7 +3963,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {        assert(!TLI.isOperationExpand(ISD::SELECT, VT) &&               "Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be "               "expanded."); -      EVT CCVT = TLI.getSetCCResultType(*DAG.getContext(), CmpVT); +      EVT CCVT = +          TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), CmpVT);        SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC);        Results.push_back(DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4));        break; @@ -4036,14 +4064,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {      SmallVector<SDValue, 8> Scalars;      for (unsigned Idx = 0; Idx < NumElem; Idx++) { -      SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, -                               VT.getScalarType(), -                               Node->getOperand(0), -                               DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); -      SDValue Sh = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, -                               VT.getScalarType(), -                               Node->getOperand(1), -                               DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); +      SDValue Ex = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(), Node->getOperand(0), +          DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); +      SDValue Sh = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, VT.getScalarType(), Node->getOperand(1), +          DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,                                      VT.getScalarType(), Ex, Sh));      } @@ -4114,9 +4140,10 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {      unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();      Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));      Tmp1 = DAG.getNode(ISD::BSWAP, dl, NVT, Tmp1); -    Tmp1 = DAG.getNode(ISD::SRL, dl, NVT, Tmp1, -                       DAG.getConstant(DiffBits, dl, -                                       TLI.getShiftAmountTy(NVT))); +    Tmp1 = DAG.getNode( +        ISD::SRL, dl, NVT, Tmp1, +        DAG.getConstant(DiffBits, dl, +                        TLI.getShiftAmountTy(NVT, DAG.getDataLayout())));      Results.push_back(Tmp1);      break;    } diff --git a/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp index 37fdf4453fd4..3c50a4155731 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp @@ -218,29 +218,35 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) {    unsigned RSize = RVT.getSizeInBits();    // First get the sign bit of second operand. -  SDValue SignBit = DAG.getNode(ISD::SHL, dl, RVT, DAG.getConstant(1, dl, RVT), -                                  DAG.getConstant(RSize - 1, dl, -                                                  TLI.getShiftAmountTy(RVT))); +  SDValue SignBit = DAG.getNode( +      ISD::SHL, dl, RVT, DAG.getConstant(1, dl, RVT), +      DAG.getConstant(RSize - 1, dl, +                      TLI.getShiftAmountTy(RVT, DAG.getDataLayout())));    SignBit = DAG.getNode(ISD::AND, dl, RVT, RHS, SignBit);    // Shift right or sign-extend it if the two operands have different types.    int SizeDiff = RVT.getSizeInBits() - LVT.getSizeInBits();    if (SizeDiff > 0) { -    SignBit = DAG.getNode(ISD::SRL, dl, RVT, SignBit, -                          DAG.getConstant(SizeDiff, dl, -                                 TLI.getShiftAmountTy(SignBit.getValueType()))); +    SignBit = +        DAG.getNode(ISD::SRL, dl, RVT, SignBit, +                    DAG.getConstant(SizeDiff, dl, +                                    TLI.getShiftAmountTy(SignBit.getValueType(), +                                                         DAG.getDataLayout())));      SignBit = DAG.getNode(ISD::TRUNCATE, dl, LVT, SignBit);    } else if (SizeDiff < 0) {      SignBit = DAG.getNode(ISD::ANY_EXTEND, dl, LVT, SignBit); -    SignBit = DAG.getNode(ISD::SHL, dl, LVT, SignBit, -                          DAG.getConstant(-SizeDiff, dl, -                                 TLI.getShiftAmountTy(SignBit.getValueType()))); +    SignBit = +        DAG.getNode(ISD::SHL, dl, LVT, SignBit, +                    DAG.getConstant(-SizeDiff, dl, +                                    TLI.getShiftAmountTy(SignBit.getValueType(), +                                                         DAG.getDataLayout())));    }    // Clear the sign bit of the first operand. -  SDValue Mask = DAG.getNode(ISD::SHL, dl, LVT, DAG.getConstant(1, dl, LVT), -                               DAG.getConstant(LSize - 1, dl, -                                               TLI.getShiftAmountTy(LVT))); +  SDValue Mask = DAG.getNode( +      ISD::SHL, dl, LVT, DAG.getConstant(1, dl, LVT), +      DAG.getConstant(LSize - 1, dl, +                      TLI.getShiftAmountTy(LVT, DAG.getDataLayout())));    Mask = DAG.getNode(ISD::SUB, dl, LVT, Mask, DAG.getConstant(1, dl, LVT));    LHS = DAG.getNode(ISD::AND, dl, LVT, LHS, Mask); diff --git a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp index f41202c4f8a4..9f060a09a0f3 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -282,7 +282,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {      Lo = BitConvertToInteger(Lo);      Hi = BitConvertToInteger(Hi); -    if (TLI.isBigEndian()) +    if (DAG.getDataLayout().isBigEndian())        std::swap(Lo, Hi);      InOp = DAG.getNode(ISD::ANY_EXTEND, dl, @@ -310,8 +310,10 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {    SDLoc dl(N);    unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(); -  return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op), -                     DAG.getConstant(DiffBits, dl, TLI.getShiftAmountTy(NVT))); +  return DAG.getNode( +      ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op), +      DAG.getConstant(DiffBits, dl, +                      TLI.getShiftAmountTy(NVT, DAG.getDataLayout())));  }  SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) { @@ -799,7 +801,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {    }    // Handle endianness of the load. -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::reverse(Parts.begin(), Parts.end());    // Assemble the parts in the promoted type. @@ -809,8 +811,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {      SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);      // Shift it to the right position and "or" it in.      Part = DAG.getNode(ISD::SHL, dl, NVT, Part, -                       DAG.getConstant(i*RegVT.getSizeInBits(), dl, -                                       TLI.getPointerTy())); +                       DAG.getConstant(i * RegVT.getSizeInBits(), dl, +                                       TLI.getPointerTy(DAG.getDataLayout())));      Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part);    } @@ -1004,7 +1006,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {    Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi,                     DAG.getConstant(OVT.getSizeInBits(), dl, -                                   TLI.getPointerTy())); +                                   TLI.getPointerTy(DAG.getDataLayout())));    return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi);  } @@ -1063,7 +1065,7 @@ SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,    // Promote the index.    SDValue Idx = DAG.getZExtOrTrunc(N->getOperand(2), SDLoc(N), -                                   TLI.getVectorIdxTy()); +                                   TLI.getVectorIdxTy(DAG.getDataLayout()));    return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),                                  N->getOperand(1), Idx), 0);  } @@ -1356,9 +1358,9 @@ std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(SDNode *Node) {    return ExpandChainLibCall(LC, Node, false);  } -/// ExpandShiftByConstant - N is a shift by a value that needs to be expanded, +/// N is a shift by a value that needs to be expanded,  /// and the shift amount is a constant 'Amt'.  Expand the operation. -void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt, +void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, const APInt &Amt,                                               SDValue &Lo, SDValue &Hi) {    SDLoc DL(N);    // Expand the incoming operand to be shifted, so that we have its parts @@ -1379,9 +1381,9 @@ void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,    EVT ShTy = N->getOperand(1).getValueType();    if (N->getOpcode() == ISD::SHL) { -    if (Amt > VTBits) { +    if (Amt.ugt(VTBits)) {        Lo = Hi = DAG.getConstant(0, DL, NVT); -    } else if (Amt > NVTBits) { +    } else if (Amt.ugt(NVTBits)) {        Lo = DAG.getConstant(0, DL, NVT);        Hi = DAG.getNode(ISD::SHL, DL,                         NVT, InL, DAG.getConstant(Amt - NVTBits, DL, ShTy)); @@ -1403,16 +1405,15 @@ void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,                         DAG.getNode(ISD::SHL, DL, NVT, InH,                                     DAG.getConstant(Amt, DL, ShTy)),                         DAG.getNode(ISD::SRL, DL, NVT, InL, -                                   DAG.getConstant(NVTBits - Amt, DL, ShTy))); +                                   DAG.getConstant(-Amt + NVTBits, DL, ShTy)));      }      return;    }    if (N->getOpcode() == ISD::SRL) { -    if (Amt > VTBits) { -      Lo = DAG.getConstant(0, DL, NVT); -      Hi = DAG.getConstant(0, DL, NVT); -    } else if (Amt > NVTBits) { +    if (Amt.ugt(VTBits)) { +      Lo = Hi = DAG.getConstant(0, DL, NVT); +    } else if (Amt.ugt(NVTBits)) {        Lo = DAG.getNode(ISD::SRL, DL,                         NVT, InH, DAG.getConstant(Amt - NVTBits, DL, ShTy));        Hi = DAG.getConstant(0, DL, NVT); @@ -1424,19 +1425,19 @@ void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,                         DAG.getNode(ISD::SRL, DL, NVT, InL,                                     DAG.getConstant(Amt, DL, ShTy)),                         DAG.getNode(ISD::SHL, DL, NVT, InH, -                                   DAG.getConstant(NVTBits - Amt, DL, ShTy))); +                                   DAG.getConstant(-Amt + NVTBits, DL, ShTy)));        Hi = DAG.getNode(ISD::SRL, DL, NVT, InH, DAG.getConstant(Amt, DL, ShTy));      }      return;    }    assert(N->getOpcode() == ISD::SRA && "Unknown shift!"); -  if (Amt > VTBits) { +  if (Amt.ugt(VTBits)) {      Hi = Lo = DAG.getNode(ISD::SRA, DL, NVT, InH,                            DAG.getConstant(NVTBits - 1, DL, ShTy)); -  } else if (Amt > NVTBits) { +  } else if (Amt.ugt(NVTBits)) {      Lo = DAG.getNode(ISD::SRA, DL, NVT, InH, -                     DAG.getConstant(Amt-NVTBits, DL, ShTy)); +                     DAG.getConstant(Amt - NVTBits, DL, ShTy));      Hi = DAG.getNode(ISD::SRA, DL, NVT, InH,                       DAG.getConstant(NVTBits - 1, DL, ShTy));    } else if (Amt == NVTBits) { @@ -1448,7 +1449,7 @@ void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,                       DAG.getNode(ISD::SRL, DL, NVT, InL,                                   DAG.getConstant(Amt, DL, ShTy)),                       DAG.getNode(ISD::SHL, DL, NVT, InH, -                                 DAG.getConstant(NVTBits - Amt, DL, ShTy))); +                                 DAG.getConstant(-Amt + NVTBits, DL, ShTy)));      Hi = DAG.getNode(ISD::SRA, DL, NVT, InH, DAG.getConstant(Amt, DL, ShTy));    }  } @@ -1808,7 +1809,8 @@ void DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N,      Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT));      // The high part replicates the sign bit of Lo, make it explicit.      Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, -                     DAG.getConstant(NVTBits - 1, dl, TLI.getPointerTy())); +                     DAG.getConstant(NVTBits - 1, dl, +                                     TLI.getPointerTy(DAG.getDataLayout())));    }  } @@ -1975,7 +1977,8 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,        // lo part.        unsigned LoSize = Lo.getValueType().getSizeInBits();        Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, -                       DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy())); +                       DAG.getConstant(LoSize - 1, dl, +                                       TLI.getPointerTy(DAG.getDataLayout())));      } else if (ExtType == ISD::ZEXTLOAD) {        // The high part is just a zero.        Hi = DAG.getConstant(0, dl, NVT); @@ -1984,7 +1987,7 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,        // The high part is undefined.        Hi = DAG.getUNDEF(NVT);      } -  } else if (TLI.isLittleEndian()) { +  } else if (DAG.getDataLayout().isLittleEndian()) {      // Little-endian - low bits are at low addresses.      Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getPointerInfo(),                       isVolatile, isNonTemporal, isInvariant, Alignment, @@ -2039,15 +2042,16 @@ void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,      if (ExcessBits < NVT.getSizeInBits()) {        // Transfer low bits from the bottom of Hi to the top of Lo. -      Lo = DAG.getNode(ISD::OR, dl, NVT, Lo, -                       DAG.getNode(ISD::SHL, dl, NVT, Hi, -                                   DAG.getConstant(ExcessBits, dl, -                                                   TLI.getPointerTy()))); +      Lo = DAG.getNode( +          ISD::OR, dl, NVT, Lo, +          DAG.getNode(ISD::SHL, dl, NVT, Hi, +                      DAG.getConstant(ExcessBits, dl, +                                      TLI.getPointerTy(DAG.getDataLayout()))));        // Move high bits to the right position in Hi. -      Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl, -                       NVT, Hi, +      Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl, NVT, +                       Hi,                         DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl, -                                       TLI.getPointerTy())); +                                       TLI.getPointerTy(DAG.getDataLayout())));      }    } @@ -2173,7 +2177,7 @@ void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,    // If we can emit an efficient shift operation, do so now.  Check to see if    // the RHS is a constant.    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1))) -    return ExpandShiftByConstant(N, CN->getZExtValue(), Lo, Hi); +    return ExpandShiftByConstant(N, CN->getAPIntValue(), Lo, Hi);    // If we can determine that the high bit of the shift is zero or one, even if    // the low bits are variable, emit this shift in an optimized form. @@ -2206,7 +2210,7 @@ void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,      // have an illegal type.  Fix that first by casting the operand, otherwise      // the new SHL_PARTS operation would need further legalization.      SDValue ShiftOp = N->getOperand(1); -    EVT ShiftTy = TLI.getShiftAmountTy(VT); +    EVT ShiftTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());      assert(ShiftTy.getScalarType().getSizeInBits() >=             Log2_32_Ceil(VT.getScalarType().getSizeInBits()) &&             "ShiftAmountTy is too small to cover the range of this type!"); @@ -2276,8 +2280,9 @@ void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,      Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0));      // The high part is obtained by SRA'ing all but one of the bits of low part.      unsigned LoSize = NVT.getSizeInBits(); -    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, -                     DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy())); +    Hi = DAG.getNode( +        ISD::SRA, dl, NVT, Lo, +        DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy(DAG.getDataLayout())));    } else {      // For example, extension of an i48 to an i64.  The operand type necessarily      // promotes to the result type, so will end up being expanded too. @@ -2312,7 +2317,7 @@ ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {      // things like sextinreg V:i64 from i8.      Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo,                       DAG.getConstant(Hi.getValueType().getSizeInBits() - 1, dl, -                                     TLI.getPointerTy())); +                                     TLI.getPointerTy(DAG.getDataLayout())));    } else {      // For example, extension of an i48 to an i64.  Leave the low part alone,      // sext_inreg the high part. @@ -2355,10 +2360,10 @@ void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,    EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));    SDLoc dl(N);    Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0)); -  Hi = DAG.getNode(ISD::SRL, dl, -                   N->getOperand(0).getValueType(), N->getOperand(0), +  Hi = DAG.getNode(ISD::SRL, dl, N->getOperand(0).getValueType(), +                   N->getOperand(0),                     DAG.getConstant(NVT.getSizeInBits(), dl, -                                   TLI.getPointerTy())); +                                   TLI.getPointerTy(DAG.getDataLayout())));    Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi);  } @@ -2414,7 +2419,7 @@ void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,    }    Type *RetTy = VT.getTypeForEVT(*DAG.getContext()); -  EVT PtrVT = TLI.getPointerTy(); +  EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());    Type *PtrTy = PtrVT.getTypeForEVT(*DAG.getContext());    // Replace this with a libcall that will check overflow. @@ -2845,7 +2850,7 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {                               Alignment, AAInfo);    } -  if (TLI.isLittleEndian()) { +  if (DAG.getDataLayout().isLittleEndian()) {      // Little-endian - low bits are at low addresses.      GetExpandedInteger(N->getValue(), Lo, Hi); @@ -2882,11 +2887,12 @@ SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {      // Transfer high bits from the top of Lo to the bottom of Hi.      Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl, -                                     TLI.getPointerTy())); -    Hi = DAG.getNode(ISD::OR, dl, NVT, Hi, -                     DAG.getNode(ISD::SRL, dl, NVT, Lo, -                                 DAG.getConstant(ExcessBits, dl, -                                                 TLI.getPointerTy()))); +                                     TLI.getPointerTy(DAG.getDataLayout()))); +    Hi = DAG.getNode( +        ISD::OR, dl, NVT, Hi, +        DAG.getNode(ISD::SRL, dl, NVT, Lo, +                    DAG.getConstant(ExcessBits, dl, +                                    TLI.getPointerTy(DAG.getDataLayout()))));    }    // Store both the high bits and maybe some of the low bits. @@ -2956,14 +2962,15 @@ SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {                                     ISD::SETLT);      // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits. -    SDValue FudgePtr = DAG.getConstantPool( -                               ConstantInt::get(*DAG.getContext(), FF.zext(64)), -                                           TLI.getPointerTy()); +    SDValue FudgePtr = +        DAG.getConstantPool(ConstantInt::get(*DAG.getContext(), FF.zext(64)), +                            TLI.getPointerTy(DAG.getDataLayout()));      // Get a pointer to FF if the sign bit was set, or to 0 otherwise.      SDValue Zero = DAG.getIntPtrConstant(0, dl);      SDValue Four = DAG.getIntPtrConstant(4, dl); -    if (TLI.isBigEndian()) std::swap(Zero, Four); +    if (DAG.getDataLayout().isBigEndian()) +      std::swap(Zero, Four);      SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet,                                     Zero, Four);      unsigned Alignment = cast<ConstantPoolSDNode>(FudgePtr)->getAlignment(); @@ -3113,9 +3120,9 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) {    for (unsigned i = 0; i < NumOperands; ++i) {      SDValue Op = N->getOperand(i);      for (unsigned j = 0; j < NumElem; ++j) { -      SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, -                                InElemTy, Op, DAG.getConstant(j, dl, -                                              TLI.getVectorIdxTy())); +      SDValue Ext = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, InElemTy, Op, +          DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        Ops[i * NumElem + j] = DAG.getNode(ISD::ANY_EXTEND, dl, OutElemTy, Ext);      }    } @@ -3142,7 +3149,8 @@ SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {  SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) {    SDLoc dl(N);    SDValue V0 = GetPromotedInteger(N->getOperand(0)); -  SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl, TLI.getVectorIdxTy()); +  SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl, +                                  TLI.getVectorIdxTy(DAG.getDataLayout()));    SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,      V0->getValueType(0).getScalarType(), V0, V1); @@ -3179,8 +3187,9 @@ SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {      for (unsigned i=0; i<NumElem; ++i) {        // Extract element from incoming vector -      SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, SclrTy, -      Incoming, DAG.getConstant(i, dl, TLI.getVectorIdxTy())); +      SDValue Ex = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, SclrTy, Incoming, +          DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        SDValue Tr = DAG.getNode(ISD::TRUNCATE, dl, RetSclrTy, Ex);        NewOps.push_back(Tr);      } diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp index 9c297698c1db..a7392fabf1e7 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp @@ -1006,7 +1006,7 @@ SDValue DAGTypeLegalizer::GetVectorElementPointer(SDValue VecPtr, EVT EltVT,                                                    SDValue Index) {    SDLoc dl(Index);    // Make sure the index type is big enough to compute in. -  Index = DAG.getZExtOrTrunc(Index, dl, TLI.getPointerTy()); +  Index = DAG.getZExtOrTrunc(Index, dl, TLI.getPointerTy(DAG.getDataLayout()));    // Calculate the element offset and add it to the pointer.    unsigned EltSize = EltVT.getSizeInBits() / 8; // FIXME: should be ABI size. @@ -1030,7 +1030,7 @@ SDValue DAGTypeLegalizer::JoinIntegers(SDValue Lo, SDValue Hi) {    Hi = DAG.getNode(ISD::ANY_EXTEND, dlHi, NVT, Hi);    Hi = DAG.getNode(ISD::SHL, dlHi, NVT, Hi,                     DAG.getConstant(LVT.getSizeInBits(), dlHi, -                                   TLI.getPointerTy())); +                                   TLI.getPointerTy(DAG.getDataLayout())));    return DAG.getNode(ISD::OR, dlHi, NVT, Lo, Hi);  } @@ -1079,7 +1079,7 @@ DAGTypeLegalizer::ExpandChainLibCall(RTLIB::Libcall LC,      Args.push_back(Entry);    }    SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), -                                         TLI.getPointerTy()); +                                         TLI.getPointerTy(DAG.getDataLayout()));    Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); @@ -1117,7 +1117,7 @@ void DAGTypeLegalizer::SplitInteger(SDValue Op,    Lo = DAG.getNode(ISD::TRUNCATE, dl, LoVT, Op);    Hi = DAG.getNode(ISD::SRL, dl, Op.getValueType(), Op,                     DAG.getConstant(LoVT.getSizeInBits(), dl, -                                   TLI.getPointerTy())); +                                   TLI.getPointerTy(DAG.getDataLayout())));    Hi = DAG.getNode(ISD::TRUNCATE, dl, HiVT, Hi);  } diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 2f2778982611..d1131a74cf17 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -73,7 +73,7 @@ private:    }    EVT getSetCCResultType(EVT VT) const { -    return TLI.getSetCCResultType(*DAG.getContext(), VT); +    return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);    }    /// IgnoreNodeResults - Pretend all of this node's results are legal. @@ -167,7 +167,7 @@ private:    SDValue GetVectorElementPointer(SDValue VecPtr, EVT EltVT, SDValue Index);    SDValue JoinIntegers(SDValue Lo, SDValue Hi);    SDValue LibCallify(RTLIB::Libcall LC, SDNode *N, bool isSigned); -   +    std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC,                                                   SDNode *Node, bool isSigned);    std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node); @@ -347,7 +347,7 @@ private:    void ExpandIntRes_ATOMIC_LOAD       (SDNode *N, SDValue &Lo, SDValue &Hi); -  void ExpandShiftByConstant(SDNode *N, unsigned Amt, +  void ExpandShiftByConstant(SDNode *N, const APInt &Amt,                               SDValue &Lo, SDValue &Hi);    bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi);    bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi); diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp index 330c31ce0eec..14d8f7762086 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp @@ -60,18 +60,20 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {        Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);        return;      case TargetLowering::TypeExpandInteger: -    case TargetLowering::TypeExpandFloat: +    case TargetLowering::TypeExpandFloat: { +      auto &DL = DAG.getDataLayout();        // Convert the expanded pieces of the input.        GetExpandedOp(InOp, Lo, Hi); -      if (TLI.hasBigEndianPartOrdering(InVT) != -          TLI.hasBigEndianPartOrdering(OutVT)) +      if (TLI.hasBigEndianPartOrdering(InVT, DL) != +          TLI.hasBigEndianPartOrdering(OutVT, DL))          std::swap(Lo, Hi);        Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);        Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);        return; +    }      case TargetLowering::TypeSplitVector:        GetSplitVector(InOp, Lo, Hi); -      if (TLI.hasBigEndianPartOrdering(OutVT)) +      if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))          std::swap(Lo, Hi);        Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);        Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi); @@ -88,7 +90,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {        EVT LoVT, HiVT;        std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(InVT);        std::tie(Lo, Hi) = DAG.SplitVector(InOp, dl, LoVT, HiVT); -      if (TLI.hasBigEndianPartOrdering(OutVT)) +      if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))          std::swap(Lo, Hi);        Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);        Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi); @@ -119,9 +121,9 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {        SmallVector<SDValue, 8> Vals;        for (unsigned i = 0; i < NumElems; ++i) -        Vals.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ElemVT, -                                   CastInOp, DAG.getConstant(i, dl, -                                             TLI.getVectorIdxTy()))); +        Vals.push_back(DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, ElemVT, CastInOp, +            DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));        // Build Lo, Hi pair by pairing extracted elements if needed.        unsigned Slot = 0; @@ -131,7 +133,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {          SDValue LHS = Vals[Slot];          SDValue RHS = Vals[Slot + 1]; -        if (TLI.isBigEndian()) +        if (DAG.getDataLayout().isBigEndian())            std::swap(LHS, RHS);          Vals.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, @@ -143,7 +145,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {        Lo = Vals[Slot++];        Hi = Vals[Slot++]; -      if (TLI.isBigEndian()) +      if (DAG.getDataLayout().isBigEndian())          std::swap(Lo, Hi);        return; @@ -155,9 +157,8 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {    // Create the stack frame object.  Make sure it is aligned for both    // the source and expanded destination types. -  unsigned Alignment = -    TLI.getDataLayout()->getPrefTypeAlignment(NOutVT. -                                              getTypeForEVT(*DAG.getContext())); +  unsigned Alignment = DAG.getDataLayout().getPrefTypeAlignment( +      NOutVT.getTypeForEVT(*DAG.getContext()));    SDValue StackPtr = DAG.CreateStackTemporary(InVT, Alignment);    int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();    MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI); @@ -182,7 +183,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {                     false, false, MinAlign(Alignment, IncrementSize));    // Handle endianness of the load. -  if (TLI.hasBigEndianPartOrdering(OutVT)) +  if (TLI.hasBigEndianPartOrdering(OutVT, DAG.getDataLayout()))      std::swap(Lo, Hi);  } @@ -241,7 +242,7 @@ void DAGTypeLegalizer::ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo,                      DAG.getConstant(1, dl, Idx.getValueType()));    Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, Idx); -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::swap(Lo, Hi);  } @@ -282,7 +283,7 @@ void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,                        Hi.getValue(1));    // Handle endianness of the load. -  if (TLI.hasBigEndianPartOrdering(ValueVT)) +  if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))      std::swap(Lo, Hi);    // Modified the chain - switch anything that used the old chain to use @@ -302,7 +303,7 @@ void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {    Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, N->getOperand(2), 0);    // Handle endianness of the load. -  if (TLI.hasBigEndianPartOrdering(OVT)) +  if (TLI.hasBigEndianPartOrdering(OVT, DAG.getDataLayout()))      std::swap(Lo, Hi);    // Modified the chain - switch anything that used the old chain to use @@ -325,7 +326,7 @@ void DAGTypeLegalizer::IntegerToVector(SDValue Op, unsigned NumElements,    if (NumElements > 1) {      NumElements >>= 1;      SplitInteger(Op, Parts[0], Parts[1]); -      if (TLI.isBigEndian()) +    if (DAG.getDataLayout().isBigEndian())          std::swap(Parts[0], Parts[1]);      IntegerToVector(Parts[0], NumElements, Ops, EltVT);      IntegerToVector(Parts[1], NumElements, Ops, EltVT); @@ -389,7 +390,7 @@ SDValue DAGTypeLegalizer::ExpandOp_BUILD_VECTOR(SDNode *N) {    for (unsigned i = 0; i < NumElts; ++i) {      SDValue Lo, Hi;      GetExpandedOp(N->getOperand(i), Lo, Hi); -    if (TLI.isBigEndian()) +    if (DAG.getDataLayout().isBigEndian())        std::swap(Lo, Hi);      NewElts.push_back(Lo);      NewElts.push_back(Hi); @@ -431,7 +432,7 @@ SDValue DAGTypeLegalizer::ExpandOp_INSERT_VECTOR_ELT(SDNode *N) {    SDValue Lo, Hi;    GetExpandedOp(Val, Lo, Hi); -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::swap(Lo, Hi);    SDValue Idx = N->getOperand(2); @@ -481,7 +482,7 @@ SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {    SDValue Lo, Hi;    GetExpandedOp(St->getValue(), Lo, Hi); -  if (TLI.hasBigEndianPartOrdering(ValueVT)) +  if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))      std::swap(Lo, Hi);    Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getPointerInfo(), diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index ee844a8a4c58..83d4ad5ea1f4 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -503,7 +503,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {      // Instead, we load all significant words, mask bits off, and concatenate      // them to form each element. Finally, they are extended to destination      // scalar type to build the destination vector. -    EVT WideVT = TLI.getPointerTy(); +    EVT WideVT = TLI.getPointerTy(DAG.getDataLayout());      assert(WideVT.isRound() &&             "Could not handle the sophisticated case when the widest integer is" @@ -563,7 +563,8 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {        SDValue Lo, Hi, ShAmt;        if (BitOffset < WideBits) { -        ShAmt = DAG.getConstant(BitOffset, dl, TLI.getShiftAmountTy(WideVT)); +        ShAmt = DAG.getConstant( +            BitOffset, dl, TLI.getShiftAmountTy(WideVT, DAG.getDataLayout()));          Lo = DAG.getNode(ISD::SRL, dl, WideVT, LoadVals[WideIdx], ShAmt);          Lo = DAG.getNode(ISD::AND, dl, WideVT, Lo, SrcEltBitMask);        } @@ -573,8 +574,9 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {          WideIdx++;          BitOffset -= WideBits;          if (BitOffset > 0) { -          ShAmt = DAG.getConstant(SrcEltBits - BitOffset, dl, -                                  TLI.getShiftAmountTy(WideVT)); +          ShAmt = DAG.getConstant( +              SrcEltBits - BitOffset, dl, +              TLI.getShiftAmountTy(WideVT, DAG.getDataLayout()));            Hi = DAG.getNode(ISD::SHL, dl, WideVT, LoadVals[WideIdx], ShAmt);            Hi = DAG.getNode(ISD::AND, dl, WideVT, Hi, SrcEltBitMask);          } @@ -592,8 +594,9 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {          Lo = DAG.getZExtOrTrunc(Lo, dl, DstEltVT);          break;        case ISD::SEXTLOAD: -        ShAmt = DAG.getConstant(WideBits - SrcEltBits, dl, -                                TLI.getShiftAmountTy(WideVT)); +        ShAmt = +            DAG.getConstant(WideBits - SrcEltBits, dl, +                            TLI.getShiftAmountTy(WideVT, DAG.getDataLayout()));          Lo = DAG.getNode(ISD::SHL, dl, WideVT, Lo, ShAmt);          Lo = DAG.getNode(ISD::SRA, dl, WideVT, Lo, ShAmt);          Lo = DAG.getSExtOrTrunc(Lo, dl, DstEltVT); @@ -663,8 +666,9 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {    // and save them into memory individually.    SmallVector<SDValue, 8> Stores;    for (unsigned Idx = 0; Idx < NumElem; Idx++) { -    SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, -               RegSclVT, Value, DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); +    SDValue Ex = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, RegSclVT, Value, +        DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));      // This scalar TruncStore may be illegal, but we legalize it later.      SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR, @@ -803,7 +807,7 @@ SDValue VectorLegalizer::ExpandANY_EXTEND_VECTOR_INREG(SDValue Op) {    // Place the extended lanes into the correct locations.    int ExtLaneScale = NumSrcElements / NumElements; -  int EndianOffset = TLI.isBigEndian() ? ExtLaneScale - 1 : 0; +  int EndianOffset = DAG.getDataLayout().isBigEndian() ? ExtLaneScale - 1 : 0;    for (int i = 0; i < NumElements; ++i)      ShuffleMask[i * ExtLaneScale + EndianOffset] = i; @@ -858,7 +862,7 @@ SDValue VectorLegalizer::ExpandZERO_EXTEND_VECTOR_INREG(SDValue Op) {      ShuffleMask.push_back(i);    int ExtLaneScale = NumSrcElements / NumElements; -  int EndianOffset = TLI.isBigEndian() ? ExtLaneScale - 1 : 0; +  int EndianOffset = DAG.getDataLayout().isBigEndian() ? ExtLaneScale - 1 : 0;    for (int i = 0; i < NumElements; ++i)      ShuffleMask[i * ExtLaneScale + EndianOffset] = NumSrcElements + i; @@ -995,12 +999,15 @@ SDValue VectorLegalizer::UnrollVSETCC(SDValue Op) {    SDLoc dl(Op);    SmallVector<SDValue, 8> Ops(NumElems);    for (unsigned i = 0; i < NumElems; ++i) { -    SDValue LHSElem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, LHS, -                                  DAG.getConstant(i, dl, TLI.getVectorIdxTy())); -    SDValue RHSElem = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, RHS, -                                  DAG.getConstant(i, dl, TLI.getVectorIdxTy())); +    SDValue LHSElem = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, LHS, +        DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); +    SDValue RHSElem = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, RHS, +        DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));      Ops[i] = DAG.getNode(ISD::SETCC, dl, -                         TLI.getSetCCResultType(*DAG.getContext(), TmpEltVT), +                         TLI.getSetCCResultType(DAG.getDataLayout(), +                                                *DAG.getContext(), TmpEltVT),                           LHSElem, RHSElem, CC);      Ops[i] = DAG.getSelect(dl, EltVT, Ops[i],                             DAG.getConstant(APInt::getAllOnesValue diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 905492c202ca..4348ab79f7d1 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -251,8 +251,9 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_UnaryOp(SDNode *N) {      Op = GetScalarizedVector(Op);    } else {      EVT VT = OpVT.getVectorElementType(); -    Op = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Op, -                      DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +    Op = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, DL, VT, Op, +        DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    return DAG.getNode(N->getOpcode(), SDLoc(N), DestVT, Op);  } @@ -384,10 +385,12 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_VSETCC(SDNode *N) {      RHS = GetScalarizedVector(RHS);    } else {      EVT VT = OpVT.getVectorElementType(); -    LHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, LHS, -                      DAG.getConstant(0, DL, TLI.getVectorIdxTy())); -    RHS = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, RHS, -                      DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +    LHS = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, DL, VT, LHS, +        DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))); +    RHS = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, DL, VT, RHS, +        DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    // Turn it into a scalar SETCC. @@ -742,7 +745,7 @@ void DAGTypeLegalizer::SplitVecRes_BITCAST(SDNode *N, SDValue &Lo,      // expanded pieces.      if (LoVT == HiVT) {        GetExpandedOp(InOp, Lo, Hi); -      if (TLI.isBigEndian()) +      if (DAG.getDataLayout().isBigEndian())          std::swap(Lo, Hi);        Lo = DAG.getNode(ISD::BITCAST, dl, LoVT, Lo);        Hi = DAG.getNode(ISD::BITCAST, dl, HiVT, Hi); @@ -761,12 +764,12 @@ void DAGTypeLegalizer::SplitVecRes_BITCAST(SDNode *N, SDValue &Lo,    // In the general case, convert the input to an integer and split it by hand.    EVT LoIntVT = EVT::getIntegerVT(*DAG.getContext(), LoVT.getSizeInBits());    EVT HiIntVT = EVT::getIntegerVT(*DAG.getContext(), HiVT.getSizeInBits()); -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::swap(LoIntVT, HiIntVT);    SplitInteger(BitConvertToInteger(InOp), LoIntVT, HiIntVT, Lo, Hi); -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::swap(Lo, Hi);    Lo = DAG.getNode(ISD::BITCAST, dl, LoVT, Lo);    Hi = DAG.getNode(ISD::BITCAST, dl, HiVT, Hi); @@ -819,7 +822,7 @@ void DAGTypeLegalizer::SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo,    uint64_t IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();    Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HiVT, Vec,                     DAG.getConstant(IdxVal + LoVT.getVectorNumElements(), dl, -                                   TLI.getVectorIdxTy())); +                                   TLI.getVectorIdxTy(DAG.getDataLayout())));  }  void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, @@ -840,7 +843,7 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo,    // Store the new subvector into the specified index.    SDValue SubVecPtr = GetVectorElementPointer(StackPtr, SubVecVT, Idx);    Type *VecType = VecVT.getTypeForEVT(*DAG.getContext()); -  unsigned Alignment = TLI.getDataLayout()->getPrefTypeAlignment(VecType); +  unsigned Alignment = DAG.getDataLayout().getPrefTypeAlignment(VecType);    Store = DAG.getStore(Store, dl, SubVec, SubVecPtr, MachinePointerInfo(),                         false, false, 0); @@ -898,9 +901,10 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,        Lo = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl,                         Lo.getValueType(), Lo, Elt, Idx);      else -      Hi = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, Hi.getValueType(), Hi, Elt, -                       DAG.getConstant(IdxVal - LoNumElts, dl, -                                       TLI.getVectorIdxTy())); +      Hi = +          DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, Hi.getValueType(), Hi, Elt, +                      DAG.getConstant(IdxVal - LoNumElts, dl, +                                      TLI.getVectorIdxTy(DAG.getDataLayout())));      return;    } @@ -919,8 +923,7 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,    // so use a truncating store.    SDValue EltPtr = GetVectorElementPointer(StackPtr, EltVT, Idx);    Type *VecType = VecVT.getTypeForEVT(*DAG.getContext()); -  unsigned Alignment = -    TLI.getDataLayout()->getPrefTypeAlignment(VecType); +  unsigned Alignment = DAG.getDataLayout().getPrefTypeAlignment(VecType);    Store = DAG.getTruncStore(Store, dl, Elt, EltPtr, MachinePointerInfo(), EltVT,                              false, false, 0); @@ -1292,10 +1295,9 @@ void DAGTypeLegalizer::SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N,          Idx -= Input * NewElts;          // Extract the vector element by hand. -        SVOps.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, -                                    Inputs[Input], -                                    DAG.getConstant(Idx, dl, -                                                    TLI.getVectorIdxTy()))); +        SVOps.push_back(DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Inputs[Input], +            DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));        }        // Construct the Lo/Hi output using a BUILD_VECTOR. @@ -1472,7 +1474,7 @@ SDValue DAGTypeLegalizer::SplitVecOp_BITCAST(SDNode *N) {    Lo = BitConvertToInteger(Lo);    Hi = BitConvertToInteger(Hi); -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::swap(Lo, Hi);    return DAG.getNode(ISD::BITCAST, SDLoc(N), N->getValueType(0), @@ -1763,9 +1765,9 @@ SDValue DAGTypeLegalizer::SplitVecOp_CONCAT_VECTORS(SDNode *N) {    for (const SDValue &Op : N->op_values()) {      for (unsigned i = 0, e = Op.getValueType().getVectorNumElements();           i != e; ++i) { -      Elts.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, -                                 Op, DAG.getConstant(i, DL, TLI.getVectorIdxTy()))); - +      Elts.push_back(DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, DL, EltVT, Op, +          DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));      }    } @@ -1829,10 +1831,11 @@ SDValue DAGTypeLegalizer::SplitVecOp_TruncateHelper(SDNode *N) {    // type. This should normally be something that ends up being legal directly,    // but in theory if a target has very wide vectors and an annoyingly    // restricted set of legal types, this split can chain to build things up. -  return IsFloat ? -    DAG.getNode(ISD::FP_ROUND, DL, OutVT, InterVec, -                DAG.getTargetConstant(0, DL, TLI.getPointerTy())) : -    DAG.getNode(ISD::TRUNCATE, DL, OutVT, InterVec); +  return IsFloat +             ? DAG.getNode(ISD::FP_ROUND, DL, OutVT, InterVec, +                           DAG.getTargetConstant( +                               0, DL, TLI.getPointerTy(DAG.getDataLayout()))) +             : DAG.getNode(ISD::TRUNCATE, DL, OutVT, InterVec);  }  SDValue DAGTypeLegalizer::SplitVecOp_VSETCC(SDNode *N) { @@ -2062,12 +2065,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {    // }    while (CurNumElts != 0) {      while (CurNumElts >= NumElts) { -      SDValue EOp1 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, InOp1, -                                 DAG.getConstant(Idx, dl, -                                                 TLI.getVectorIdxTy())); -      SDValue EOp2 = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VT, InOp2, -                                 DAG.getConstant(Idx, dl, -                                                 TLI.getVectorIdxTy())); +      SDValue EOp1 = DAG.getNode( +          ISD::EXTRACT_SUBVECTOR, dl, VT, InOp1, +          DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); +      SDValue EOp2 = DAG.getNode( +          ISD::EXTRACT_SUBVECTOR, dl, VT, InOp2, +          DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        ConcatOps[ConcatEnd++] = DAG.getNode(Opcode, dl, VT, EOp1, EOp2);        Idx += NumElts;        CurNumElts -= NumElts; @@ -2079,14 +2082,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {      if (NumElts == 1) {        for (unsigned i = 0; i != CurNumElts; ++i, ++Idx) { -        SDValue EOp1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, -                                   InOp1, -                                   DAG.getConstant(Idx, dl, -                                                   TLI.getVectorIdxTy())); -        SDValue EOp2 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, -                                   InOp2, -                                   DAG.getConstant(Idx, dl, -                                                   TLI.getVectorIdxTy())); +        SDValue EOp1 = DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, InOp1, +            DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); +        SDValue EOp2 = DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, WidenEltVT, InOp2, +            DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));          ConcatOps[ConcatEnd++] = DAG.getNode(Opcode, dl, WidenEltVT,                                               EOp1, EOp2);        } @@ -2123,9 +2124,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_BinaryCanTrap(SDNode *N) {        SDValue VecOp = DAG.getUNDEF(NextVT);        unsigned NumToInsert = ConcatEnd - Idx - 1;        for (unsigned i = 0, OpIdx = Idx+1; i < NumToInsert; i++, OpIdx++) { -        VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NextVT, VecOp, -                            ConcatOps[OpIdx], -                            DAG.getConstant(i, dl, TLI.getVectorIdxTy())); +        VecOp = DAG.getNode( +            ISD::INSERT_VECTOR_ELT, dl, NextVT, VecOp, ConcatOps[OpIdx], +            DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        }        ConcatOps[Idx+1] = VecOp;        ConcatEnd = Idx + 2; @@ -2211,8 +2212,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {      }      if (InVTNumElts % WidenNumElts == 0) { -      SDValue InVal = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, InWidenVT, InOp, -                                  DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +      SDValue InVal = DAG.getNode( +          ISD::EXTRACT_SUBVECTOR, DL, InWidenVT, InOp, +          DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));        // Extract the input and convert the shorten input vector.        if (N->getNumOperands() == 1)          return DAG.getNode(Opcode, DL, WidenVT, InVal); @@ -2226,8 +2228,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_Convert(SDNode *N) {    unsigned MinElts = std::min(InVTNumElts, WidenNumElts);    unsigned i;    for (i=0; i < MinElts; ++i) { -    SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, InEltVT, InOp, -                              DAG.getConstant(i, DL, TLI.getVectorIdxTy())); +    SDValue Val = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, DL, InEltVT, InOp, +        DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));      if (N->getNumOperands() == 1)        Ops[i] = DAG.getNode(Opcode, DL, EltVT, Val);      else @@ -2453,8 +2456,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONCAT_VECTORS(SDNode *N) {      if (InputWidened)        InOp = GetWidenedVector(InOp);      for (unsigned j=0; j < NumInElts; ++j) -      Ops[Idx++] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, -                               DAG.getConstant(j, dl, TLI.getVectorIdxTy())); +      Ops[Idx++] = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, +          DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    SDValue UndefVal = DAG.getUNDEF(EltVT);    for (; Idx < WidenNumElts; ++Idx) @@ -2511,8 +2515,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONVERT_RNDSAT(SDNode *N) {      if (InVTNumElts % WidenNumElts == 0) {        // Extract the input and convert the shorten input vector. -      InOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, InWidenVT, InOp, -                         DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +      InOp = DAG.getNode( +          ISD::EXTRACT_SUBVECTOR, dl, InWidenVT, InOp, +          DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));        return DAG.getConvertRndSat(WidenVT, dl, InOp, DTyOp, STyOp, RndOp,                                    SatOp, CvtCode);      } @@ -2527,8 +2532,9 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONVERT_RNDSAT(SDNode *N) {    unsigned MinElts = std::min(InVTNumElts, WidenNumElts);    unsigned i;    for (i=0; i < MinElts; ++i) { -    SDValue ExtVal = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp, -                                 DAG.getConstant(i, dl, TLI.getVectorIdxTy())); +    SDValue ExtVal = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp, +        DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));      Ops[i] = DAG.getConvertRndSat(WidenVT, dl, ExtVal, DTyOp, STyOp, RndOp,                                    SatOp, CvtCode);    } @@ -2570,8 +2576,10 @@ SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {    unsigned NumElts = VT.getVectorNumElements();    unsigned i;    for (i=0; i < NumElts; ++i) -    Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, -                         DAG.getConstant(IdxVal + i, dl, TLI.getVectorIdxTy())); +    Ops[i] = +        DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, +                    DAG.getConstant(IdxVal + i, dl, +                                    TLI.getVectorIdxTy(DAG.getDataLayout())));    SDValue UndefVal = DAG.getUNDEF(EltVT);    for (; i < WidenNumElts; ++i) @@ -2872,12 +2880,13 @@ SDValue DAGTypeLegalizer::WidenVecOp_EXTEND(SDNode *N) {          assert(FixedVT.getVectorNumElements() != InVT.getVectorNumElements() &&                 "We can't have the same type as we started with!");          if (FixedVT.getVectorNumElements() > InVT.getVectorNumElements()) -          InOp = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, FixedVT, -                             DAG.getUNDEF(FixedVT), InOp, -                             DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +          InOp = DAG.getNode( +              ISD::INSERT_SUBVECTOR, DL, FixedVT, DAG.getUNDEF(FixedVT), InOp, +              DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));          else -          InOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, FixedVT, InOp, -                             DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +          InOp = DAG.getNode( +              ISD::EXTRACT_SUBVECTOR, DL, FixedVT, InOp, +              DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));          break;        }      } @@ -2920,10 +2929,11 @@ SDValue DAGTypeLegalizer::WidenVecOp_Convert(SDNode *N) {    unsigned Opcode = N->getOpcode();    SmallVector<SDValue, 16> Ops(NumElts);    for (unsigned i=0; i < NumElts; ++i) -    Ops[i] = DAG.getNode(Opcode, dl, EltVT, -                         DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp, -                                     DAG.getConstant(i, dl, -                                                     TLI.getVectorIdxTy()))); +    Ops[i] = DAG.getNode( +        Opcode, dl, EltVT, +        DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp, +            DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))));    return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);  } @@ -2943,8 +2953,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_BITCAST(SDNode *N) {      EVT NewVT = EVT::getVectorVT(*DAG.getContext(), VT, NewNumElts);      if (TLI.isTypeLegal(NewVT)) {        SDValue BitOp = DAG.getNode(ISD::BITCAST, dl, NewVT, InOp); -      return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, BitOp, -                         DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +      return DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, VT, BitOp, +          DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));      }    } @@ -2971,8 +2982,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_CONCAT_VECTORS(SDNode *N) {      if (getTypeAction(InOp.getValueType()) == TargetLowering::TypeWidenVector)        InOp = GetWidenedVector(InOp);      for (unsigned j=0; j < NumInElts; ++j) -      Ops[Idx++] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, -                               DAG.getConstant(j, dl, TLI.getVectorIdxTy())); +      Ops[Idx++] = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, +          DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);  } @@ -3053,7 +3065,8 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {    // Get a new SETCC node to compare the newly widened operands.    // Only some of the compared elements are legal. -  EVT SVT = TLI.getSetCCResultType(*DAG.getContext(), InOp0.getValueType()); +  EVT SVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), +                                   InOp0.getValueType());    SDValue WideSETCC = DAG.getNode(ISD::SETCC, SDLoc(N),                       SVT, InOp0, InOp1, N->getOperand(2)); @@ -3061,9 +3074,9 @@ SDValue DAGTypeLegalizer::WidenVecOp_SETCC(SDNode *N) {    EVT ResVT = EVT::getVectorVT(*DAG.getContext(),                                 SVT.getVectorElementType(),                                 N->getValueType(0).getVectorNumElements()); -  SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, -                           ResVT, WideSETCC, -                           DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +  SDValue CC = DAG.getNode( +      ISD::EXTRACT_SUBVECTOR, dl, ResVT, WideSETCC, +      DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    return PromoteTargetBoolean(CC, N->getValueType(0));  } @@ -3159,8 +3172,9 @@ static SDValue BuildVectorFromScalar(SelectionDAG& DAG, EVT VecTy,        Idx = Idx * LdTy.getSizeInBits() / NewLdTy.getSizeInBits();        LdTy = NewLdTy;      } -    VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, VecOp, LdOps[i], -                        DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy())); +    VecOp = DAG.getNode( +        ISD::INSERT_VECTOR_ELT, dl, NewVecVT, VecOp, LdOps[i], +        DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    return DAG.getNode(ISD::BITCAST, dl, VecTy, VecOp);  } @@ -3407,9 +3421,9 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,      if (NewVT.isVector()) {        unsigned NumVTElts = NewVT.getVectorNumElements();        do { -        SDValue EOp = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT, ValOp, -                                  DAG.getConstant(Idx, dl, -                                                  TLI.getVectorIdxTy())); +        SDValue EOp = DAG.getNode( +            ISD::EXTRACT_SUBVECTOR, dl, NewVT, ValOp, +            DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));          StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,                                      ST->getPointerInfo().getWithOffset(Offset),                                         isVolatile, isNonTemporal, @@ -3429,8 +3443,10 @@ void DAGTypeLegalizer::GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain,        // Readjust index position based on new vector type        Idx = Idx * ValEltWidth / NewVTWidth;        do { -        SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, VecOp, -                      DAG.getConstant(Idx++, dl, TLI.getVectorIdxTy())); +        SDValue EOp = DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, dl, NewVT, VecOp, +            DAG.getConstant(Idx++, dl, +                            TLI.getVectorIdxTy(DAG.getDataLayout())));          StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr,                                      ST->getPointerInfo().getWithOffset(Offset),                                         isVolatile, isNonTemporal, @@ -3476,8 +3492,9 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,    EVT ValEltVT = ValVT.getVectorElementType();    unsigned Increment = ValEltVT.getSizeInBits() / 8;    unsigned NumElts = StVT.getVectorNumElements(); -  SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp, -                            DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +  SDValue EOp = DAG.getNode( +      ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp, +      DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, BasePtr,                                        ST->getPointerInfo(), StEltVT,                                        isVolatile, isNonTemporal, Align, @@ -3488,8 +3505,9 @@ DAGTypeLegalizer::GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,                                       BasePtr,                                       DAG.getConstant(Offset, dl,                                                       BasePtr.getValueType())); -    SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp, -                            DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +    SDValue EOp = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, ValEltVT, ValOp, +        DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));      StChain.push_back(DAG.getTruncStore(Chain, dl, EOp, NewBasePtr,                                        ST->getPointerInfo().getWithOffset(Offset),                                          StEltVT, isVolatile, isNonTemporal, @@ -3525,8 +3543,9 @@ SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT) {    }    if (WidenNumElts < InNumElts && InNumElts % WidenNumElts) -    return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NVT, InOp, -                       DAG.getConstant(0, dl, TLI.getVectorIdxTy())); +    return DAG.getNode( +        ISD::EXTRACT_SUBVECTOR, dl, NVT, InOp, +        DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    // Fall back to extract and build.    SmallVector<SDValue, 16> Ops(WidenNumElts); @@ -3534,8 +3553,9 @@ SDValue DAGTypeLegalizer::ModifyToType(SDValue InOp, EVT NVT) {    unsigned MinNumElts = std::min(WidenNumElts, InNumElts);    unsigned Idx;    for (Idx = 0; Idx < MinNumElts; ++Idx) -    Ops[Idx] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, -                           DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); +    Ops[Idx] = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, dl, EltVT, InOp, +        DAG.getConstant(Idx, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));    SDValue UndefVal = DAG.getUNDEF(EltVT);    for ( ; Idx < WidenNumElts; ++Idx) diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp index 00cbae3986cd..34e1a7001082 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAGFast.cpp @@ -725,9 +725,8 @@ void ScheduleDAGLinearize::Schedule() {    SmallVector<SDNode*, 8> Glues;    unsigned DAGSize = 0; -  for (SelectionDAG::allnodes_iterator I = DAG->allnodes_begin(), -         E = DAG->allnodes_end(); I != E; ++I) { -    SDNode *N = I; +  for (SDNode &Node : DAG->allnodes()) { +    SDNode *N = &Node;      // Use node id to record degree.      unsigned Degree = N->use_size(); diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp index b22d6edd85af..2a6c853a1d11 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -289,9 +289,8 @@ void ScheduleDAGSDNodes::ClusterNeighboringLoads(SDNode *Node) {  /// ClusterNodes - Cluster certain nodes which should be scheduled together.  ///  void ScheduleDAGSDNodes::ClusterNodes() { -  for (SelectionDAG::allnodes_iterator NI = DAG->allnodes_begin(), -       E = DAG->allnodes_end(); NI != E; ++NI) { -    SDNode *Node = &*NI; +  for (SDNode &NI : DAG->allnodes()) { +    SDNode *Node = &NI;      if (!Node || !Node->isMachineOpcode())        continue; @@ -308,9 +307,8 @@ void ScheduleDAGSDNodes::BuildSchedUnits() {    // to their associated SUnits by holding SUnits table indices. A value    // of -1 means the SDNode does not yet have an associated SUnit.    unsigned NumNodes = 0; -  for (SelectionDAG::allnodes_iterator NI = DAG->allnodes_begin(), -       E = DAG->allnodes_end(); NI != E; ++NI) { -    NI->setNodeId(-1); +  for (SDNode &NI : DAG->allnodes()) { +    NI.setNodeId(-1);      ++NumNodes;    } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index be5478275f99..14f44ccc60ce 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -151,8 +151,8 @@ bool ISD::isBuildVectorAllZeros(const SDNode *N) {    if (N->getOpcode() != ISD::BUILD_VECTOR) return false;    bool IsAllUndef = true; -  for (unsigned i = 0, e = N->getNumOperands(); i < e; ++i) { -    if (N->getOperand(i).getOpcode() == ISD::UNDEF) +  for (const SDValue &Op : N->op_values()) { +    if (Op.getOpcode() == ISD::UNDEF)        continue;      IsAllUndef = false;      // Do not accept build_vectors that aren't all constants or which have non-0 @@ -163,12 +163,11 @@ bool ISD::isBuildVectorAllZeros(const SDNode *N) {      // We only want to check enough bits to cover the vector elements, because      // we care if the resultant vector is all zeros, not whether the individual      // constants are. -    SDValue Zero = N->getOperand(i);      unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits(); -    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Zero)) { +    if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Op)) {        if (CN->getAPIntValue().countTrailingZeros() < EltSize)          return false; -    } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(Zero)) { +    } else if (ConstantFPSDNode *CFPN = dyn_cast<ConstantFPSDNode>(Op)) {        if (CFPN->getValueAPF().bitcastToAPInt().countTrailingZeros() < EltSize)          return false;      } else @@ -921,7 +920,7 @@ unsigned SelectionDAG::getEVTAlignment(EVT VT) const {                     PointerType::get(Type::getInt8Ty(*getContext()), 0) :                     VT.getTypeForEVT(*getContext()); -  return TLI->getDataLayout()->getABITypeAlignment(Ty); +  return getDataLayout().getABITypeAlignment(Ty);  }  // EntryNode could meaningfully have debug info if we can find it... @@ -1184,7 +1183,7 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, SDLoc DL, EVT VT,      // EltParts is currently in little endian order. If we actually want      // big-endian order then reverse it now. -    if (TLI->isBigEndian()) +    if (getDataLayout().isBigEndian())        std::reverse(EltParts.begin(), EltParts.end());      // The elements must be reversed when the element order is different @@ -1234,7 +1233,7 @@ SDValue SelectionDAG::getConstant(const ConstantInt &Val, SDLoc DL, EVT VT,  }  SDValue SelectionDAG::getIntPtrConstant(uint64_t Val, SDLoc DL, bool isTarget) { -  return getConstant(Val, DL, TLI->getPointerTy(), isTarget); +  return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);  }  SDValue SelectionDAG::getConstantFP(const APFloat& V, SDLoc DL, EVT VT, @@ -1303,7 +1302,7 @@ SDValue SelectionDAG::getGlobalAddress(const GlobalValue *GV, SDLoc DL,           "Cannot set target flags on target-independent globals");    // Truncate (with sign-extension) the offset value to the pointer size. -  unsigned BitWidth = TLI->getPointerTypeSizeInBits(GV->getType()); +  unsigned BitWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());    if (BitWidth < 64)      Offset = SignExtend64(Offset, BitWidth); @@ -1373,7 +1372,7 @@ SDValue SelectionDAG::getConstantPool(const Constant *C, EVT VT,    assert((TargetFlags == 0 || isTarget) &&           "Cannot set target flags on target-independent globals");    if (Alignment == 0) -    Alignment = TLI->getDataLayout()->getPrefTypeAlignment(C->getType()); +    Alignment = getDataLayout().getPrefTypeAlignment(C->getType());    unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;    FoldingSetNodeID ID;    AddNodeIDNode(ID, Opc, getVTList(VT), None); @@ -1400,7 +1399,7 @@ SDValue SelectionDAG::getConstantPool(MachineConstantPoolValue *C, EVT VT,    assert((TargetFlags == 0 || isTarget) &&           "Cannot set target flags on target-independent globals");    if (Alignment == 0) -    Alignment = TLI->getDataLayout()->getPrefTypeAlignment(C->getType()); +    Alignment = getDataLayout().getPrefTypeAlignment(C->getType());    unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;    FoldingSetNodeID ID;    AddNodeIDNode(ID, Opc, getVTList(VT), None); @@ -1850,7 +1849,7 @@ SDValue SelectionDAG::getAddrSpaceCast(SDLoc dl, EVT VT, SDValue Ptr,  /// the target's desired shift amount type.  SDValue SelectionDAG::getShiftAmountOperand(EVT LHSTy, SDValue Op) {    EVT OpTy = Op.getValueType(); -  EVT ShTy = TLI->getShiftAmountTy(LHSTy); +  EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());    if (OpTy == ShTy || OpTy.isVector()) return Op;    ISD::NodeType Opcode = OpTy.bitsGT(ShTy) ?  ISD::TRUNCATE : ISD::ZERO_EXTEND; @@ -1864,10 +1863,10 @@ SDValue SelectionDAG::CreateStackTemporary(EVT VT, unsigned minAlign) {    unsigned ByteSize = VT.getStoreSize();    Type *Ty = VT.getTypeForEVT(*getContext());    unsigned StackAlign = -  std::max((unsigned)TLI->getDataLayout()->getPrefTypeAlignment(Ty), minAlign); +      std::max((unsigned)getDataLayout().getPrefTypeAlignment(Ty), minAlign);    int FrameIdx = FrameInfo->CreateStackObject(ByteSize, StackAlign, false); -  return getFrameIndex(FrameIdx, TLI->getPointerTy()); +  return getFrameIndex(FrameIdx, TLI->getPointerTy(getDataLayout()));  }  /// CreateStackTemporary - Create a stack temporary suitable for holding @@ -1877,13 +1876,13 @@ SDValue SelectionDAG::CreateStackTemporary(EVT VT1, EVT VT2) {                              VT2.getStoreSizeInBits())/8;    Type *Ty1 = VT1.getTypeForEVT(*getContext());    Type *Ty2 = VT2.getTypeForEVT(*getContext()); -  const DataLayout *TD = TLI->getDataLayout(); -  unsigned Align = std::max(TD->getPrefTypeAlignment(Ty1), -                            TD->getPrefTypeAlignment(Ty2)); +  const DataLayout &DL = getDataLayout(); +  unsigned Align = +      std::max(DL.getPrefTypeAlignment(Ty1), DL.getPrefTypeAlignment(Ty2));    MachineFrameInfo *FrameInfo = getMachineFunction().getFrameInfo();    int FrameIdx = FrameInfo->CreateStackObject(Bytes, Align, false); -  return getFrameIndex(FrameIdx, TLI->getPointerTy()); +  return getFrameIndex(FrameIdx, TLI->getPointerTy(getDataLayout()));  }  SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1, @@ -1916,9 +1915,9 @@ SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1,      break;    } -  if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode())) { +  if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2)) {      const APInt &C2 = N2C->getAPIntValue(); -    if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) { +    if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1)) {        const APInt &C1 = N1C->getAPIntValue();        switch (Cond) { @@ -1936,8 +1935,8 @@ SDValue SelectionDAG::FoldSetCC(EVT VT, SDValue N1,        }      }    } -  if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1.getNode())) { -    if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2.getNode())) { +  if (ConstantFPSDNode *N1C = dyn_cast<ConstantFPSDNode>(N1)) { +    if (ConstantFPSDNode *N2C = dyn_cast<ConstantFPSDNode>(N2)) {        APFloat::cmpResult R = N1C->getValueAPF().compare(N2C->getValueAPF());        switch (Cond) {        default: break; @@ -2356,15 +2355,24 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,      // Output known-0 bits are known if clear or set in both the low clear bits      // common to both LHS & RHS.  For example, 8+(X<<3) is known to have the      // low 3 bits clear. +    // Output known-0 bits are also known if the top bits of each input are +    // known to be clear. For example, if one input has the top 10 bits clear +    // and the other has the top 8 bits clear, we know the top 7 bits of the +    // output must be clear.      computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1); -    unsigned KnownZeroOut = KnownZero2.countTrailingOnes(); +    unsigned KnownZeroHigh = KnownZero2.countLeadingOnes(); +    unsigned KnownZeroLow = KnownZero2.countTrailingOnes();      computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1); -    KnownZeroOut = std::min(KnownZeroOut, +    KnownZeroHigh = std::min(KnownZeroHigh, +                             KnownZero2.countLeadingOnes()); +    KnownZeroLow = std::min(KnownZeroLow,                              KnownZero2.countTrailingOnes());      if (Op.getOpcode() == ISD::ADD) { -      KnownZero |= APInt::getLowBitsSet(BitWidth, KnownZeroOut); +      KnownZero |= APInt::getLowBitsSet(BitWidth, KnownZeroLow); +      if (KnownZeroHigh > 1) +        KnownZero |= APInt::getHighBitsSet(BitWidth, KnownZeroHigh - 1);        break;      } @@ -2372,8 +2380,8 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,      // information if we know (at least) that the low two bits are clear.  We      // then return to the caller that the low bit is unknown but that other bits      // are known zero. -    if (KnownZeroOut >= 2) // ADDE -      KnownZero |= APInt::getBitsSet(BitWidth, 1, KnownZeroOut); +    if (KnownZeroLow >= 2) // ADDE +      KnownZero |= APInt::getBitsSet(BitWidth, 1, KnownZeroLow);      break;    }    case ISD::SREM: @@ -2814,7 +2822,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,    // doesn't create new constants with different values. Nevertheless, the    // opaque flag is preserved during folding to prevent future folding with    // other constants. -  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand.getNode())) { +  if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Operand)) {      const APInt &Val = C->getAPIntValue();      switch (Opcode) {      default: break; @@ -2861,7 +2869,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,    }    // Constant fold unary operations with a floating point constant operand. -  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand.getNode())) { +  if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Operand)) {      APFloat V = C->getValueAPF();    // make copy      switch (Opcode) {      case ISD::FNEG: @@ -2922,7 +2930,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,    }    // Constant fold unary operations with a vector integer or float operand. -  if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand.getNode())) { +  if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand)) {      if (BV->isConstant()) {        switch (Opcode) {        default: @@ -3278,8 +3286,8 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, SDLoc DL, EVT VT,  SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,                                SDValue N2, const SDNodeFlags *Flags) { -  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode()); -  ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2.getNode()); +  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1); +  ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N2);    switch (Opcode) {    default: break;    case ISD::TokenFactor: @@ -3499,7 +3507,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,            Ops.push_back(Op);            continue;          } -        if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getNode())) { +        if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {            APInt Val = C->getAPIntValue();            Ops.push_back(SignExtendInReg(Val));            continue; @@ -3554,7 +3562,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,        // if the indices are known different, extract the element from        // the original vector.        SDValue N1Op2 = N1.getOperand(2); -      ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2.getNode()); +      ConstantSDNode *N1Op2C = dyn_cast<ConstantSDNode>(N1Op2);        if (N1Op2C && N2C) {          if (N1Op2C->getZExtValue() == N2C->getZExtValue()) { @@ -3600,9 +3608,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,        assert(VT.getSimpleVT() <= N1.getSimpleValueType() &&               "Extract subvector must be from larger vector to smaller vector!"); -      if (isa<ConstantSDNode>(Index.getNode())) { +      if (isa<ConstantSDNode>(Index)) {          assert((VT.getVectorNumElements() + -                cast<ConstantSDNode>(Index.getNode())->getZExtValue() +                cast<ConstantSDNode>(Index)->getZExtValue()                  <= N1.getValueType().getVectorNumElements())                 && "Extract subvector overflow!");        } @@ -3628,8 +3636,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,    // Constant fold FP operations.    bool HasFPExceptions = TLI->hasFloatingPointExceptions(); -  ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1.getNode()); -  ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2.getNode()); +  ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); +  ConstantFPSDNode *N2CFP = dyn_cast<ConstantFPSDNode>(N2);    if (N1CFP) {      if (!N2CFP && isCommutativeBinOp(Opcode)) {        // Canonicalize constant to RHS if commutative. @@ -3787,7 +3795,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT, SDValue N1,  SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT,                                SDValue N1, SDValue N2, SDValue N3) {    // Perform various simplifications. -  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1.getNode()); +  ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N1);    switch (Opcode) {    case ISD::FMA: {      ConstantFPSDNode *N1CFP = dyn_cast<ConstantFPSDNode>(N1); @@ -3845,9 +3853,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL, EVT VT,               "Dest and insert subvector source types must match!");        assert(N2.getSimpleValueType() <= N1.getSimpleValueType() &&               "Insert subvector must be from smaller vector to larger vector!"); -      if (isa<ConstantSDNode>(Index.getNode())) { +      if (isa<ConstantSDNode>(Index)) {          assert((N2.getValueType().getVectorNumElements() + -                cast<ConstantSDNode>(Index.getNode())->getZExtValue() +                cast<ConstantSDNode>(Index)->getZExtValue()                  <= VT.getVectorNumElements())                 && "Insert subvector overflow!");        } @@ -3994,7 +4002,7 @@ static SDValue getMemsetStringVal(EVT VT, SDLoc dl, SelectionDAG &DAG,    unsigned NumBytes = std::min(NumVTBytes, unsigned(Str.size()));    APInt Val(NumVTBits, 0); -  if (TLI.isLittleEndian()) { +  if (DAG.getDataLayout().isLittleEndian()) {      for (unsigned i = 0; i != NumBytes; ++i)        Val |= (uint64_t)(unsigned char)Str[i] << i*8;    } else { @@ -4066,9 +4074,9 @@ static bool FindOptimalMemOpLowering(std::vector<EVT> &MemOps,    if (VT == MVT::Other) {      unsigned AS = 0; -    if (DstAlign >= TLI.getDataLayout()->getPointerPrefAlignment(AS) || +    if (DstAlign >= DAG.getDataLayout().getPointerPrefAlignment(AS) ||          TLI.allowsMisalignedMemoryAccesses(VT, AS, DstAlign)) { -      VT = TLI.getPointerTy(); +      VT = TLI.getPointerTy(DAG.getDataLayout());      } else {        switch (DstAlign & 7) {        case 0:  VT = MVT::i64; break; @@ -4185,14 +4193,14 @@ static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, SDLoc dl,    if (DstAlignCanChange) {      Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); -    unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); +    unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty);      // Don't promote to an alignment that would require dynamic stack      // realignment.      const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();      if (!TRI->needsStackRealignment(MF)) -       while (NewAlign > Align && -             TLI.getDataLayout()->exceedsNaturalStackAlignment(NewAlign)) +      while (NewAlign > Align && +             DAG.getDataLayout().exceedsNaturalStackAlignment(NewAlign))            NewAlign /= 2;      if (NewAlign > Align) { @@ -4294,7 +4302,7 @@ static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, SDLoc dl,    if (DstAlignCanChange) {      Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); -    unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); +    unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty);      if (NewAlign > Align) {        // Give the stack frame object a larger alignment if needed.        if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) @@ -4385,7 +4393,7 @@ static SDValue getMemsetStores(SelectionDAG &DAG, SDLoc dl,    if (DstAlignCanChange) {      Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext()); -    unsigned NewAlign = (unsigned) TLI.getDataLayout()->getABITypeAlignment(Ty); +    unsigned NewAlign = (unsigned)DAG.getDataLayout().getABITypeAlignment(Ty);      if (NewAlign > Align) {        // Give the stack frame object a larger alignment if needed.        if (MFI->getObjectAlignment(FI->getIndex()) < NewAlign) @@ -4488,19 +4496,21 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, SDLoc dl, SDValue Dst,    // Emit a library call.    TargetLowering::ArgListTy Args;    TargetLowering::ArgListEntry Entry; -  Entry.Ty = TLI->getDataLayout()->getIntPtrType(*getContext()); +  Entry.Ty = getDataLayout().getIntPtrType(*getContext());    Entry.Node = Dst; Args.push_back(Entry);    Entry.Node = Src; Args.push_back(Entry);    Entry.Node = Size; Args.push_back(Entry);    // FIXME: pass in SDLoc    TargetLowering::CallLoweringInfo CLI(*this); -  CLI.setDebugLoc(dl).setChain(Chain) -    .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY), -               Type::getVoidTy(*getContext()), -               getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY), -                                 TLI->getPointerTy()), std::move(Args), 0) -    .setDiscardResult() -    .setTailCall(isTailCall); +  CLI.setDebugLoc(dl) +      .setChain(Chain) +      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMCPY), +                 Type::getVoidTy(*getContext()), +                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMCPY), +                                   TLI->getPointerTy(getDataLayout())), +                 std::move(Args), 0) +      .setDiscardResult() +      .setTailCall(isTailCall);    std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);    return CallResult.second; @@ -4544,19 +4554,21 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, SDLoc dl, SDValue Dst,    // Emit a library call.    TargetLowering::ArgListTy Args;    TargetLowering::ArgListEntry Entry; -  Entry.Ty = TLI->getDataLayout()->getIntPtrType(*getContext()); +  Entry.Ty = getDataLayout().getIntPtrType(*getContext());    Entry.Node = Dst; Args.push_back(Entry);    Entry.Node = Src; Args.push_back(Entry);    Entry.Node = Size; Args.push_back(Entry);    // FIXME:  pass in SDLoc    TargetLowering::CallLoweringInfo CLI(*this); -  CLI.setDebugLoc(dl).setChain(Chain) -    .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE), -               Type::getVoidTy(*getContext()), -               getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE), -                                 TLI->getPointerTy()), std::move(Args), 0) -    .setDiscardResult() -    .setTailCall(isTailCall); +  CLI.setDebugLoc(dl) +      .setChain(Chain) +      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMMOVE), +                 Type::getVoidTy(*getContext()), +                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMMOVE), +                                   TLI->getPointerTy(getDataLayout())), +                 std::move(Args), 0) +      .setDiscardResult() +      .setTailCall(isTailCall);    std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);    return CallResult.second; @@ -4594,7 +4606,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, SDLoc dl, SDValue Dst,    }    // Emit a library call. -  Type *IntPtrTy = TLI->getDataLayout()->getIntPtrType(*getContext()); +  Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());    TargetLowering::ArgListTy Args;    TargetLowering::ArgListEntry Entry;    Entry.Node = Dst; Entry.Ty = IntPtrTy; @@ -4608,13 +4620,15 @@ SDValue SelectionDAG::getMemset(SDValue Chain, SDLoc dl, SDValue Dst,    // FIXME: pass in SDLoc    TargetLowering::CallLoweringInfo CLI(*this); -  CLI.setDebugLoc(dl).setChain(Chain) -    .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET), -               Type::getVoidTy(*getContext()), -               getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET), -                                 TLI->getPointerTy()), std::move(Args), 0) -    .setDiscardResult() -    .setTailCall(isTailCall); +  CLI.setDebugLoc(dl) +      .setChain(Chain) +      .setCallee(TLI->getLibcallCallingConv(RTLIB::MEMSET), +                 Type::getVoidTy(*getContext()), +                 getExternalSymbol(TLI->getLibcallName(RTLIB::MEMSET), +                                   TLI->getPointerTy(getDataLayout())), +                 std::move(Args), 0) +      .setDiscardResult() +      .setTailCall(isTailCall);    std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);    return CallResult.second; @@ -6656,7 +6670,7 @@ bool SDNode::hasAnyUseOfValue(unsigned Value) const {  /// isOnlyUserOf - Return true if this node is the only use of N.  /// -bool SDNode::isOnlyUserOf(SDNode *N) const { +bool SDNode::isOnlyUserOf(const SDNode *N) const {    bool Seen = false;    for (SDNode::use_iterator I = N->use_begin(), E = N->use_end(); I != E; ++I) {      SDNode *User = *I; @@ -6671,16 +6685,16 @@ bool SDNode::isOnlyUserOf(SDNode *N) const {  /// isOperand - Return true if this node is an operand of N.  /// -bool SDValue::isOperandOf(SDNode *N) const { +bool SDValue::isOperandOf(const SDNode *N) const {    for (const SDValue &Op : N->op_values())      if (*this == Op)        return true;    return false;  } -bool SDNode::isOperandOf(SDNode *N) const { -  for (unsigned i = 0, e = N->NumOperands; i != e; ++i) -    if (this == N->OperandList[i].getNode()) +bool SDNode::isOperandOf(const SDNode *N) const { +  for (const SDValue &Op : N->op_values()) +    if (this == Op.getNode())        return true;    return false;  } @@ -6784,10 +6798,9 @@ SDValue SelectionDAG::UnrollVectorOp(SDNode *N, unsigned ResNE) {        if (OperandVT.isVector()) {          // A vector operand; extract a single element.          EVT OperandEltVT = OperandVT.getVectorElementType(); -        Operands[j] = getNode(ISD::EXTRACT_VECTOR_ELT, dl, -                              OperandEltVT, -                              Operand, -                              getConstant(i, dl, TLI->getVectorIdxTy())); +        Operands[j] = +            getNode(ISD::EXTRACT_VECTOR_ELT, dl, OperandEltVT, Operand, +                    getConstant(i, dl, TLI->getVectorIdxTy(getDataLayout())));        } else {          // A scalar operand; just use it as is.          Operands[j] = Operand; @@ -6891,10 +6904,10 @@ unsigned SelectionDAG::InferPtrAlignment(SDValue Ptr) const {    const GlobalValue *GV;    int64_t GVOffset = 0;    if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) { -    unsigned PtrWidth = TLI->getPointerTypeSizeInBits(GV->getType()); +    unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());      APInt KnownZero(PtrWidth, 0), KnownOne(PtrWidth, 0);      llvm::computeKnownBits(const_cast<GlobalValue *>(GV), KnownZero, KnownOne, -                           *TLI->getDataLayout()); +                           getDataLayout());      unsigned AlignBits = KnownZero.countTrailingOnes();      unsigned Align = AlignBits ? 1 << std::min(31U, AlignBits) : 0;      if (Align) @@ -6950,10 +6963,10 @@ SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,           "More vector elements requested than available!");    SDValue Lo, Hi;    Lo = getNode(ISD::EXTRACT_SUBVECTOR, DL, LoVT, N, -               getConstant(0, DL, TLI->getVectorIdxTy())); +               getConstant(0, DL, TLI->getVectorIdxTy(getDataLayout())));    Hi = getNode(ISD::EXTRACT_SUBVECTOR, DL, HiVT, N,                 getConstant(LoVT.getVectorNumElements(), DL, -                           TLI->getVectorIdxTy())); +                           TLI->getVectorIdxTy(getDataLayout())));    return std::make_pair(Lo, Hi);  } @@ -6965,7 +6978,7 @@ void SelectionDAG::ExtractVectorElements(SDValue Op,      Count = VT.getVectorNumElements();    EVT EltVT = VT.getVectorElementType(); -  EVT IdxTy = TLI->getVectorIdxTy(); +  EVT IdxTy = TLI->getVectorIdxTy(getDataLayout());    SDLoc SL(Op);    for (unsigned i = Start, e = Start + Count; i != e; ++i) {      Args.push_back(getNode(ISD::EXTRACT_VECTOR_ELT, SL, EltVT, @@ -7080,14 +7093,12 @@ SDValue BuildVectorSDNode::getSplatValue(BitVector *UndefElements) const {  ConstantSDNode *  BuildVectorSDNode::getConstantSplatNode(BitVector *UndefElements) const { -  return dyn_cast_or_null<ConstantSDNode>( -      getSplatValue(UndefElements).getNode()); +  return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));  }  ConstantFPSDNode *  BuildVectorSDNode::getConstantFPSplatNode(BitVector *UndefElements) const { -  return dyn_cast_or_null<ConstantFPSDNode>( -      getSplatValue(UndefElements).getNode()); +  return dyn_cast_or_null<ConstantFPSDNode>(getSplatValue(UndefElements));  }  bool BuildVectorSDNode::isConstant() const { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 4897082f89aa..2c3c0eb101a0 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -146,7 +146,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,          Hi = DAG.getNode(ISD::BITCAST, DL, HalfVT, Parts[1]);        } -      if (TLI.isBigEndian()) +      if (DAG.getDataLayout().isBigEndian())          std::swap(Lo, Hi);        Val = DAG.getNode(ISD::BUILD_PAIR, DL, RoundVT, Lo, Hi); @@ -160,13 +160,14 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,          // Combine the round and odd parts.          Lo = Val; -        if (TLI.isBigEndian()) +        if (DAG.getDataLayout().isBigEndian())            std::swap(Lo, Hi);          EVT TotalVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);          Hi = DAG.getNode(ISD::ANY_EXTEND, DL, TotalVT, Hi); -        Hi = DAG.getNode(ISD::SHL, DL, TotalVT, Hi, -                         DAG.getConstant(Lo.getValueType().getSizeInBits(), DL, -                                         TLI.getPointerTy())); +        Hi = +            DAG.getNode(ISD::SHL, DL, TotalVT, Hi, +                        DAG.getConstant(Lo.getValueType().getSizeInBits(), DL, +                                        TLI.getPointerTy(DAG.getDataLayout())));          Lo = DAG.getNode(ISD::ZERO_EXTEND, DL, TotalVT, Lo);          Val = DAG.getNode(ISD::OR, DL, TotalVT, Lo, Hi);        } @@ -177,7 +178,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,        SDValue Lo, Hi;        Lo = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[0]);        Hi = DAG.getNode(ISD::BITCAST, DL, EVT(MVT::f64), Parts[1]); -      if (TLI.hasBigEndianPartOrdering(ValueVT)) +      if (TLI.hasBigEndianPartOrdering(ValueVT, DAG.getDataLayout()))          std::swap(Lo, Hi);        Val = DAG.getNode(ISD::BUILD_PAIR, DL, ValueVT, Lo, Hi);      } else { @@ -211,8 +212,9 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, SDLoc DL,    if (PartEVT.isFloatingPoint() && ValueVT.isFloatingPoint()) {      // FP_ROUND's are always exact here.      if (ValueVT.bitsLT(Val.getValueType())) -      return DAG.getNode(ISD::FP_ROUND, DL, ValueVT, Val, -                         DAG.getTargetConstant(1, DL, TLI.getPointerTy())); +      return DAG.getNode( +          ISD::FP_ROUND, DL, ValueVT, Val, +          DAG.getTargetConstant(1, DL, TLI.getPointerTy(DAG.getDataLayout())));      return DAG.getNode(ISD::FP_EXTEND, DL, ValueVT, Val);    } @@ -305,8 +307,9 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, SDLoc DL,      if (PartEVT.getVectorElementType() == ValueVT.getVectorElementType()) {        assert(PartEVT.getVectorNumElements() > ValueVT.getVectorNumElements() &&               "Cannot narrow, it would be a lossy transformation"); -      return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val, -                         DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +      return DAG.getNode( +          ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val, +          DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));      }      // Vector/Vector bitcast. @@ -362,10 +365,10 @@ static void getCopyToParts(SelectionDAG &DAG, SDLoc DL,    if (ValueVT.isVector())      return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT, V); -  const TargetLowering &TLI = DAG.getTargetLoweringInfo();    unsigned PartBits = PartVT.getSizeInBits();    unsigned OrigNumParts = NumParts; -  assert(TLI.isTypeLegal(PartVT) && "Copying to an illegal type!"); +  assert(DAG.getTargetLoweringInfo().isTypeLegal(PartVT) && +         "Copying to an illegal type!");    if (NumParts == 0)      return; @@ -433,7 +436,7 @@ static void getCopyToParts(SelectionDAG &DAG, SDLoc DL,                                   DAG.getIntPtrConstant(RoundBits, DL));      getCopyToParts(DAG, DL, OddVal, Parts + RoundParts, OddParts, PartVT, V); -    if (TLI.isBigEndian()) +    if (DAG.getDataLayout().isBigEndian())        // The odd parts were reversed by getCopyToParts - unreverse them.        std::reverse(Parts + RoundParts, Parts + NumParts); @@ -468,7 +471,7 @@ static void getCopyToParts(SelectionDAG &DAG, SDLoc DL,      }    } -  if (TLI.isBigEndian()) +  if (DAG.getDataLayout().isBigEndian())      std::reverse(Parts, Parts + OrigNumParts);  } @@ -497,9 +500,9 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,        // undef elements.        SmallVector<SDValue, 16> Ops;        for (unsigned i = 0, e = ValueVT.getVectorNumElements(); i != e; ++i) -        Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, -                                  ElementVT, Val, DAG.getConstant(i, DL, -                                                  TLI.getVectorIdxTy()))); +        Ops.push_back(DAG.getNode( +            ISD::EXTRACT_VECTOR_ELT, DL, ElementVT, Val, +            DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout()))));        for (unsigned i = ValueVT.getVectorNumElements(),             e = PartVT.getVectorNumElements(); i != e; ++i) @@ -524,9 +527,9 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,        // Vector -> scalar conversion.        assert(ValueVT.getVectorNumElements() == 1 &&               "Only trivial vector-to-scalar conversions should get here!"); -      Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, -                        PartVT, Val, -                        DAG.getConstant(0, DL, TLI.getVectorIdxTy())); +      Val = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val, +          DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));        bool Smaller = ValueVT.bitsLE(PartVT);        Val = DAG.getNode((Smaller ? ISD::TRUNCATE : ISD::ANY_EXTEND), @@ -554,14 +557,14 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,    SmallVector<SDValue, 8> Ops(NumIntermediates);    for (unsigned i = 0; i != NumIntermediates; ++i) {      if (IntermediateVT.isVector()) -      Ops[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, -                           IntermediateVT, Val, -                   DAG.getConstant(i * (NumElements / NumIntermediates), DL, -                                   TLI.getVectorIdxTy())); +      Ops[i] = +          DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, IntermediateVT, Val, +                      DAG.getConstant(i * (NumElements / NumIntermediates), DL, +                                      TLI.getVectorIdxTy(DAG.getDataLayout())));      else -      Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, -                           IntermediateVT, Val, -                           DAG.getConstant(i, DL, TLI.getVectorIdxTy())); +      Ops[i] = DAG.getNode( +          ISD::EXTRACT_VECTOR_ELT, DL, IntermediateVT, Val, +          DAG.getConstant(i, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));    }    // Split the intermediate operands into legal parts. @@ -588,14 +591,14 @@ RegsForValue::RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt,                             EVT valuevt)      : ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs) {} -RegsForValue::RegsForValue(LLVMContext &Context, const TargetLowering &tli, -                           unsigned Reg, Type *Ty) { -  ComputeValueVTs(tli, Ty, ValueVTs); +RegsForValue::RegsForValue(LLVMContext &Context, const TargetLowering &TLI, +                           const DataLayout &DL, unsigned Reg, Type *Ty) { +  ComputeValueVTs(TLI, DL, Ty, ValueVTs);    for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {      EVT ValueVT = ValueVTs[Value]; -    unsigned NumRegs = tli.getNumRegisters(Context, ValueVT); -    MVT RegisterVT = tli.getRegisterType(Context, ValueVT); +    unsigned NumRegs = TLI.getNumRegisters(Context, ValueVT); +    MVT RegisterVT = TLI.getRegisterType(Context, ValueVT);      for (unsigned i = 0; i != NumRegs; ++i)        Regs.push_back(Reg + i);      RegVTs.push_back(RegisterVT); @@ -796,7 +799,7 @@ void RegsForValue::AddInlineAsmOperands(unsigned Code, bool HasMatching,        if (TheReg == SP && Code == InlineAsm::Kind_Clobber) {          // If we clobbered the stack pointer, MFI should know about it.          assert(DAG.getMachineFunction().getFrameInfo()-> -            hasInlineAsmWithSPAdjust()); +            hasOpaqueSPAdjustment());        }      }    } @@ -807,7 +810,7 @@ void SelectionDAGBuilder::init(GCFunctionInfo *gfi, AliasAnalysis &aa,    AA = &aa;    GFI = gfi;    LibInfo = li; -  DL = DAG.getTarget().getDataLayout(); +  DL = &DAG.getDataLayout();    Context = DAG.getContext();    LPadToCallSiteMap.clear();  } @@ -964,8 +967,8 @@ SDValue SelectionDAGBuilder::getCopyFromRegs(const Value *V, Type *Ty) {    if (It != FuncInfo.ValueMap.end()) {      unsigned InReg = It->second; -    RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(), InReg, -                     Ty); +    RegsForValue RFV(*DAG.getContext(), DAG.getTargetLoweringInfo(), +                     DAG.getDataLayout(), InReg, Ty);      SDValue Chain = DAG.getEntryNode();      Result = RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);      resolveDanglingDebugInfo(V, Result); @@ -1031,7 +1034,7 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    if (const Constant *C = dyn_cast<Constant>(V)) { -    EVT VT = TLI.getValueType(V->getType(), true); +    EVT VT = TLI.getValueType(DAG.getDataLayout(), V->getType(), true);      if (const ConstantInt *CI = dyn_cast<ConstantInt>(C))        return DAG.getConstant(*CI, getCurSDLoc(), VT); @@ -1041,7 +1044,8 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {      if (isa<ConstantPointerNull>(C)) {        unsigned AS = V->getType()->getPointerAddressSpace(); -      return DAG.getConstant(0, getCurSDLoc(), TLI.getPointerTy(AS)); +      return DAG.getConstant(0, getCurSDLoc(), +                             TLI.getPointerTy(DAG.getDataLayout(), AS));      }      if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) @@ -1095,7 +1099,7 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {               "Unknown struct or array constant!");        SmallVector<EVT, 4> ValueVTs; -      ComputeValueVTs(TLI, C->getType(), ValueVTs); +      ComputeValueVTs(TLI, DAG.getDataLayout(), C->getType(), ValueVTs);        unsigned NumElts = ValueVTs.size();        if (NumElts == 0)          return SDValue(); // empty struct @@ -1127,7 +1131,8 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {          Ops.push_back(getValue(CV->getOperand(i)));      } else {        assert(isa<ConstantAggregateZero>(C) && "Unknown vector constant!"); -      EVT EltVT = TLI.getValueType(VecTy->getElementType()); +      EVT EltVT = +          TLI.getValueType(DAG.getDataLayout(), VecTy->getElementType());        SDValue Op;        if (EltVT.isFloatingPoint()) @@ -1147,13 +1152,15 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {      DenseMap<const AllocaInst*, int>::iterator SI =        FuncInfo.StaticAllocaMap.find(AI);      if (SI != FuncInfo.StaticAllocaMap.end()) -      return DAG.getFrameIndex(SI->second, TLI.getPointerTy()); +      return DAG.getFrameIndex(SI->second, +                               TLI.getPointerTy(DAG.getDataLayout()));    }    // If this is an instruction which fast-isel has deferred, select it now.    if (const Instruction *Inst = dyn_cast<Instruction>(V)) {      unsigned InReg = FuncInfo.InitializeRegForValue(Inst); -    RegsForValue RFV(*DAG.getContext(), TLI, InReg, Inst->getType()); +    RegsForValue RFV(*DAG.getContext(), TLI, DAG.getDataLayout(), InReg, +                     Inst->getType());      SDValue Chain = DAG.getEntryNode();      return RFV.getCopyFromRegs(DAG, FuncInfo, getCurSDLoc(), Chain, nullptr, V);    } @@ -1163,6 +1170,7 @@ SDValue SelectionDAGBuilder::getValueImpl(const Value *V) {  void SelectionDAGBuilder::visitRet(const ReturnInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); +  auto &DL = DAG.getDataLayout();    SDValue Chain = getControlRoot();    SmallVector<ISD::OutputArg, 8> Outs;    SmallVector<SDValue, 8> OutVals; @@ -1175,7 +1183,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {      // Leave Outs empty so that LowerReturn won't try to load return      // registers the usual way.      SmallVector<EVT, 1> PtrValueVTs; -    ComputeValueVTs(TLI, PointerType::getUnqual(F->getReturnType()), +    ComputeValueVTs(TLI, DL, PointerType::getUnqual(F->getReturnType()),                      PtrValueVTs);      SDValue RetPtr = DAG.getRegister(DemoteReg, PtrValueVTs[0]); @@ -1183,7 +1191,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {      SmallVector<EVT, 4> ValueVTs;      SmallVector<uint64_t, 4> Offsets; -    ComputeValueVTs(TLI, I.getOperand(0)->getType(), ValueVTs, &Offsets); +    ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs, &Offsets);      unsigned NumValues = ValueVTs.size();      SmallVector<SDValue, 4> Chains(NumValues); @@ -1203,7 +1211,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {                          MVT::Other, Chains);    } else if (I.getNumOperands() != 0) {      SmallVector<EVT, 4> ValueVTs; -    ComputeValueVTs(TLI, I.getOperand(0)->getType(), ValueVTs); +    ComputeValueVTs(TLI, DL, I.getOperand(0)->getType(), ValueVTs);      unsigned NumValues = ValueVTs.size();      if (NumValues) {        SDValue RetOp = getValue(I.getOperand(0)); @@ -1692,7 +1700,7 @@ void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB,  void SelectionDAGBuilder::visitJumpTable(JumpTable &JT) {    // Emit the code for the jump table    assert(JT.Reg != -1U && "Should lower JT Header first!"); -  EVT PTy = DAG.getTargetLoweringInfo().getPointerTy(); +  EVT PTy = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());    SDValue Index = DAG.getCopyFromReg(getControlRoot(), getCurSDLoc(),                                       JT.Reg, PTy);    SDValue Table = DAG.getJumpTable(JT.JTI, PTy); @@ -1723,9 +1731,10 @@ void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT,    // This value may be smaller or larger than the target's pointer type, and    // therefore require extension or truncating.    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  SwitchOp = DAG.getZExtOrTrunc(Sub, dl, TLI.getPointerTy()); +  SwitchOp = DAG.getZExtOrTrunc(Sub, dl, TLI.getPointerTy(DAG.getDataLayout())); -  unsigned JumpTableReg = FuncInfo.CreateReg(TLI.getPointerTy()); +  unsigned JumpTableReg = +      FuncInfo.CreateReg(TLI.getPointerTy(DAG.getDataLayout()));    SDValue CopyTo = DAG.getCopyToReg(getControlRoot(), dl,                                      JumpTableReg, SwitchOp);    JT.Reg = JumpTableReg; @@ -1733,11 +1742,10 @@ void SelectionDAGBuilder::visitJumpTableHeader(JumpTable &JT,    // Emit the range check for the jump table, and branch to the default block    // for the switch statement if the value being switched on exceeds the largest    // case in the switch. -  SDValue CMP = -      DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(), -                                              Sub.getValueType()), -                   Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), -                   ISD::SETUGT); +  SDValue CMP = DAG.getSetCC( +      dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), +                                 Sub.getValueType()), +      Sub, DAG.getConstant(JTH.Last - JTH.First, dl, VT), ISD::SETUGT);    SDValue BrCond = DAG.getNode(ISD::BRCOND, dl,                                 MVT::Other, CopyTo, CMP, @@ -1762,7 +1770,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,    // First create the loads to the guard/stack slot for the comparison.    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT PtrTy = TLI.getPointerTy(); +  EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());    MachineFrameInfo *MFI = ParentBB->getParent()->getFrameInfo();    int FI = MFI->getStackProtectorIndex(); @@ -1771,8 +1779,7 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,    SDValue GuardPtr = getValue(IRGuard);    SDValue StackSlotPtr = DAG.getFrameIndex(FI, PtrTy); -  unsigned Align = -    TLI.getDataLayout()->getPrefTypeAlignment(IRGuard->getType()); +  unsigned Align = DL->getPrefTypeAlignment(IRGuard->getType());    SDValue Guard;    SDLoc dl = getCurSDLoc(); @@ -1799,10 +1806,10 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,    EVT VT = Guard.getValueType();    SDValue Sub = DAG.getNode(ISD::SUB, dl, VT, Guard, StackSlot); -  SDValue Cmp = -      DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(), -                                                         Sub.getValueType()), -                   Sub, DAG.getConstant(0, dl, VT), ISD::SETNE); +  SDValue Cmp = DAG.getSetCC(dl, TLI.getSetCCResultType(DAG.getDataLayout(), +                                                        *DAG.getContext(), +                                                        Sub.getValueType()), +                             Sub, DAG.getConstant(0, dl, VT), ISD::SETNE);    // If the sub is not 0, then we know the guard/stackslot do not equal, so    // branch to failure MBB. @@ -1848,10 +1855,10 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,    // Check range    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  SDValue RangeCmp = -      DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(), -                                              Sub.getValueType()), -                   Sub, DAG.getConstant(B.Range, dl, VT), ISD::SETUGT); +  SDValue RangeCmp = DAG.getSetCC( +      dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), +                                 Sub.getValueType()), +      Sub, DAG.getConstant(B.Range, dl, VT), ISD::SETUGT);    // Determine the type of the test operands.    bool UsePtrType = false; @@ -1867,7 +1874,7 @@ void SelectionDAGBuilder::visitBitTestHeader(BitTestBlock &B,        }    }    if (UsePtrType) { -    VT = TLI.getPointerTy(); +    VT = TLI.getPointerTy(DAG.getDataLayout());      Sub = DAG.getZExtOrTrunc(Sub, dl, VT);    } @@ -1909,13 +1916,15 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,      // Testing for a single bit; just compare the shift count with what it      // would need to be to shift a 1 bit in that position.      Cmp = DAG.getSetCC( -        dl, TLI.getSetCCResultType(*DAG.getContext(), VT), ShiftOp, -        DAG.getConstant(countTrailingZeros(B.Mask), dl, VT), ISD::SETEQ); +        dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT), +        ShiftOp, DAG.getConstant(countTrailingZeros(B.Mask), dl, VT), +        ISD::SETEQ);    } else if (PopCount == BB.Range) {      // There is only one zero bit in the range, test for it directly.      Cmp = DAG.getSetCC( -        dl, TLI.getSetCCResultType(*DAG.getContext(), VT), ShiftOp, -        DAG.getConstant(countTrailingOnes(B.Mask), dl, VT), ISD::SETNE); +        dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT), +        ShiftOp, DAG.getConstant(countTrailingOnes(B.Mask), dl, VT), +        ISD::SETNE);    } else {      // Make desired shift      SDValue SwitchVal = DAG.getNode(ISD::SHL, dl, VT, @@ -1924,8 +1933,9 @@ void SelectionDAGBuilder::visitBitTestCase(BitTestBlock &BB,      // Emit bit tests and jumps      SDValue AndOp = DAG.getNode(ISD::AND, dl,                                  VT, SwitchVal, DAG.getConstant(B.Mask, dl, VT)); -    Cmp = DAG.getSetCC(dl, TLI.getSetCCResultType(*DAG.getContext(), VT), AndOp, -                       DAG.getConstant(0, dl, VT), ISD::SETNE); +    Cmp = DAG.getSetCC( +        dl, TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT), +        AndOp, DAG.getConstant(0, dl, VT), ISD::SETNE);    }    // The branch weight from SwitchBB to B.TargetBB is B.ExtraWeight. @@ -2013,7 +2023,7 @@ void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {    SmallVector<EVT, 2> ValueVTs;    SDLoc dl = getCurSDLoc(); -  ComputeValueVTs(TLI, LP.getType(), ValueVTs); +  ComputeValueVTs(TLI, DAG.getDataLayout(), LP.getType(), ValueVTs);    assert(ValueVTs.size() == 2 && "Only two-valued landingpads are supported");    // Get the two live-in registers as SDValues. The physregs have already been @@ -2022,14 +2032,16 @@ void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {    if (FuncInfo.ExceptionPointerVirtReg) {      Ops[0] = DAG.getZExtOrTrunc(          DAG.getCopyFromReg(DAG.getEntryNode(), dl, -                           FuncInfo.ExceptionPointerVirtReg, TLI.getPointerTy()), +                           FuncInfo.ExceptionPointerVirtReg, +                           TLI.getPointerTy(DAG.getDataLayout())),          dl, ValueVTs[0]);    } else { -    Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy()); +    Ops[0] = DAG.getConstant(0, dl, TLI.getPointerTy(DAG.getDataLayout()));    }    Ops[1] = DAG.getZExtOrTrunc(        DAG.getCopyFromReg(DAG.getEntryNode(), dl, -                         FuncInfo.ExceptionSelectorVirtReg, TLI.getPointerTy()), +                         FuncInfo.ExceptionSelectorVirtReg, +                         TLI.getPointerTy(DAG.getDataLayout())),        dl, ValueVTs[1]);    // Merge into one. @@ -2038,28 +2050,6 @@ void SelectionDAGBuilder::visitLandingPad(const LandingPadInst &LP) {    setValue(&LP, Res);  } -unsigned -SelectionDAGBuilder::visitLandingPadClauseBB(GlobalValue *ClauseGV, -                                             MachineBasicBlock *LPadBB) { -  SDValue Chain = getControlRoot(); -  SDLoc dl = getCurSDLoc(); - -  // Get the typeid that we will dispatch on later. -  const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  const TargetRegisterClass *RC = TLI.getRegClassFor(TLI.getPointerTy()); -  unsigned VReg = FuncInfo.MF->getRegInfo().createVirtualRegister(RC); -  unsigned TypeID = DAG.getMachineFunction().getMMI().getTypeIDFor(ClauseGV); -  SDValue Sel = DAG.getConstant(TypeID, dl, TLI.getPointerTy()); -  Chain = DAG.getCopyToReg(Chain, dl, VReg, Sel); - -  // Branch to the main landing pad block. -  MachineBasicBlock *ClauseMBB = FuncInfo.MBB; -  ClauseMBB->addSuccessor(LPadBB); -  DAG.setRoot(DAG.getNode(ISD::BR, dl, MVT::Other, Chain, -                          DAG.getBasicBlock(LPadBB))); -  return VReg; -} -  void SelectionDAGBuilder::sortAndRangeify(CaseClusterVector &Clusters) {  #ifndef NDEBUG    for (const CaseCluster &CC : Clusters) @@ -2186,8 +2176,8 @@ void SelectionDAGBuilder::visitShift(const User &I, unsigned Opcode) {    SDValue Op1 = getValue(I.getOperand(0));    SDValue Op2 = getValue(I.getOperand(1)); -  EVT ShiftTy = -      DAG.getTargetLoweringInfo().getShiftAmountTy(Op2.getValueType()); +  EVT ShiftTy = DAG.getTargetLoweringInfo().getShiftAmountTy( +      Op2.getValueType(), DAG.getDataLayout());    // Coerce the shift amount to the right type if we can.    if (!I.getType()->isVectorTy() && Op2.getValueType() != ShiftTy) { @@ -2256,7 +2246,8 @@ void SelectionDAGBuilder::visitICmp(const User &I) {    SDValue Op2 = getValue(I.getOperand(1));    ISD::CondCode Opcode = getICmpCondCode(predicate); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Opcode));  } @@ -2271,13 +2262,15 @@ void SelectionDAGBuilder::visitFCmp(const User &I) {    ISD::CondCode Condition = getFCmpCondCode(predicate);    if (TM.Options.NoNaNsFPMath)      Condition = getFCmpCodeWithoutNaN(Condition); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getSetCC(getCurSDLoc(), DestVT, Op1, Op2, Condition));  }  void SelectionDAGBuilder::visitSelect(const User &I) {    SmallVector<EVT, 4> ValueVTs; -  ComputeValueVTs(DAG.getTargetLoweringInfo(), I.getType(), ValueVTs); +  ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), I.getType(), +                  ValueVTs);    unsigned NumValues = ValueVTs.size();    if (NumValues == 0) return; @@ -2336,7 +2329,8 @@ void SelectionDAGBuilder::visitSelect(const User &I) {  void SelectionDAGBuilder::visitTrunc(const User &I) {    // TruncInst cannot be a no-op cast because sizeof(src) > sizeof(dest).    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::TRUNCATE, getCurSDLoc(), DestVT, N));  } @@ -2344,7 +2338,8 @@ void SelectionDAGBuilder::visitZExt(const User &I) {    // ZExt cannot be a no-op cast because sizeof(src) < sizeof(dest).    // ZExt also can't be a cast to bool for same reason. So, nothing much to do    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, getCurSDLoc(), DestVT, N));  } @@ -2352,7 +2347,8 @@ void SelectionDAGBuilder::visitSExt(const User &I) {    // SExt cannot be a no-op cast because sizeof(src) < sizeof(dest).    // SExt also can't be a cast to bool for same reason. So, nothing much to do    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, getCurSDLoc(), DestVT, N));  } @@ -2361,43 +2357,49 @@ void SelectionDAGBuilder::visitFPTrunc(const User &I) {    SDValue N = getValue(I.getOperand(0));    SDLoc dl = getCurSDLoc();    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT DestVT = TLI.getValueType(I.getType()); +  EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());    setValue(&I, DAG.getNode(ISD::FP_ROUND, dl, DestVT, N, -                           DAG.getTargetConstant(0, dl, TLI.getPointerTy()))); +                           DAG.getTargetConstant( +                               0, dl, TLI.getPointerTy(DAG.getDataLayout()))));  }  void SelectionDAGBuilder::visitFPExt(const User &I) {    // FPExt is never a no-op cast, no need to check    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::FP_EXTEND, getCurSDLoc(), DestVT, N));  }  void SelectionDAGBuilder::visitFPToUI(const User &I) {    // FPToUI is never a no-op cast, no need to check    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::FP_TO_UINT, getCurSDLoc(), DestVT, N));  }  void SelectionDAGBuilder::visitFPToSI(const User &I) {    // FPToSI is never a no-op cast, no need to check    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::FP_TO_SINT, getCurSDLoc(), DestVT, N));  }  void SelectionDAGBuilder::visitUIToFP(const User &I) {    // UIToFP is never a no-op cast, no need to check    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::UINT_TO_FP, getCurSDLoc(), DestVT, N));  }  void SelectionDAGBuilder::visitSIToFP(const User &I) {    // SIToFP is never a no-op cast, no need to check    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getNode(ISD::SINT_TO_FP, getCurSDLoc(), DestVT, N));  } @@ -2405,7 +2407,8 @@ void SelectionDAGBuilder::visitPtrToInt(const User &I) {    // What to do depends on the size of the integer and the size of the pointer.    // We can either truncate, zero extend, or no-op, accordingly.    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));  } @@ -2413,14 +2416,16 @@ void SelectionDAGBuilder::visitIntToPtr(const User &I) {    // What to do depends on the size of the integer and the size of the pointer.    // We can either truncate, zero extend, or no-op, accordingly.    SDValue N = getValue(I.getOperand(0)); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    setValue(&I, DAG.getZExtOrTrunc(N, getCurSDLoc(), DestVT));  }  void SelectionDAGBuilder::visitBitCast(const User &I) {    SDValue N = getValue(I.getOperand(0));    SDLoc dl = getCurSDLoc(); -  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(I.getType()); +  EVT DestVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                        I.getType());    // BitCast assures us that source and destination are the same size so this is    // either a BITCAST or a no-op. @@ -2442,7 +2447,7 @@ void SelectionDAGBuilder::visitAddrSpaceCast(const User &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    const Value *SV = I.getOperand(0);    SDValue N = getValue(SV); -  EVT DestVT = TLI.getValueType(I.getType()); +  EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());    unsigned SrcAS = SV->getType()->getPointerAddressSpace();    unsigned DestAS = I.getType()->getPointerAddressSpace(); @@ -2457,19 +2462,21 @@ void SelectionDAGBuilder::visitInsertElement(const User &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SDValue InVec = getValue(I.getOperand(0));    SDValue InVal = getValue(I.getOperand(1)); -  SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)), -                                     getCurSDLoc(), TLI.getVectorIdxTy()); +  SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(2)), getCurSDLoc(), +                                     TLI.getVectorIdxTy(DAG.getDataLayout()));    setValue(&I, DAG.getNode(ISD::INSERT_VECTOR_ELT, getCurSDLoc(), -                           TLI.getValueType(I.getType()), InVec, InVal, InIdx)); +                           TLI.getValueType(DAG.getDataLayout(), I.getType()), +                           InVec, InVal, InIdx));  }  void SelectionDAGBuilder::visitExtractElement(const User &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SDValue InVec = getValue(I.getOperand(0)); -  SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)), -                                     getCurSDLoc(), TLI.getVectorIdxTy()); +  SDValue InIdx = DAG.getSExtOrTrunc(getValue(I.getOperand(1)), getCurSDLoc(), +                                     TLI.getVectorIdxTy(DAG.getDataLayout()));    setValue(&I, DAG.getNode(ISD::EXTRACT_VECTOR_ELT, getCurSDLoc(), -                           TLI.getValueType(I.getType()), InVec, InIdx)); +                           TLI.getValueType(DAG.getDataLayout(), I.getType()), +                           InVec, InIdx));  }  // Utility for visitShuffleVector - Return true if every element in Mask, @@ -2492,7 +2499,7 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {    unsigned MaskNumElts = Mask.size();    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT VT = TLI.getValueType(I.getType()); +  EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());    EVT SrcVT = Src1.getValueType();    unsigned SrcNumElts = SrcVT.getVectorNumElements(); @@ -2614,7 +2621,8 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {            SDLoc dl = getCurSDLoc();            Src = DAG.getNode(                ISD::EXTRACT_SUBVECTOR, dl, VT, Src, -              DAG.getConstant(StartIdx[Input], dl, TLI.getVectorIdxTy())); +              DAG.getConstant(StartIdx[Input], dl, +                              TLI.getVectorIdxTy(DAG.getDataLayout())));          }        } @@ -2641,7 +2649,7 @@ void SelectionDAGBuilder::visitShuffleVector(const User &I) {    // replacing the shuffle with extract and build vector.    // to insert and build vector.    EVT EltVT = VT.getVectorElementType(); -  EVT IdxVT = TLI.getVectorIdxTy(); +  EVT IdxVT = TLI.getVectorIdxTy(DAG.getDataLayout());    SDLoc dl = getCurSDLoc();    SmallVector<SDValue,8> Ops;    for (unsigned i = 0; i != MaskNumElts; ++i) { @@ -2676,9 +2684,9 @@ void SelectionDAGBuilder::visitInsertValue(const InsertValueInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SmallVector<EVT, 4> AggValueVTs; -  ComputeValueVTs(TLI, AggTy, AggValueVTs); +  ComputeValueVTs(TLI, DAG.getDataLayout(), AggTy, AggValueVTs);    SmallVector<EVT, 4> ValValueVTs; -  ComputeValueVTs(TLI, ValTy, ValValueVTs); +  ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);    unsigned NumAggValues = AggValueVTs.size();    unsigned NumValValues = ValValueVTs.size(); @@ -2722,7 +2730,7 @@ void SelectionDAGBuilder::visitExtractValue(const ExtractValueInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SmallVector<EVT, 4> ValValueVTs; -  ComputeValueVTs(TLI, ValTy, ValValueVTs); +  ComputeValueVTs(TLI, DAG.getDataLayout(), ValTy, ValValueVTs);    unsigned NumValValues = ValValueVTs.size(); @@ -2755,6 +2763,16 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {    SDValue N = getValue(Op0);    SDLoc dl = getCurSDLoc(); +  // Normalize Vector GEP - all scalar operands should be converted to the +  // splat vector. +  unsigned VectorWidth = I.getType()->isVectorTy() ? +    cast<VectorType>(I.getType())->getVectorNumElements() : 0; + +  if (VectorWidth && !N.getValueType().isVector()) { +    MVT VT = MVT::getVectorVT(N.getValueType().getSimpleVT(), VectorWidth); +    SmallVector<SDValue, 16> Ops(VectorWidth, N); +    N = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops); +  }    for (GetElementPtrInst::const_op_iterator OI = I.op_begin()+1, E = I.op_end();         OI != E; ++OI) {      const Value *Idx = *OI; @@ -2770,16 +2788,25 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {        Ty = StTy->getElementType(Field);      } else {        Ty = cast<SequentialType>(Ty)->getElementType(); -      MVT PtrTy = DAG.getTargetLoweringInfo().getPointerTy(AS); +      MVT PtrTy = +          DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout(), AS);        unsigned PtrSize = PtrTy.getSizeInBits();        APInt ElementSize(PtrSize, DL->getTypeAllocSize(Ty)); -      // If this is a constant subscript, handle it quickly. -      if (const auto *CI = dyn_cast<ConstantInt>(Idx)) { +      // If this is a scalar constant or a splat vector of constants, +      // handle it quickly. +      const auto *CI = dyn_cast<ConstantInt>(Idx); +      if (!CI && isa<ConstantDataVector>(Idx) && +          cast<ConstantDataVector>(Idx)->getSplatValue()) +        CI = cast<ConstantInt>(cast<ConstantDataVector>(Idx)->getSplatValue()); + +      if (CI) {          if (CI->isZero())            continue;          APInt Offs = ElementSize * CI->getValue().sextOrTrunc(PtrSize); -        SDValue OffsVal = DAG.getConstant(Offs, dl, PtrTy); +        SDValue OffsVal = VectorWidth ? +          DAG.getConstant(Offs, dl, MVT::getVectorVT(PtrTy, VectorWidth)) : +          DAG.getConstant(Offs, dl, PtrTy);          N = DAG.getNode(ISD::ADD, dl, N.getValueType(), N, OffsVal);          continue;        } @@ -2787,6 +2814,11 @@ void SelectionDAGBuilder::visitGetElementPtr(const User &I) {        // N = N + Idx * ElementSize;        SDValue IdxN = getValue(Idx); +      if (!IdxN.getValueType().isVector() && VectorWidth) { +        MVT VT = MVT::getVectorVT(IdxN.getValueType().getSimpleVT(), VectorWidth); +        SmallVector<SDValue, 16> Ops(VectorWidth, IdxN); +        IdxN = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);       +      }        // If the index is smaller or larger than intptr_t, truncate or extend        // it.        IdxN = DAG.getSExtOrTrunc(IdxN, dl, N.getValueType()); @@ -2823,14 +2855,14 @@ void SelectionDAGBuilder::visitAlloca(const AllocaInst &I) {    SDLoc dl = getCurSDLoc();    Type *Ty = I.getAllocatedType();    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  uint64_t TySize = TLI.getDataLayout()->getTypeAllocSize(Ty); +  auto &DL = DAG.getDataLayout(); +  uint64_t TySize = DL.getTypeAllocSize(Ty);    unsigned Align = -      std::max((unsigned)TLI.getDataLayout()->getPrefTypeAlignment(Ty), -               I.getAlignment()); +      std::max((unsigned)DL.getPrefTypeAlignment(Ty), I.getAlignment());    SDValue AllocSize = getValue(I.getArraySize()); -  EVT IntPtr = TLI.getPointerTy(); +  EVT IntPtr = TLI.getPointerTy(DAG.getDataLayout());    if (AllocSize.getValueType() != IntPtr)      AllocSize = DAG.getZExtOrTrunc(AllocSize, dl, IntPtr); @@ -2898,7 +2930,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SmallVector<EVT, 4> ValueVTs;    SmallVector<uint64_t, 4> Offsets; -  ComputeValueVTs(TLI, Ty, ValueVTs, &Offsets); +  ComputeValueVTs(TLI, DAG.getDataLayout(), Ty, ValueVTs, &Offsets);    unsigned NumValues = ValueVTs.size();    if (NumValues == 0)      return; @@ -2975,8 +3007,8 @@ void SelectionDAGBuilder::visitStore(const StoreInst &I) {    SmallVector<EVT, 4> ValueVTs;    SmallVector<uint64_t, 4> Offsets; -  ComputeValueVTs(DAG.getTargetLoweringInfo(), SrcV->getType(), -                  ValueVTs, &Offsets); +  ComputeValueVTs(DAG.getTargetLoweringInfo(), DAG.getDataLayout(), +                  SrcV->getType(), ValueVTs, &Offsets);    unsigned NumValues = ValueVTs.size();    if (NumValues == 0)      return; @@ -3077,9 +3109,10 @@ static bool getUniformBase(Value *& Ptr, SDValue& Base, SDValue& Index,    else if (SDB->findValue(ShuffleInst)) {      SDValue ShuffleNode = SDB->getValue(ShuffleInst);      SDLoc sdl = ShuffleNode; -    Base = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, -                       ShuffleNode.getValueType().getScalarType(), ShuffleNode, -                       DAG.getConstant(0, sdl, TLI.getVectorIdxTy())); +    Base = DAG.getNode( +        ISD::EXTRACT_VECTOR_ELT, sdl, +        ShuffleNode.getValueType().getScalarType(), ShuffleNode, +        DAG.getConstant(0, sdl, TLI.getVectorIdxTy(DAG.getDataLayout())));      SDB->setValue(Ptr, Base);    }    else @@ -3126,7 +3159,7 @@ void SelectionDAGBuilder::visitMaskedScatter(const CallInst &I) {                           MachineMemOperand::MOStore,  VT.getStoreSize(),                           Alignment, AAInfo);    if (!UniformBase) { -    Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy()); +    Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));      Index = getValue(Ptr);    }    SDValue Ops[] = { getRoot(), Src0, Mask, Base, Index }; @@ -3146,7 +3179,7 @@ void SelectionDAGBuilder::visitMaskedLoad(const CallInst &I) {    SDValue Mask = getValue(I.getArgOperand(2));    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT VT = TLI.getValueType(I.getType()); +  EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());    unsigned Alignment = (cast<ConstantInt>(I.getArgOperand(1)))->getZExtValue();    if (!Alignment)      Alignment = DAG.getEVTAlignment(VT); @@ -3184,7 +3217,7 @@ void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {    SDValue Mask = getValue(I.getArgOperand(2));    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT VT = TLI.getValueType(I.getType()); +  EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());    unsigned Alignment = (cast<ConstantInt>(I.getArgOperand(1)))->getZExtValue();    if (!Alignment)      Alignment = DAG.getEVTAlignment(VT); @@ -3214,7 +3247,7 @@ void SelectionDAGBuilder::visitMaskedGather(const CallInst &I) {                           Alignment, AAInfo, Ranges);    if (!UniformBase) { -    Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy()); +    Base = DAG.getTargetConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout()));      Index = getValue(Ptr);    }    SDValue Ops[] = { Root, Src0, Mask, Base, Index }; @@ -3291,8 +3324,10 @@ void SelectionDAGBuilder::visitFence(const FenceInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo();    SDValue Ops[3];    Ops[0] = getRoot(); -  Ops[1] = DAG.getConstant(I.getOrdering(), dl, TLI.getPointerTy()); -  Ops[2] = DAG.getConstant(I.getSynchScope(), dl, TLI.getPointerTy()); +  Ops[1] = DAG.getConstant(I.getOrdering(), dl, +                           TLI.getPointerTy(DAG.getDataLayout())); +  Ops[2] = DAG.getConstant(I.getSynchScope(), dl, +                           TLI.getPointerTy(DAG.getDataLayout()));    DAG.setRoot(DAG.getNode(ISD::ATOMIC_FENCE, dl, MVT::Other, Ops));  } @@ -3304,7 +3339,7 @@ void SelectionDAGBuilder::visitAtomicLoad(const LoadInst &I) {    SDValue InChain = getRoot();    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT VT = TLI.getValueType(I.getType()); +  EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());    if (I.getAlignment() < VT.getSizeInBits() / 8)      report_fatal_error("Cannot generate unaligned atomic load"); @@ -3339,7 +3374,8 @@ void SelectionDAGBuilder::visitAtomicStore(const StoreInst &I) {    SDValue InChain = getRoot();    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT VT = TLI.getValueType(I.getValueOperand()->getType()); +  EVT VT = +      TLI.getValueType(DAG.getDataLayout(), I.getValueOperand()->getType());    if (I.getAlignment() < VT.getSizeInBits() / 8)      report_fatal_error("Cannot generate unaligned atomic store"); @@ -3382,7 +3418,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,    if (!IsTgtIntrinsic || Info.opc == ISD::INTRINSIC_VOID ||        Info.opc == ISD::INTRINSIC_W_CHAIN)      Ops.push_back(DAG.getTargetConstant(Intrinsic, getCurSDLoc(), -                                        TLI.getPointerTy())); +                                        TLI.getPointerTy(DAG.getDataLayout())));    // Add all operands of the call to the operand list.    for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) { @@ -3391,7 +3427,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,    }    SmallVector<EVT, 4> ValueVTs; -  ComputeValueVTs(TLI, I.getType(), ValueVTs); +  ComputeValueVTs(TLI, DAG.getDataLayout(), I.getType(), ValueVTs);    if (HasChain)      ValueVTs.push_back(MVT::Other); @@ -3425,7 +3461,7 @@ void SelectionDAGBuilder::visitTargetIntrinsic(const CallInst &I,    if (!I.getType()->isVoidTy()) {      if (VectorType *PTy = dyn_cast<VectorType>(I.getType())) { -      EVT VT = TLI.getValueType(PTy); +      EVT VT = TLI.getValueType(DAG.getDataLayout(), PTy);        Result = DAG.getNode(ISD::BITCAST, getCurSDLoc(), VT, Result);      } @@ -3458,8 +3494,9 @@ GetExponent(SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI,              SDLoc dl) {    SDValue t0 = DAG.getNode(ISD::AND, dl, MVT::i32, Op,                             DAG.getConstant(0x7f800000, dl, MVT::i32)); -  SDValue t1 = DAG.getNode(ISD::SRL, dl, MVT::i32, t0, -                           DAG.getConstant(23, dl, TLI.getPointerTy())); +  SDValue t1 = DAG.getNode( +      ISD::SRL, dl, MVT::i32, t0, +      DAG.getConstant(23, dl, TLI.getPointerTy(DAG.getDataLayout())));    SDValue t2 = DAG.getNode(ISD::SUB, dl, MVT::i32, t1,                             DAG.getConstant(127, dl, MVT::i32));    return DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, t2); @@ -3484,7 +3521,8 @@ static SDValue getLimitedPrecisionExp2(SDValue t0, SDLoc dl,    //   IntegerPartOfX <<= 23;    IntegerPartOfX = DAG.getNode(        ISD::SHL, dl, MVT::i32, IntegerPartOfX, -      DAG.getConstant(23, dl, DAG.getTargetLoweringInfo().getPointerTy())); +      DAG.getConstant(23, dl, DAG.getTargetLoweringInfo().getPointerTy( +                                  DAG.getDataLayout())));    SDValue TwoToFractionalPartOfX;    if (LimitFloatPrecision <= 6) { @@ -4071,11 +4109,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::vaend:    visitVAEnd(I); return nullptr;    case Intrinsic::vacopy:   visitVACopy(I); return nullptr;    case Intrinsic::returnaddress: -    setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl, TLI.getPointerTy(), +    setValue(&I, DAG.getNode(ISD::RETURNADDR, sdl, +                             TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0))));      return nullptr;    case Intrinsic::frameaddress: -    setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl, TLI.getPointerTy(), +    setValue(&I, DAG.getNode(ISD::FRAMEADDR, sdl, +                             TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0))));      return nullptr;    case Intrinsic::read_register: { @@ -4083,7 +4123,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      SDValue Chain = getRoot();      SDValue RegName =          DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata())); -    EVT VT = TLI.getValueType(I.getType()); +    EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());      Res = DAG.getNode(ISD::READ_REGISTER, sdl,        DAG.getVTList(VT, MVT::Other), Chain, RegName);      setValue(&I, Res); @@ -4335,14 +4375,15 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      return nullptr;    case Intrinsic::eh_dwarf_cfa: {      SDValue CfaArg = DAG.getSExtOrTrunc(getValue(I.getArgOperand(0)), sdl, -                                        TLI.getPointerTy()); +                                        TLI.getPointerTy(DAG.getDataLayout()));      SDValue Offset = DAG.getNode(ISD::ADD, sdl,                                   CfaArg.getValueType(),                                   DAG.getNode(ISD::FRAME_TO_ARGS_OFFSET, sdl,                                               CfaArg.getValueType()),                                   CfaArg); -    SDValue FA = DAG.getNode(ISD::FRAMEADDR, sdl, TLI.getPointerTy(), -                             DAG.getConstant(0, sdl, TLI.getPointerTy())); +    SDValue FA = DAG.getNode( +        ISD::FRAMEADDR, sdl, TLI.getPointerTy(DAG.getDataLayout()), +        DAG.getConstant(0, sdl, TLI.getPointerTy(DAG.getDataLayout())));      setValue(&I, DAG.getNode(ISD::ADD, sdl, FA.getValueType(),                               FA, Offset));      return nullptr; @@ -4444,7 +4485,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      ShOps[0] = ShAmt;      ShOps[1] = DAG.getConstant(0, sdl, MVT::i32);      ShAmt =  DAG.getNode(ISD::BUILD_VECTOR, sdl, ShAmtVT, ShOps); -    EVT DestVT = TLI.getValueType(I.getType()); +    EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());      ShAmt = DAG.getNode(ISD::BITCAST, sdl, DestVT, ShAmt);      Res = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, sdl, DestVT,                         DAG.getConstant(NewIntrinsic, sdl, MVT::i32), @@ -4474,7 +4515,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      case Intrinsic::convertus:  Code = ISD::CVT_US; break;      case Intrinsic::convertuu:  Code = ISD::CVT_UU; break;      } -    EVT DestVT = TLI.getValueType(I.getType()); +    EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());      const Value *Op1 = I.getArgOperand(0);      Res = DAG.getConvertRndSat(DestVT, sdl, getValue(Op1),                                 DAG.getValueType(DestVT), @@ -4564,7 +4605,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                               getValue(I.getArgOperand(2))));      return nullptr;    case Intrinsic::fmuladd: { -    EVT VT = TLI.getValueType(I.getType()); +    EVT VT = TLI.getValueType(DAG.getDataLayout(), I.getType());      if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&          TLI.isFMAFasterThanFMulAndFAdd(VT)) {        setValue(&I, DAG.getNode(ISD::FMA, sdl, @@ -4593,10 +4634,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {                                                                 MVT::i32))));      return nullptr;    case Intrinsic::convert_from_fp16: -    setValue(&I, -             DAG.getNode(ISD::FP_EXTEND, sdl, TLI.getValueType(I.getType()), -                         DAG.getNode(ISD::BITCAST, sdl, MVT::f16, -                                     getValue(I.getArgOperand(0))))); +    setValue(&I, DAG.getNode(ISD::FP_EXTEND, sdl, +                             TLI.getValueType(DAG.getDataLayout(), I.getType()), +                             DAG.getNode(ISD::BITCAST, sdl, MVT::f16, +                                         getValue(I.getArgOperand(0)))));      return nullptr;    case Intrinsic::pcmarker: {      SDValue Tmp = getValue(I.getArgOperand(0)); @@ -4640,8 +4681,9 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    }    case Intrinsic::stacksave: {      SDValue Op = getRoot(); -    Res = DAG.getNode(ISD::STACKSAVE, sdl, -                      DAG.getVTList(TLI.getPointerTy(), MVT::Other), Op); +    Res = DAG.getNode( +        ISD::STACKSAVE, sdl, +        DAG.getVTList(TLI.getPointerTy(DAG.getDataLayout()), MVT::Other), Op);      setValue(&I, Res);      DAG.setRoot(Res.getValue(1));      return nullptr; @@ -4655,7 +4697,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // Emit code into the DAG to store the stack guard onto the stack.      MachineFunction &MF = DAG.getMachineFunction();      MachineFrameInfo *MFI = MF.getFrameInfo(); -    EVT PtrTy = TLI.getPointerTy(); +    EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());      SDValue Src, Chain = getRoot();      const Value *Ptr = cast<LoadInst>(I.getArgOperand(0))->getPointerOperand();      const GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr); @@ -4753,7 +4795,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    }    case Intrinsic::adjust_trampoline: {      setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl, -                             TLI.getPointerTy(), +                             TLI.getPointerTy(DAG.getDataLayout()),                               getValue(I.getArgOperand(0))));      return nullptr;    } @@ -4794,10 +4836,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      TargetLowering::ArgListTy Args;      TargetLowering::CallLoweringInfo CLI(DAG); -    CLI.setDebugLoc(sdl).setChain(getRoot()) -      .setCallee(CallingConv::C, I.getType(), -                 DAG.getExternalSymbol(TrapFuncName.data(), TLI.getPointerTy()), -                 std::move(Args), 0); +    CLI.setDebugLoc(sdl).setChain(getRoot()).setCallee( +        CallingConv::C, I.getType(), +        DAG.getExternalSymbol(TrapFuncName.data(), +                              TLI.getPointerTy(DAG.getDataLayout())), +        std::move(Args), 0);      std::pair<SDValue, SDValue> Result = TLI.LowerCallTo(CLI);      DAG.setRoot(Result.second); @@ -4873,7 +4916,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {        SDValue Ops[2];        Ops[0] = getRoot(); -      Ops[1] = DAG.getFrameIndex(FI, TLI.getPointerTy(), true); +      Ops[1] = +          DAG.getFrameIndex(FI, TLI.getPointerTy(DAG.getDataLayout()), true);        unsigned Opcode = (IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END);        Res = DAG.getNode(Opcode, sdl, MVT::Other, Ops); @@ -4883,7 +4927,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    }    case Intrinsic::invariant_start:      // Discard region information. -    setValue(&I, DAG.getUNDEF(TLI.getPointerTy())); +    setValue(&I, DAG.getUNDEF(TLI.getPointerTy(DAG.getDataLayout())));      return nullptr;    case Intrinsic::invariant_end:      // Discard region information. @@ -4903,7 +4947,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::clear_cache:      return TLI.getClearCacheBuiltinName();    case Intrinsic::eh_actions: -    setValue(&I, DAG.getUNDEF(TLI.getPointerTy())); +    setValue(&I, DAG.getUNDEF(TLI.getPointerTy(DAG.getDataLayout())));      return nullptr;    case Intrinsic::donothing:      // ignore @@ -4935,11 +4979,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::instrprof_increment:      llvm_unreachable("instrprof failed to lower an increment"); -  case Intrinsic::frameescape: { +  case Intrinsic::localescape: {      MachineFunction &MF = DAG.getMachineFunction();      const TargetInstrInfo *TII = DAG.getSubtarget().getInstrInfo(); -    // Directly emit some FRAME_ALLOC machine instrs. Label assignment emission +    // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission      // is the same on all targets.      for (unsigned Idx = 0, E = I.getNumArgOperands(); Idx < E; ++Idx) {        Value *Arg = I.getArgOperand(Idx)->stripPointerCasts(); @@ -4953,7 +4997,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {            MF.getMMI().getContext().getOrCreateFrameAllocSymbol(                GlobalValue::getRealLinkageName(MF.getName()), Idx);        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl, -              TII->get(TargetOpcode::FRAME_ALLOC)) +              TII->get(TargetOpcode::LOCAL_ESCAPE))            .addSym(FrameAllocSym)            .addFrameIndex(FI);      } @@ -4961,10 +5005,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      return nullptr;    } -  case Intrinsic::framerecover: { -    // i8* @llvm.framerecover(i8* %fn, i8* %fp, i32 %idx) +  case Intrinsic::localrecover: { +    // i8* @llvm.localrecover(i8* %fn, i8* %fp, i32 %idx)      MachineFunction &MF = DAG.getMachineFunction(); -    MVT PtrVT = TLI.getPointerTy(0); +    MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout(), 0);      // Get the symbol that defines the frame offset.      auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts()); @@ -4978,7 +5022,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {      // that would make this PC relative.      SDValue OffsetSym = DAG.getMCSymbol(FrameAllocSym, PtrVT);      SDValue OffsetVal = -        DAG.getNode(ISD::FRAME_ALLOC_RECOVER, sdl, PtrVT, OffsetSym); +        DAG.getNode(ISD::LOCAL_RECOVER, sdl, PtrVT, OffsetSym);      // Add the offset to the FP.      Value *FP = I.getArgOperand(1); @@ -4994,7 +5038,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {    case Intrinsic::eh_exceptioncode: {      unsigned Reg = TLI.getExceptionPointerRegister();      assert(Reg && "cannot get exception code on this platform"); -    MVT PtrVT = TLI.getPointerTy(); +    MVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());      const TargetRegisterClass *PtrRC = TLI.getRegClassFor(PtrVT);      assert(FuncInfo.MBB->isLandingPad() && "eh.exceptioncode in non-lpad");      unsigned VReg = FuncInfo.MBB->addLiveIn(Reg, PtrRC); @@ -5178,7 +5222,8 @@ static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,  void SelectionDAGBuilder::processIntegerCallValue(const Instruction &I,                                                    SDValue Value,                                                    bool IsSigned) { -  EVT VT = DAG.getTargetLoweringInfo().getValueType(I.getType(), true); +  EVT VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                    I.getType(), true);    if (IsSigned)      Value = DAG.getSExtOrTrunc(Value, getCurSDLoc(), VT);    else @@ -5203,7 +5248,8 @@ bool SelectionDAGBuilder::visitMemCmpCall(const CallInst &I) {    const Value *Size = I.getArgOperand(2);    const ConstantInt *CSize = dyn_cast<ConstantInt>(Size);    if (CSize && CSize->getZExtValue() == 0) { -    EVT CallVT = DAG.getTargetLoweringInfo().getValueType(I.getType(), true); +    EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), +                                                          I.getType(), true);      setValue(&I, DAG.getConstant(0, getCurSDLoc(), CallVT));      return true;    } @@ -5640,8 +5686,9 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {    if (!RenameFn)      Callee = getValue(I.getCalledValue());    else -    Callee = DAG.getExternalSymbol(RenameFn, -                                   DAG.getTargetLoweringInfo().getPointerTy()); +    Callee = DAG.getExternalSymbol( +        RenameFn, +        DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()));    // Check if we can potentially perform a tail call. More detailed checking is    // be done within LowerCallTo, after more information about the call is known. @@ -5670,13 +5717,12 @@ public:    /// getCallOperandValEVT - Return the EVT of the Value* that this operand    /// corresponds to.  If there is no Value* for this operand, it returns    /// MVT::Other. -  EVT getCallOperandValEVT(LLVMContext &Context, -                           const TargetLowering &TLI, -                           const DataLayout *DL) const { +  EVT getCallOperandValEVT(LLVMContext &Context, const TargetLowering &TLI, +                           const DataLayout &DL) const {      if (!CallOperandVal) return MVT::Other;      if (isa<BasicBlock>(CallOperandVal)) -      return TLI.getPointerTy(); +      return TLI.getPointerTy(DL);      llvm::Type *OpTy = CallOperandVal->getType(); @@ -5698,7 +5744,7 @@ public:      // If OpTy is not a single value, it may be a struct/union that we      // can tile with integers.      if (!OpTy->isSingleValueType() && OpTy->isSized()) { -      unsigned BitSize = DL->getTypeSizeInBits(OpTy); +      unsigned BitSize = DL.getTypeSizeInBits(OpTy);        switch (BitSize) {        default: break;        case 1: @@ -5712,7 +5758,7 @@ public:        }      } -    return TLI.getValueType(OpTy, true); +    return TLI.getValueType(DL, OpTy, true);    }  }; @@ -5838,8 +5884,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {    SDISelAsmOperandInfoVector ConstraintOperands;    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  TargetLowering::AsmOperandInfoVector TargetConstraints = -      TLI.ParseConstraints(DAG.getSubtarget().getRegisterInfo(), CS); +  TargetLowering::AsmOperandInfoVector TargetConstraints = TLI.ParseConstraints( +      DAG.getDataLayout(), DAG.getSubtarget().getRegisterInfo(), CS);    bool hasMemory = false; @@ -5864,10 +5910,11 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {        // corresponding argument.        assert(!CS.getType()->isVoidTy() && "Bad inline asm!");        if (StructType *STy = dyn_cast<StructType>(CS.getType())) { -        OpVT = TLI.getSimpleValueType(STy->getElementType(ResNo)); +        OpVT = TLI.getSimpleValueType(DAG.getDataLayout(), +                                      STy->getElementType(ResNo));        } else {          assert(ResNo == 0 && "Asm only has one result!"); -        OpVT = TLI.getSimpleValueType(CS.getType()); +        OpVT = TLI.getSimpleValueType(DAG.getDataLayout(), CS.getType());        }        ++ResNo;        break; @@ -5888,8 +5935,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {          OpInfo.CallOperand = getValue(OpInfo.CallOperandVal);        } -      OpVT = -          OpInfo.getCallOperandValEVT(*DAG.getContext(), TLI, DL).getSimpleVT(); +      OpVT = OpInfo.getCallOperandValEVT(*DAG.getContext(), TLI, +                                         DAG.getDataLayout()).getSimpleVT();      }      OpInfo.ConstraintVT = OpVT; @@ -5977,17 +6024,19 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {        const Value *OpVal = OpInfo.CallOperandVal;        if (isa<ConstantFP>(OpVal) || isa<ConstantInt>(OpVal) ||            isa<ConstantVector>(OpVal) || isa<ConstantDataVector>(OpVal)) { -        OpInfo.CallOperand = DAG.getConstantPool(cast<Constant>(OpVal), -                                                 TLI.getPointerTy()); +        OpInfo.CallOperand = DAG.getConstantPool( +            cast<Constant>(OpVal), TLI.getPointerTy(DAG.getDataLayout()));        } else {          // Otherwise, create a stack slot and emit a store to it before the          // asm.          Type *Ty = OpVal->getType(); -        uint64_t TySize = TLI.getDataLayout()->getTypeAllocSize(Ty); -        unsigned Align  = TLI.getDataLayout()->getPrefTypeAlignment(Ty); +        auto &DL = DAG.getDataLayout(); +        uint64_t TySize = DL.getTypeAllocSize(Ty); +        unsigned Align = DL.getPrefTypeAlignment(Ty);          MachineFunction &MF = DAG.getMachineFunction();          int SSFI = MF.getFrameInfo()->CreateStackObject(TySize, Align, false); -        SDValue StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy()); +        SDValue StackSlot = +            DAG.getFrameIndex(SSFI, TLI.getPointerTy(DAG.getDataLayout()));          Chain = DAG.getStore(Chain, getCurSDLoc(),                               OpInfo.CallOperand, StackSlot,                               MachinePointerInfo::getFixedStack(SSFI), @@ -6022,9 +6071,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {    // AsmNodeOperands - The operands for the ISD::INLINEASM node.    std::vector<SDValue> AsmNodeOperands;    AsmNodeOperands.push_back(SDValue());  // reserve space for input chain -  AsmNodeOperands.push_back( -          DAG.getTargetExternalSymbol(IA->getAsmString().c_str(), -                                      TLI.getPointerTy())); +  AsmNodeOperands.push_back(DAG.getTargetExternalSymbol( +      IA->getAsmString().c_str(), TLI.getPointerTy(DAG.getDataLayout())));    // If we have a !srcloc metadata node associated with it, we want to attach    // this to the ultimately generated inline asm machineinstr.  To do this, we @@ -6064,8 +6112,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {      }    } -  AsmNodeOperands.push_back(DAG.getTargetConstant(ExtraInfo, getCurSDLoc(), -                                                  TLI.getPointerTy())); +  AsmNodeOperands.push_back(DAG.getTargetConstant( +      ExtraInfo, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));    // Loop over all of the inputs, copying the operand values into the    // appropriate registers and processing the output regs. @@ -6201,8 +6249,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {          OpFlag = InlineAsm::convertMemFlagWordToMatchingFlagWord(OpFlag);          OpFlag = InlineAsm::getFlagWordForMatchingOp(OpFlag,                                                      OpInfo.getMatchedOperand()); -        AsmNodeOperands.push_back(DAG.getTargetConstant(OpFlag, getCurSDLoc(), -                                                        TLI.getPointerTy())); +        AsmNodeOperands.push_back(DAG.getTargetConstant( +            OpFlag, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));          AsmNodeOperands.push_back(AsmNodeOperands[CurOp+1]);          break;        } @@ -6227,16 +6275,16 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {          // Add information to the INLINEASM node to know about this input.          unsigned ResOpType =            InlineAsm::getFlagWord(InlineAsm::Kind_Imm, Ops.size()); -        AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType, -                                                        getCurSDLoc(), -                                                        TLI.getPointerTy())); +        AsmNodeOperands.push_back(DAG.getTargetConstant( +            ResOpType, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())));          AsmNodeOperands.insert(AsmNodeOperands.end(), Ops.begin(), Ops.end());          break;        }        if (OpInfo.ConstraintType == TargetLowering::C_Memory) {          assert(OpInfo.isIndirect && "Operand must be indirect to be a mem!"); -        assert(InOperandVal.getValueType() == TLI.getPointerTy() && +        assert(InOperandVal.getValueType() == +                   TLI.getPointerTy(DAG.getDataLayout()) &&                 "Memory operands expect pointer values");          unsigned ConstraintID = @@ -6314,7 +6362,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {      // FIXME: Why don't we do this for inline asms with MRVs?      if (CS.getType()->isSingleValueType() && CS.getType()->isSized()) { -      EVT ResultType = TLI.getValueType(CS.getType()); +      EVT ResultType = TLI.getValueType(DAG.getDataLayout(), CS.getType());        // If any of the results of the inline asm is a vector, it may have the        // wrong width/num elts.  This can happen for register classes that can @@ -6380,9 +6428,9 @@ void SelectionDAGBuilder::visitVAStart(const CallInst &I) {  void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) {    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  const DataLayout &DL = *TLI.getDataLayout(); -  SDValue V = DAG.getVAArg(TLI.getValueType(I.getType()), getCurSDLoc(), -                           getRoot(), getValue(I.getOperand(0)), +  const DataLayout &DL = DAG.getDataLayout(); +  SDValue V = DAG.getVAArg(TLI.getValueType(DAG.getDataLayout(), I.getType()), +                           getCurSDLoc(), getRoot(), getValue(I.getOperand(0)),                             DAG.getSrcValue(I.getOperand(0)),                             DL.getABITypeAlignment(I.getType()));    setValue(&I, V); @@ -6473,8 +6521,8 @@ static void addStackMapLiveVars(ImmutableCallSite CS, unsigned StartIdx,          Builder.DAG.getTargetConstant(C->getSExtValue(), DL, MVT::i64));      } else if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(OpVal)) {        const TargetLowering &TLI = Builder.DAG.getTargetLoweringInfo(); -      Ops.push_back( -        Builder.DAG.getTargetFrameIndex(FI->getIndex(), TLI.getPointerTy())); +      Ops.push_back(Builder.DAG.getTargetFrameIndex( +          FI->getIndex(), TLI.getPointerTy(Builder.DAG.getDataLayout())));      } else        Ops.push_back(OpVal);    } @@ -6654,7 +6702,7 @@ void SelectionDAGBuilder::visitPatchpoint(ImmutableCallSite CS,      // Create the return types based on the intrinsic definition      const TargetLowering &TLI = DAG.getTargetLoweringInfo();      SmallVector<EVT, 3> ValueVTs; -    ComputeValueVTs(TLI, CS->getType(), ValueVTs); +    ComputeValueVTs(TLI, DAG.getDataLayout(), CS->getType(), ValueVTs);      assert(ValueVTs.size() == 1 && "Expected only one return value type.");      // There is always a chain and a glue type at the end @@ -6718,10 +6766,11 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {    Type *OrigRetTy = CLI.RetTy;    SmallVector<EVT, 4> RetTys;    SmallVector<uint64_t, 4> Offsets; -  ComputeValueVTs(*this, CLI.RetTy, RetTys, &Offsets); +  auto &DL = CLI.DAG.getDataLayout(); +  ComputeValueVTs(*this, DL, CLI.RetTy, RetTys, &Offsets);    SmallVector<ISD::OutputArg, 4> Outs; -  GetReturnInfo(CLI.RetTy, getReturnAttrs(CLI), Outs, *this); +  GetReturnInfo(CLI.RetTy, getReturnAttrs(CLI), Outs, *this, DL);    bool CanLowerReturn =        this->CanLowerReturn(CLI.CallConv, CLI.DAG.getMachineFunction(), @@ -6733,13 +6782,13 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {      // FIXME: equivalent assert?      // assert(!CS.hasInAllocaArgument() &&      //        "sret demotion is incompatible with inalloca"); -    uint64_t TySize = getDataLayout()->getTypeAllocSize(CLI.RetTy); -    unsigned Align  = getDataLayout()->getPrefTypeAlignment(CLI.RetTy); +    uint64_t TySize = DL.getTypeAllocSize(CLI.RetTy); +    unsigned Align = DL.getPrefTypeAlignment(CLI.RetTy);      MachineFunction &MF = CLI.DAG.getMachineFunction();      DemoteStackIdx = MF.getFrameInfo()->CreateStackObject(TySize, Align, false);      Type *StackSlotPtrType = PointerType::getUnqual(CLI.RetTy); -    DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getPointerTy()); +    DemoteStackSlot = CLI.DAG.getFrameIndex(DemoteStackIdx, getPointerTy(DL));      ArgListEntry Entry;      Entry.Node = DemoteStackSlot;      Entry.Ty = StackSlotPtrType; @@ -6784,7 +6833,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {    ArgListTy &Args = CLI.getArgs();    for (unsigned i = 0, e = Args.size(); i != e; ++i) {      SmallVector<EVT, 4> ValueVTs; -    ComputeValueVTs(*this, Args[i].Ty, ValueVTs); +    ComputeValueVTs(*this, DL, Args[i].Ty, ValueVTs);      Type *FinalType = Args[i].Ty;      if (Args[i].isByVal)        FinalType = cast<PointerType>(Args[i].Ty)->getElementType(); @@ -6797,7 +6846,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {        SDValue Op = SDValue(Args[i].Node.getNode(),                             Args[i].Node.getResNo() + Value);        ISD::ArgFlagsTy Flags; -      unsigned OriginalAlignment = getDataLayout()->getABITypeAlignment(ArgTy); +      unsigned OriginalAlignment = DL.getABITypeAlignment(ArgTy);        if (Args[i].isZExt)          Flags.setZExt(); @@ -6821,14 +6870,14 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {        if (Args[i].isByVal || Args[i].isInAlloca) {          PointerType *Ty = cast<PointerType>(Args[i].Ty);          Type *ElementTy = Ty->getElementType(); -        Flags.setByValSize(getDataLayout()->getTypeAllocSize(ElementTy)); +        Flags.setByValSize(DL.getTypeAllocSize(ElementTy));          // For ByVal, alignment should come from FE.  BE will guess if this          // info is not there but there are cases it cannot get right.          unsigned FrameAlign;          if (Args[i].Alignment)            FrameAlign = Args[i].Alignment;          else -          FrameAlign = getByValTypeAlignment(ElementTy); +          FrameAlign = getByValTypeAlignment(ElementTy, DL);          Flags.setByValAlign(FrameAlign);        }        if (Args[i].isNest) @@ -6923,7 +6972,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {      SmallVector<EVT, 1> PVTs;      Type *PtrRetTy = PointerType::getUnqual(OrigRetTy); -    ComputeValueVTs(*this, PtrRetTy, PVTs); +    ComputeValueVTs(*this, DL, PtrRetTy, PVTs);      assert(PVTs.size() == 1 && "Pointers should fit in one register");      EVT PtrVT = PVTs[0]; @@ -6997,7 +7046,8 @@ SelectionDAGBuilder::CopyValueToVirtualRegister(const Value *V, unsigned Reg) {    assert(!TargetRegisterInfo::isPhysicalRegister(Reg) && "Is a physreg");    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  RegsForValue RFV(V->getContext(), TLI, Reg, V->getType()); +  RegsForValue RFV(V->getContext(), TLI, DAG.getDataLayout(), Reg, +                   V->getType());    SDValue Chain = DAG.getEntryNode();    ISD::NodeType ExtendType = (FuncInfo.PreferredExtendType.find(V) == @@ -7030,13 +7080,14 @@ static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {  void SelectionDAGISel::LowerArguments(const Function &F) {    SelectionDAG &DAG = SDB->DAG;    SDLoc dl = SDB->getCurSDLoc(); -  const DataLayout *DL = TLI->getDataLayout(); +  const DataLayout &DL = DAG.getDataLayout();    SmallVector<ISD::InputArg, 16> Ins;    if (!FuncInfo->CanLowerReturn) {      // Put in an sret pointer parameter before all the other parameters.      SmallVector<EVT, 1> ValueVTs; -    ComputeValueVTs(*TLI, PointerType::getUnqual(F.getReturnType()), ValueVTs); +    ComputeValueVTs(*TLI, DAG.getDataLayout(), +                    PointerType::getUnqual(F.getReturnType()), ValueVTs);      // NOTE: Assuming that a pointer will never break down to more than one VT      // or one register. @@ -7053,7 +7104,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {    for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end();         I != E; ++I, ++Idx) {      SmallVector<EVT, 4> ValueVTs; -    ComputeValueVTs(*TLI, I->getType(), ValueVTs); +    ComputeValueVTs(*TLI, DAG.getDataLayout(), I->getType(), ValueVTs);      bool isArgValueUsed = !I->use_empty();      unsigned PartBase = 0;      Type *FinalType = I->getType(); @@ -7066,7 +7117,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {        EVT VT = ValueVTs[Value];        Type *ArgTy = VT.getTypeForEVT(*DAG.getContext());        ISD::ArgFlagsTy Flags; -      unsigned OriginalAlignment = DL->getABITypeAlignment(ArgTy); +      unsigned OriginalAlignment = DL.getABITypeAlignment(ArgTy);        if (F.getAttributes().hasAttribute(Idx, Attribute::ZExt))          Flags.setZExt(); @@ -7090,14 +7141,14 @@ void SelectionDAGISel::LowerArguments(const Function &F) {        if (Flags.isByVal() || Flags.isInAlloca()) {          PointerType *Ty = cast<PointerType>(I->getType());          Type *ElementTy = Ty->getElementType(); -        Flags.setByValSize(DL->getTypeAllocSize(ElementTy)); +        Flags.setByValSize(DL.getTypeAllocSize(ElementTy));          // For ByVal, alignment should be passed from FE.  BE will guess if          // this info is not there but there are cases it cannot get right.          unsigned FrameAlign;          if (F.getParamAlignment(Idx))            FrameAlign = F.getParamAlignment(Idx);          else -          FrameAlign = TLI->getByValTypeAlignment(ElementTy); +          FrameAlign = TLI->getByValTypeAlignment(ElementTy, DL);          Flags.setByValAlign(FrameAlign);        }        if (F.getAttributes().hasAttribute(Idx, Attribute::Nest)) @@ -7153,7 +7204,8 @@ void SelectionDAGISel::LowerArguments(const Function &F) {      // Create a virtual register for the sret pointer, and put in a copy      // from the sret argument into it.      SmallVector<EVT, 1> ValueVTs; -    ComputeValueVTs(*TLI, PointerType::getUnqual(F.getReturnType()), ValueVTs); +    ComputeValueVTs(*TLI, DAG.getDataLayout(), +                    PointerType::getUnqual(F.getReturnType()), ValueVTs);      MVT VT = ValueVTs[0].getSimpleVT();      MVT RegVT = TLI->getRegisterType(*CurDAG->getContext(), VT);      ISD::NodeType AssertOp = ISD::DELETED_NODE; @@ -7177,7 +7229,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {        ++I, ++Idx) {      SmallVector<SDValue, 4> ArgValues;      SmallVector<EVT, 4> ValueVTs; -    ComputeValueVTs(*TLI, I->getType(), ValueVTs); +    ComputeValueVTs(*TLI, DAG.getDataLayout(), I->getType(), ValueVTs);      unsigned NumValues = ValueVTs.size();      // If this argument is unused then remember its value. It is used to generate @@ -7324,7 +7376,7 @@ SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {        // the input for this MBB.        SmallVector<EVT, 4> ValueVTs;        const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -      ComputeValueVTs(TLI, PN->getType(), ValueVTs); +      ComputeValueVTs(TLI, DAG.getDataLayout(), PN->getType(), ValueVTs);        for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {          EVT VT = ValueVTs[vti];          unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT); @@ -7595,7 +7647,7 @@ void SelectionDAGBuilder::findJumpTables(CaseClusterVector &Clusters,  bool SelectionDAGBuilder::rangeFitsInWord(const APInt &Low, const APInt &High) {    // FIXME: Using the pointer type doesn't seem ideal. -  uint64_t BW = DAG.getTargetLoweringInfo().getPointerTy().getSizeInBits(); +  uint64_t BW = DAG.getDataLayout().getPointerSizeInBits();    uint64_t Range = (High - Low).getLimitedValue(UINT64_MAX - 1) + 1;    return Range <= BW;  } @@ -7650,8 +7702,9 @@ bool SelectionDAGBuilder::buildBitTests(CaseClusterVector &Clusters,    APInt LowBound;    APInt CmpRange; -  const int BitWidth = -      DAG.getTargetLoweringInfo().getPointerTy().getSizeInBits(); +  const int BitWidth = DAG.getTargetLoweringInfo() +                           .getPointerTy(DAG.getDataLayout()) +                           .getSizeInBits();    assert(rangeFitsInWord(Low, High) && "Case range must fit in bit mask!");    if (Low.isNonNegative() && High.slt(BitWidth)) { @@ -7731,7 +7784,7 @@ void SelectionDAGBuilder::findBitTestClusters(CaseClusterVector &Clusters,    // If target does not have legal shift left, do not emit bit tests at all.    const TargetLowering &TLI = DAG.getTargetLoweringInfo(); -  EVT PTy = TLI.getPointerTy(); +  EVT PTy = TLI.getPointerTy(DAG.getDataLayout());    if (!TLI.isOperationLegal(ISD::SHL, PTy))      return; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h index f225d54d189d..700675453fe7 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -755,8 +755,6 @@ public:    void visitJumpTable(JumpTable &JT);    void visitJumpTableHeader(JumpTable &JT, JumpTableHeader &JTH,                              MachineBasicBlock *SwitchBB); -  unsigned visitLandingPadClauseBB(GlobalValue *ClauseGV, -                                   MachineBasicBlock *LPadMBB);  private:    // These all get lowered before this pass. @@ -915,8 +913,8 @@ struct RegsForValue {    RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt, EVT valuevt); -  RegsForValue(LLVMContext &Context, const TargetLowering &tli, unsigned Reg, -               Type *Ty); +  RegsForValue(LLVMContext &Context, const TargetLowering &TLI, +               const DataLayout &DL, unsigned Reg, Type *Ty);    /// append - Add the specified values to this one.    void append(const RegsForValue &RHS) { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp index ef468a2b1c54..5b9b18286fae 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp @@ -95,7 +95,7 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {    case ISD::GLOBAL_OFFSET_TABLE:        return "GLOBAL_OFFSET_TABLE";    case ISD::RETURNADDR:                 return "RETURNADDR";    case ISD::FRAMEADDR:                  return "FRAMEADDR"; -  case ISD::FRAME_ALLOC_RECOVER:        return "FRAME_ALLOC_RECOVER"; +  case ISD::LOCAL_RECOVER:        return "LOCAL_RECOVER";    case ISD::READ_REGISTER:              return "READ_REGISTER";    case ISD::WRITE_REGISTER:             return "WRITE_REGISTER";    case ISD::FRAME_TO_ARGS_OFFSET:       return "FRAME_TO_ARGS_OFFSET"; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 31f8210f40f0..97ece8b9248a 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -921,7 +921,8 @@ void SelectionDAGISel::DoInstructionSelection() {  bool SelectionDAGISel::PrepareEHLandingPad() {    MachineBasicBlock *MBB = FuncInfo->MBB; -  const TargetRegisterClass *PtrRC = TLI->getRegClassFor(TLI->getPointerTy()); +  const TargetRegisterClass *PtrRC = +      TLI->getRegClassFor(TLI->getPointerTy(CurDAG->getDataLayout()));    // Add a label to mark the beginning of the landing pad.  Deletion of the    // landing pad can thus be detected via the MachineModuleInfo. @@ -1931,7 +1932,8 @@ SDNode    MDNodeSDNode *MD = dyn_cast<MDNodeSDNode>(Op->getOperand(1));    const MDString *RegStr = dyn_cast<MDString>(MD->getMD()->getOperand(0));    unsigned Reg = -      TLI->getRegisterByName(RegStr->getString().data(), Op->getValueType(0)); +      TLI->getRegisterByName(RegStr->getString().data(), Op->getValueType(0), +                             *CurDAG);    SDValue New = CurDAG->getCopyFromReg(                          Op->getOperand(0), dl, Reg, Op->getValueType(0));    New->setNodeId(-1); @@ -1944,7 +1946,8 @@ SDNode    MDNodeSDNode *MD = dyn_cast<MDNodeSDNode>(Op->getOperand(1));    const MDString *RegStr = dyn_cast<MDString>(MD->getMD()->getOperand(0));    unsigned Reg = TLI->getRegisterByName(RegStr->getString().data(), -                                        Op->getOperand(2).getValueType()); +                                        Op->getOperand(2).getValueType(), +                                        *CurDAG);    SDValue New = CurDAG->getCopyToReg(                          Op->getOperand(0), dl, Reg, Op->getOperand(2));    New->setNodeId(-1); @@ -2329,21 +2332,23 @@ CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex,  }  LLVM_ATTRIBUTE_ALWAYS_INLINE static bool -CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex, -          SDValue N, const TargetLowering *TLI) { +CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N, +          const TargetLowering *TLI, const DataLayout &DL) {    MVT::SimpleValueType VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];    if (N.getValueType() == VT) return true;    // Handle the case when VT is iPTR. -  return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy(); +  return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy(DL);  }  LLVM_ATTRIBUTE_ALWAYS_INLINE static bool  CheckChildType(const unsigned char *MatcherTable, unsigned &MatcherIndex, -               SDValue N, const TargetLowering *TLI, unsigned ChildNo) { +               SDValue N, const TargetLowering *TLI, const DataLayout &DL, +               unsigned ChildNo) {    if (ChildNo >= N.getNumOperands())      return false;  // Match fails if out of range child #. -  return ::CheckType(MatcherTable, MatcherIndex, N.getOperand(ChildNo), TLI); +  return ::CheckType(MatcherTable, MatcherIndex, N.getOperand(ChildNo), TLI, +                     DL);  }  LLVM_ATTRIBUTE_ALWAYS_INLINE static bool @@ -2355,13 +2360,13 @@ CheckCondCode(const unsigned char *MatcherTable, unsigned &MatcherIndex,  LLVM_ATTRIBUTE_ALWAYS_INLINE static bool  CheckValueType(const unsigned char *MatcherTable, unsigned &MatcherIndex, -               SDValue N, const TargetLowering *TLI) { +               SDValue N, const TargetLowering *TLI, const DataLayout &DL) {    MVT::SimpleValueType VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];    if (cast<VTSDNode>(N)->getVT() == VT)      return true;    // Handle the case when VT is iPTR. -  return VT == MVT::iPTR && cast<VTSDNode>(N)->getVT() == TLI->getPointerTy(); +  return VT == MVT::iPTR && cast<VTSDNode>(N)->getVT() == TLI->getPointerTy(DL);  }  LLVM_ATTRIBUTE_ALWAYS_INLINE static bool @@ -2444,7 +2449,8 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,      Result = !::CheckOpcode(Table, Index, N.getNode());      return Index;    case SelectionDAGISel::OPC_CheckType: -    Result = !::CheckType(Table, Index, N, SDISel.TLI); +    Result = !::CheckType(Table, Index, N, SDISel.TLI, +                          SDISel.CurDAG->getDataLayout());      return Index;    case SelectionDAGISel::OPC_CheckChild0Type:    case SelectionDAGISel::OPC_CheckChild1Type: @@ -2454,15 +2460,16 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,    case SelectionDAGISel::OPC_CheckChild5Type:    case SelectionDAGISel::OPC_CheckChild6Type:    case SelectionDAGISel::OPC_CheckChild7Type: -    Result = !::CheckChildType(Table, Index, N, SDISel.TLI, -                               Table[Index - 1] - -                                   SelectionDAGISel::OPC_CheckChild0Type); +    Result = !::CheckChildType( +                 Table, Index, N, SDISel.TLI, SDISel.CurDAG->getDataLayout(), +                 Table[Index - 1] - SelectionDAGISel::OPC_CheckChild0Type);      return Index;    case SelectionDAGISel::OPC_CheckCondCode:      Result = !::CheckCondCode(Table, Index, N);      return Index;    case SelectionDAGISel::OPC_CheckValueType: -    Result = !::CheckValueType(Table, Index, N, SDISel.TLI); +    Result = !::CheckValueType(Table, Index, N, SDISel.TLI, +                               SDISel.CurDAG->getDataLayout());      return Index;    case SelectionDAGISel::OPC_CheckInteger:      Result = !::CheckInteger(Table, Index, N); @@ -2816,7 +2823,8 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,        continue;      case OPC_CheckType: -      if (!::CheckType(MatcherTable, MatcherIndex, N, TLI)) +      if (!::CheckType(MatcherTable, MatcherIndex, N, TLI, +                       CurDAG->getDataLayout()))          break;        continue; @@ -2864,7 +2872,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,          MVT CaseVT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];          if (CaseVT == MVT::iPTR) -          CaseVT = TLI->getPointerTy(); +          CaseVT = TLI->getPointerTy(CurDAG->getDataLayout());          // If the VT matches, then we will execute this case.          if (CurNodeVT == CaseVT) @@ -2887,14 +2895,16 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,      case OPC_CheckChild4Type: case OPC_CheckChild5Type:      case OPC_CheckChild6Type: case OPC_CheckChild7Type:        if (!::CheckChildType(MatcherTable, MatcherIndex, N, TLI, -                            Opcode-OPC_CheckChild0Type)) +                            CurDAG->getDataLayout(), +                            Opcode - OPC_CheckChild0Type))          break;        continue;      case OPC_CheckCondCode:        if (!::CheckCondCode(MatcherTable, MatcherIndex, N)) break;        continue;      case OPC_CheckValueType: -      if (!::CheckValueType(MatcherTable, MatcherIndex, N, TLI)) +      if (!::CheckValueType(MatcherTable, MatcherIndex, N, TLI, +                            CurDAG->getDataLayout()))          break;        continue;      case OPC_CheckInteger: @@ -3097,7 +3107,7 @@ SelectCodeCommon(SDNode *NodeToMatch, const unsigned char *MatcherTable,          MVT::SimpleValueType VT =            (MVT::SimpleValueType)MatcherTable[MatcherIndex++];          if (VT == MVT::iPTR) -          VT = TLI->getPointerTy().SimpleTy; +          VT = TLI->getPointerTy(CurDAG->getDataLayout()).SimpleTy;          VTs.push_back(VT);        } diff --git a/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/lib/CodeGen/SelectionDAG/StatepointLowering.cpp index bd40cac95543..34688df4765b 100644 --- a/lib/CodeGen/SelectionDAG/StatepointLowering.cpp +++ b/lib/CodeGen/SelectionDAG/StatepointLowering.cpp @@ -337,9 +337,9 @@ lowerCallFromStatepoint(ImmutableStatepoint ISP, MachineBasicBlock *LandingPad,        // TODO: To eliminate this problem we can remove gc.result intrinsics        //       completelly and make statepoint call to return a tuple.        unsigned Reg = Builder.FuncInfo.CreateRegs(ISP.getActualReturnType()); -      RegsForValue RFV(*Builder.DAG.getContext(), -                       Builder.DAG.getTargetLoweringInfo(), Reg, -                       ISP.getActualReturnType()); +      RegsForValue RFV( +          *Builder.DAG.getContext(), Builder.DAG.getTargetLoweringInfo(), +          Builder.DAG.getDataLayout(), Reg, ISP.getActualReturnType());        SDValue Chain = Builder.DAG.getEntryNode();        RFV.getCopyToRegs(ReturnValue, Builder.DAG, Builder.getCurSDLoc(), Chain, diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index e7722b392a81..fbf651277c7f 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -102,7 +102,8 @@ TargetLowering::makeLibCall(SelectionDAG &DAG,    }    if (LC == RTLIB::UNKNOWN_LIBCALL)      report_fatal_error("Unsupported library call operation!"); -  SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC), getPointerTy()); +  SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC), +                                         getPointerTy(DAG.getDataLayout()));    Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());    TargetLowering::CallLoweringInfo CLI(DAG); @@ -206,14 +207,16 @@ void TargetLowering::softenSetCCOperands(SelectionDAG &DAG, EVT VT,    NewRHS = DAG.getConstant(0, dl, RetVT);    CCCode = getCmpLibcallCC(LC1);    if (LC2 != RTLIB::UNKNOWN_LIBCALL) { -    SDValue Tmp = DAG.getNode(ISD::SETCC, dl, -                              getSetCCResultType(*DAG.getContext(), RetVT), -                              NewLHS, NewRHS, DAG.getCondCode(CCCode)); +    SDValue Tmp = DAG.getNode( +        ISD::SETCC, dl, +        getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT), +        NewLHS, NewRHS, DAG.getCondCode(CCCode));      NewLHS = makeLibCall(DAG, LC2, RetVT, Ops, 2, false/*sign irrelevant*/,                           dl).first; -    NewLHS = DAG.getNode(ISD::SETCC, dl, -                         getSetCCResultType(*DAG.getContext(), RetVT), NewLHS, -                         NewRHS, DAG.getCondCode(getCmpLibcallCC(LC2))); +    NewLHS = DAG.getNode( +        ISD::SETCC, dl, +        getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT), +        NewLHS, NewRHS, DAG.getCondCode(getCmpLibcallCC(LC2)));      NewLHS = DAG.getNode(ISD::OR, dl, Tmp.getValueType(), Tmp, NewLHS);      NewRHS = SDValue();    } @@ -242,7 +245,7 @@ SDValue TargetLowering::getPICJumpTableRelocBase(SDValue Table,    if ((JTEncoding == MachineJumpTableInfo::EK_GPRel64BlockAddress) ||        (JTEncoding == MachineJumpTableInfo::EK_GPRel32BlockAddress)) -    return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy(0)); +    return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy(DAG.getDataLayout()));    return Table;  } @@ -265,9 +268,7 @@ TargetLowering::isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const {    // In dynamic-no-pic mode, assume that known defined values are safe.    if (getTargetMachine().getRelocationModel() == Reloc::DynamicNoPIC && -      GA && -      !GA->getGlobal()->isDeclaration() && -      !GA->getGlobal()->isWeakForLinker()) +      GA && GA->getGlobal()->isStrongDefinitionForLinker())      return true;    // Otherwise assume nothing is safe. @@ -383,6 +384,7 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,           "Mask size mismatches value type size!");    APInt NewMask = DemandedMask;    SDLoc dl(Op); +  auto &DL = TLO.DAG.getDataLayout();    // Don't know anything.    KnownZero = KnownOne = APInt(BitWidth, 0); @@ -645,7 +647,7 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,          unsigned InnerBits = InnerVT.getSizeInBits();          if (ShAmt < InnerBits && NewMask.lshr(InnerBits) == 0 &&              isTypeDesirableForOp(ISD::SHL, InnerVT)) { -          EVT ShTy = getShiftAmountTy(InnerVT); +          EVT ShTy = getShiftAmountTy(InnerVT, DL);            if (!APInt(BitWidth, ShAmt).isIntN(ShTy.getSizeInBits()))              ShTy = InnerVT;            SDValue NarrowShl = @@ -824,7 +826,7 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,          // for scalar types after legalization.          EVT ShiftAmtTy = Op.getValueType();          if (TLO.LegalTypes() && !ShiftAmtTy.isVector()) -          ShiftAmtTy = getShiftAmountTy(ShiftAmtTy); +          ShiftAmtTy = getShiftAmountTy(ShiftAmtTy, DL);          SDValue ShiftAmt = TLO.DAG.getConstant(BitWidth - ShAmt, dl,                                                 ShiftAmtTy); @@ -1009,8 +1011,8 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op,          SDValue Shift = In.getOperand(1);          if (TLO.LegalTypes()) {            uint64_t ShVal = ShAmt->getZExtValue(); -          Shift = -            TLO.DAG.getConstant(ShVal, dl, getShiftAmountTy(Op.getValueType())); +          Shift = TLO.DAG.getConstant(ShVal, dl, +                                      getShiftAmountTy(Op.getValueType(), DL));          }          APInt HighBits = APInt::getHighBitsSet(OperandBitWidth, @@ -1400,7 +1402,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,            APInt newMask = APInt::getLowBitsSet(maskWidth, width);            for (unsigned offset=0; offset<origWidth/width; offset++) {              if ((newMask & Mask) == Mask) { -              if (!getDataLayout()->isLittleEndian()) +              if (!DAG.getDataLayout().isLittleEndian())                  bestOffset = (origWidth/width - offset - 1) * (width/8);                else                  bestOffset = (uint64_t)offset * (width/8); @@ -1473,7 +1475,8 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,          if (DCI.isBeforeLegalizeOps() ||              (isOperationLegal(ISD::SETCC, newVT) &&               getCondCodeAction(Cond, newVT.getSimpleVT()) == Legal)) { -          EVT NewSetCCVT = getSetCCResultType(*DAG.getContext(), newVT); +          EVT NewSetCCVT = +              getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), newVT);            SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);            SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0), @@ -1692,11 +1695,13 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,      if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&          (VT == N0.getValueType() ||           (isTypeLegal(VT) && VT.bitsLE(N0.getValueType()))) && -        N0.getOpcode() == ISD::AND) +        N0.getOpcode() == ISD::AND) { +      auto &DL = DAG.getDataLayout();        if (ConstantSDNode *AndRHS =                    dyn_cast<ConstantSDNode>(N0.getOperand(1))) { -        EVT ShiftTy = DCI.isBeforeLegalize() ? -          getPointerTy() : getShiftAmountTy(N0.getValueType()); +        EVT ShiftTy = DCI.isBeforeLegalize() +                          ? getPointerTy(DL) +                          : getShiftAmountTy(N0.getValueType(), DL);          if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0  -->  (X & 8) >> 3            // Perform the xform if the AND RHS is a single bit.            if (AndRHS->getAPIntValue().isPowerOf2()) { @@ -1716,6 +1721,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,            }          }        } +    }      if (C1.getMinSignedBits() <= 64 &&          !isLegalICmpImmediate(C1.getSExtValue())) { @@ -1727,8 +1733,10 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,            const APInt &AndRHSC = AndRHS->getAPIntValue();            if ((-AndRHSC).isPowerOf2() && (AndRHSC & C1) == C1) {              unsigned ShiftBits = AndRHSC.countTrailingZeros(); -            EVT ShiftTy = DCI.isBeforeLegalize() ? -              getPointerTy() : getShiftAmountTy(N0.getValueType()); +            auto &DL = DAG.getDataLayout(); +            EVT ShiftTy = DCI.isBeforeLegalize() +                              ? getPointerTy(DL) +                              : getShiftAmountTy(N0.getValueType(), DL);              EVT CmpTy = N0.getValueType();              SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0.getOperand(0),                                          DAG.getConstant(ShiftBits, dl, @@ -1757,8 +1765,10 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,          NewC = NewC.lshr(ShiftBits);          if (ShiftBits && NewC.getMinSignedBits() <= 64 &&            isLegalICmpImmediate(NewC.getSExtValue())) { -          EVT ShiftTy = DCI.isBeforeLegalize() ? -            getPointerTy() : getShiftAmountTy(N0.getValueType()); +          auto &DL = DAG.getDataLayout(); +          EVT ShiftTy = DCI.isBeforeLegalize() +                            ? getPointerTy(DL) +                            : getShiftAmountTy(N0.getValueType(), DL);            EVT CmpTy = N0.getValueType();            SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0,                                        DAG.getConstant(ShiftBits, dl, ShiftTy)); @@ -1945,10 +1955,12 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,                                  Cond);            if (N0.getNode()->hasOneUse()) {              assert(N0.getOpcode() == ISD::SUB && "Unexpected operation!"); +            auto &DL = DAG.getDataLayout();              // (Z-X) == X  --> Z == X<<1 -            SDValue SH = DAG.getNode(ISD::SHL, dl, N1.getValueType(), N1, -                       DAG.getConstant(1, dl, -                                       getShiftAmountTy(N1.getValueType()))); +            SDValue SH = DAG.getNode( +                ISD::SHL, dl, N1.getValueType(), N1, +                DAG.getConstant(1, dl, +                                getShiftAmountTy(N1.getValueType(), DL)));              if (!DCI.isCalledByLegalizer())                DCI.AddToWorklist(SH.getNode());              return DAG.getSetCC(dl, VT, N0.getOperand(0), SH, Cond); @@ -1969,10 +1981,11 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,                            DAG.getConstant(0, dl, N1.getValueType()), Cond);          if (N1.getNode()->hasOneUse()) {            assert(N1.getOpcode() == ISD::SUB && "Unexpected operation!"); +          auto &DL = DAG.getDataLayout();            // X == (Z-X)  --> X<<1 == Z -          SDValue SH = DAG.getNode(ISD::SHL, dl, N1.getValueType(), N0, -                       DAG.getConstant(1, dl, -                                       getShiftAmountTy(N0.getValueType()))); +          SDValue SH = DAG.getNode( +              ISD::SHL, dl, N1.getValueType(), N0, +              DAG.getConstant(1, dl, getShiftAmountTy(N0.getValueType(), DL)));            if (!DCI.isCalledByLegalizer())              DCI.AddToWorklist(SH.getNode());            return DAG.getSetCC(dl, VT, SH, N1.getOperand(0), Cond); @@ -2105,9 +2118,8 @@ PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const {  //  Inline Assembler Implementation Methods  //===----------------------------------------------------------------------===// -  TargetLowering::ConstraintType -TargetLowering::getConstraintType(const std::string &Constraint) const { +TargetLowering::getConstraintType(StringRef Constraint) const {    unsigned S = Constraint.size();    if (S == 1) { @@ -2140,7 +2152,7 @@ TargetLowering::getConstraintType(const std::string &Constraint) const {    }    if (S > 1 && Constraint[0] == '{' && Constraint[S-1] == '}') { -    if (S == 8 && !Constraint.compare(1, 6, "memory", 6))  // "{memory}" +    if (S == 8 && Constraint.substr(1, 6) == "memory") // "{memory}"        return C_Memory;      return C_Register;    } @@ -2206,8 +2218,8 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,          Ops.push_back(DAG.getTargetGlobalAddress(GA->getGlobal(),                                                   C ? SDLoc(C) : SDLoc(),                                                   Op.getValueType(), Offs)); -        return;        } +      return;      }      if (C) {   // just C, no GV.        // Simple constants are not allowed for 's'. @@ -2217,8 +2229,8 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,          // ScheduleDAGSDNodes::EmitNode, which is very generic.          Ops.push_back(DAG.getTargetConstant(C->getAPIntValue().getSExtValue(),                                              SDLoc(C), MVT::i64)); -        return;        } +      return;      }      break;    } @@ -2227,7 +2239,7 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,  std::pair<unsigned, const TargetRegisterClass *>  TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *RI, -                                             const std::string &Constraint, +                                             StringRef Constraint,                                               MVT VT) const {    if (Constraint.empty() || Constraint[0] != '{')      return std::make_pair(0u, static_cast<TargetRegisterClass*>(nullptr)); @@ -2293,7 +2305,8 @@ unsigned TargetLowering::AsmOperandInfo::getMatchedOperand() const {  /// If this returns an empty vector, and if the constraint string itself  /// isn't empty, there was an error parsing.  TargetLowering::AsmOperandInfoVector -TargetLowering::ParseConstraints(const TargetRegisterInfo *TRI, +TargetLowering::ParseConstraints(const DataLayout &DL, +                                 const TargetRegisterInfo *TRI,                                   ImmutableCallSite CS) const {    /// ConstraintOperands - Information about all of the constraints.    AsmOperandInfoVector ConstraintOperands; @@ -2329,10 +2342,11 @@ TargetLowering::ParseConstraints(const TargetRegisterInfo *TRI,        assert(!CS.getType()->isVoidTy() &&               "Bad inline asm!");        if (StructType *STy = dyn_cast<StructType>(CS.getType())) { -        OpInfo.ConstraintVT = getSimpleValueType(STy->getElementType(ResNo)); +        OpInfo.ConstraintVT = +            getSimpleValueType(DL, STy->getElementType(ResNo));        } else {          assert(ResNo == 0 && "Asm only has one result!"); -        OpInfo.ConstraintVT = getSimpleValueType(CS.getType()); +        OpInfo.ConstraintVT = getSimpleValueType(DL, CS.getType());        }        ++ResNo;        break; @@ -2361,7 +2375,7 @@ TargetLowering::ParseConstraints(const TargetRegisterInfo *TRI,        // If OpTy is not a single value, it may be a struct/union that we        // can tile with integers.        if (!OpTy->isSingleValueType() && OpTy->isSized()) { -        unsigned BitSize = getDataLayout()->getTypeSizeInBits(OpTy); +        unsigned BitSize = DL.getTypeSizeInBits(OpTy);          switch (BitSize) {          default: break;          case 1: @@ -2375,8 +2389,7 @@ TargetLowering::ParseConstraints(const TargetRegisterInfo *TRI,            break;          }        } else if (PointerType *PT = dyn_cast<PointerType>(OpTy)) { -        unsigned PtrSize -          = getDataLayout()->getPointerSizeInBits(PT->getAddressSpace()); +        unsigned PtrSize = DL.getPointerSizeInBits(PT->getAddressSpace());          OpInfo.ConstraintVT = MVT::getIntegerVT(PtrSize);        } else {          OpInfo.ConstraintVT = MVT::getVT(OpTy, true); @@ -2684,7 +2697,8 @@ static SDValue BuildExactSDIV(const TargetLowering &TLI, SDValue Op1, APInt d,    if (ShAmt) {      // TODO: For UDIV use SRL instead of SRA.      SDValue Amt = -        DAG.getConstant(ShAmt, dl, TLI.getShiftAmountTy(Op1.getValueType())); +        DAG.getConstant(ShAmt, dl, TLI.getShiftAmountTy(Op1.getValueType(), +                                                        DAG.getDataLayout()));      SDNodeFlags Flags;      Flags.setExact(true);      Op1 = DAG.getNode(ISD::SRA, dl, Op1.getValueType(), Op1, Amt, &Flags); @@ -2750,17 +2764,19 @@ SDValue TargetLowering::BuildSDIV(SDNode *N, const APInt &Divisor,      Q = DAG.getNode(ISD::SUB, dl, VT, Q, N->getOperand(0));      Created->push_back(Q.getNode());    } +  auto &DL = DAG.getDataLayout();    // Shift right algebraic if shift value is nonzero    if (magics.s > 0) { -    Q = DAG.getNode(ISD::SRA, dl, VT, Q, -                    DAG.getConstant(magics.s, dl, -                                    getShiftAmountTy(Q.getValueType()))); +    Q = DAG.getNode( +        ISD::SRA, dl, VT, Q, +        DAG.getConstant(magics.s, dl, getShiftAmountTy(Q.getValueType(), DL)));      Created->push_back(Q.getNode());    }    // Extract the sign bit and add it to the quotient -  SDValue T = DAG.getNode(ISD::SRL, dl, VT, Q, -                          DAG.getConstant(VT.getScalarSizeInBits() - 1, dl, -                                          getShiftAmountTy(Q.getValueType()))); +  SDValue T = +      DAG.getNode(ISD::SRL, dl, VT, Q, +                  DAG.getConstant(VT.getScalarSizeInBits() - 1, dl, +                                  getShiftAmountTy(Q.getValueType(), DL)));    Created->push_back(T.getNode());    return DAG.getNode(ISD::ADD, dl, VT, Q, T);  } @@ -2776,6 +2792,7 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,    EVT VT = N->getValueType(0);    SDLoc dl(N); +  auto &DL = DAG.getDataLayout();    // Check to see if we can do this.    // FIXME: We should be more aggressive here. @@ -2792,9 +2809,9 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,    // the divided value upfront.    if (magics.a != 0 && !Divisor[0]) {      unsigned Shift = Divisor.countTrailingZeros(); -    Q = DAG.getNode(ISD::SRL, dl, VT, Q, -                    DAG.getConstant(Shift, dl, -                                    getShiftAmountTy(Q.getValueType()))); +    Q = DAG.getNode( +        ISD::SRL, dl, VT, Q, +        DAG.getConstant(Shift, dl, getShiftAmountTy(Q.getValueType(), DL)));      Created->push_back(Q.getNode());      // Get magic number for the shifted divisor. @@ -2819,21 +2836,22 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, const APInt &Divisor,    if (magics.a == 0) {      assert(magics.s < Divisor.getBitWidth() &&             "We shouldn't generate an undefined shift!"); -    return DAG.getNode(ISD::SRL, dl, VT, Q, -                       DAG.getConstant(magics.s, dl, -                                       getShiftAmountTy(Q.getValueType()))); +    return DAG.getNode( +        ISD::SRL, dl, VT, Q, +        DAG.getConstant(magics.s, dl, getShiftAmountTy(Q.getValueType(), DL)));    } else {      SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N->getOperand(0), Q);      Created->push_back(NPQ.getNode()); -    NPQ = DAG.getNode(ISD::SRL, dl, VT, NPQ, -                      DAG.getConstant(1, dl, -                                      getShiftAmountTy(NPQ.getValueType()))); +    NPQ = DAG.getNode( +        ISD::SRL, dl, VT, NPQ, +        DAG.getConstant(1, dl, getShiftAmountTy(NPQ.getValueType(), DL)));      Created->push_back(NPQ.getNode());      NPQ = DAG.getNode(ISD::ADD, dl, VT, NPQ, Q);      Created->push_back(NPQ.getNode()); -    return DAG.getNode(ISD::SRL, dl, VT, NPQ, -                       DAG.getConstant(magics.s - 1, dl, -                                       getShiftAmountTy(NPQ.getValueType()))); +    return DAG.getNode( +        ISD::SRL, dl, VT, NPQ, +        DAG.getConstant(magics.s - 1, dl, +                        getShiftAmountTy(NPQ.getValueType(), DL)));    }  } @@ -2919,8 +2937,9 @@ bool TargetLowering::expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT,      if (!LH.getNode() && !RH.getNode() &&          isOperationLegalOrCustom(ISD::SRL, VT) &&          isOperationLegalOrCustom(ISD::TRUNCATE, HiLoVT)) { +      auto &DL = DAG.getDataLayout();        unsigned ShiftAmt = VT.getSizeInBits() - HiLoVT.getSizeInBits(); -      SDValue Shift = DAG.getConstant(ShiftAmt, dl, getShiftAmountTy(VT)); +      SDValue Shift = DAG.getConstant(ShiftAmt, dl, getShiftAmountTy(VT, DL));        LH = DAG.getNode(ISD::SRL, dl, VT, N->getOperand(0), Shift);        LH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LH);        RH = DAG.getNode(ISD::SRL, dl, VT, N->getOperand(1), Shift); @@ -2980,14 +2999,15 @@ bool TargetLowering::expandFP_TO_SINT(SDNode *Node, SDValue &Result,    SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Node->getOperand(0)); -  SDValue ExponentBits = DAG.getNode(ISD::SRL, dl, IntVT, -      DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask), -      DAG.getZExtOrTrunc(ExponentLoBit, dl, getShiftAmountTy(IntVT))); +  auto &DL = DAG.getDataLayout(); +  SDValue ExponentBits = DAG.getNode( +      ISD::SRL, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask), +      DAG.getZExtOrTrunc(ExponentLoBit, dl, getShiftAmountTy(IntVT, DL)));    SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias); -  SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT, -      DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask), -      DAG.getZExtOrTrunc(SignLowBit, dl, getShiftAmountTy(IntVT))); +  SDValue Sign = DAG.getNode( +      ISD::SRA, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask), +      DAG.getZExtOrTrunc(SignLowBit, dl, getShiftAmountTy(IntVT, DL)));    Sign = DAG.getSExtOrTrunc(Sign, dl, NVT);    SDValue R = DAG.getNode(ISD::OR, dl, IntVT, @@ -2996,17 +3016,17 @@ bool TargetLowering::expandFP_TO_SINT(SDNode *Node, SDValue &Result,    R = DAG.getZExtOrTrunc(R, dl, NVT); - -  R = DAG.getSelectCC(dl, Exponent, ExponentLoBit, -     DAG.getNode(ISD::SHL, dl, NVT, R, -                 DAG.getZExtOrTrunc( -                    DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit), -                    dl, getShiftAmountTy(IntVT))), -     DAG.getNode(ISD::SRL, dl, NVT, R, -                 DAG.getZExtOrTrunc( -                    DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent), -                    dl, getShiftAmountTy(IntVT))), -     ISD::SETGT); +  R = DAG.getSelectCC( +      dl, Exponent, ExponentLoBit, +      DAG.getNode(ISD::SHL, dl, NVT, R, +                  DAG.getZExtOrTrunc( +                      DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit), +                      dl, getShiftAmountTy(IntVT, DL))), +      DAG.getNode(ISD::SRL, dl, NVT, R, +                  DAG.getZExtOrTrunc( +                      DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent), +                      dl, getShiftAmountTy(IntVT, DL))), +      ISD::SETGT);    SDValue Ret = DAG.getNode(ISD::SUB, dl, NVT,        DAG.getNode(ISD::XOR, dl, NVT, R, Sign), diff --git a/lib/CodeGen/SelectionDAG/TargetSelectionDAGInfo.cpp b/lib/CodeGen/SelectionDAG/TargetSelectionDAGInfo.cpp index 0e89bad5f26f..00db94256844 100644 --- a/lib/CodeGen/SelectionDAG/TargetSelectionDAGInfo.cpp +++ b/lib/CodeGen/SelectionDAG/TargetSelectionDAGInfo.cpp @@ -15,9 +15,5 @@  #include "llvm/Target/TargetMachine.h"  using namespace llvm; -TargetSelectionDAGInfo::TargetSelectionDAGInfo(const DataLayout *DL) -  : DL(DL) { -} -  TargetSelectionDAGInfo::~TargetSelectionDAGInfo() {  }  | 
