diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-02-26 22:03:50 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-02-26 22:03:50 +0000 | 
| commit | d0e4e96dc17a6c1c6de3340842c80f0e187ba349 (patch) | |
| tree | ddf53b8bd9235bcb0b8aae16c5e22310dcdad665 /lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | |
| parent | cf099d11218cb6f6c5cce947d6738e347f07fb12 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeDAG.cpp')
| -rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 49 | 
1 files changed, 29 insertions, 20 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 49c862ce3e0b..f08528fe2dc3 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -87,7 +87,7 @@ class SelectionDAGLegalize {      // If someone requests legalization of the new node, return itself.      if (From != To)        LegalizedNodes.insert(std::make_pair(To, To)); -     +      // Transfer SDDbgValues.      DAG.TransferDbgValues(From, To);    } @@ -498,7 +498,8 @@ SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,    int IncrementSize = NumBits / 8;    // Divide the stored value in two parts. -  SDValue ShiftAmount = DAG.getConstant(NumBits, TLI.getShiftAmountTy()); +  SDValue ShiftAmount = DAG.getConstant(NumBits, +                                      TLI.getShiftAmountTy(Val.getValueType()));    SDValue Lo = Val;    SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount); @@ -645,7 +646,8 @@ SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,    }    // aggregate the two parts -  SDValue ShiftAmount = DAG.getConstant(NumBits, TLI.getShiftAmountTy()); +  SDValue ShiftAmount = DAG.getConstant(NumBits, +                                       TLI.getShiftAmountTy(Hi.getValueType()));    SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);    Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo); @@ -1264,7 +1266,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {          // Move the top bits to the right place.          Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, -                         DAG.getConstant(RoundWidth, TLI.getShiftAmountTy())); +                         DAG.getConstant(RoundWidth, +                                      TLI.getShiftAmountTy(Hi.getValueType())));          // Join the hi and lo parts.          Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); @@ -1293,7 +1296,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {          // Move the top bits to the right place.          Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, -                         DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy())); +                         DAG.getConstant(ExtraWidth, +                                      TLI.getShiftAmountTy(Hi.getValueType())));          // Join the hi and lo parts.          Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); @@ -1482,7 +1486,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {            Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2,                               DAG.getIntPtrConstant(IncrementSize));            Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3, -                           DAG.getConstant(RoundWidth, TLI.getShiftAmountTy())); +                           DAG.getConstant(RoundWidth, +                                    TLI.getShiftAmountTy(Tmp3.getValueType())));            Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2,                               ST->getPointerInfo().getWithOffset(IncrementSize),                                   ExtraVT, isVolatile, isNonTemporal, @@ -1492,7 +1497,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {            // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X            // Store the top RoundWidth bits.            Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3, -                           DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy())); +                           DAG.getConstant(ExtraWidth, +                                    TLI.getShiftAmountTy(Tmp3.getValueType())));            Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getPointerInfo(),                                   RoundVT, isVolatile, isNonTemporal, Alignment); @@ -1727,7 +1733,8 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {        assert(BitShift < LoadTy.getSizeInBits() && "Pointer advanced wrong?");        if (BitShift)          SignBit = DAG.getNode(ISD::SHL, dl, LoadTy, SignBit, -                              DAG.getConstant(BitShift,TLI.getShiftAmountTy())); +                              DAG.getConstant(BitShift, +                                 TLI.getShiftAmountTy(SignBit.getValueType())));      }    }    // Now get the sign bit proper, by seeing whether the value is negative. @@ -2207,7 +2214,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, TLI.getShiftAmountTy()); +      SDValue ShiftConst = +          DAG.getConstant(1, TLI.getShiftAmountTy(Op0.getValueType()));        SDValue Shr = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0, ShiftConst);        SDValue AndConst = DAG.getConstant(1, MVT::i64);        SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, AndConst); @@ -2226,7 +2234,6 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,      }      // Otherwise, implement the fully general conversion. -    EVT SHVT = TLI.getShiftAmountTy();      SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0,           DAG.getConstant(UINT64_C(0xfffffffffffff800), MVT::i64)); @@ -2241,6 +2248,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,                     Op0, DAG.getConstant(UINT64_C(0x0020000000000000), MVT::i64),                     ISD::SETUGE);      SDValue Sel2 = DAG.getNode(ISD::SELECT, dl, MVT::i64, Ge, Sel, Op0); +    EVT SHVT = TLI.getShiftAmountTy(Sel2.getValueType());      SDValue Sh = DAG.getNode(ISD::SRL, dl, MVT::i64, Sel2,                               DAG.getConstant(32, SHVT)); @@ -2387,7 +2395,7 @@ SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp,  ///  SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, DebugLoc dl) {    EVT VT = Op.getValueType(); -  EVT SHVT = TLI.getShiftAmountTy(); +  EVT SHVT = TLI.getShiftAmountTy(VT);    SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;    switch (VT.getSimpleVT().SimpleTy) {    default: assert(0 && "Unhandled Expand type in BSWAP!"); @@ -2450,7 +2458,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,    default: assert(0 && "Cannot expand this yet!");    case ISD::CTPOP: {      EVT VT = Op.getValueType(); -    EVT ShVT = TLI.getShiftAmountTy(); +    EVT ShVT = TLI.getShiftAmountTy(VT);      unsigned Len = VT.getSizeInBits();      assert(VT.isInteger() && Len <= 128 && Len % 8 == 0 && @@ -2487,7 +2495,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,      Op = DAG.getNode(ISD::SRL, dl, VT,                       DAG.getNode(ISD::MUL, dl, VT, Op, Mask01),                       DAG.getConstant(Len - 8, ShVT)); -     +      return Op;    }    case ISD::CTLZ: { @@ -2501,7 +2509,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,      //      // but see also: http://www.hackersdelight.org/HDcode/nlz.cc      EVT VT = Op.getValueType(); -    EVT ShVT = TLI.getShiftAmountTy(); +    EVT ShVT = TLI.getShiftAmountTy(VT);      unsigned len = VT.getSizeInBits();      for (unsigned i = 0; (1U << i) <= (len / 2); ++i) {        SDValue Tmp3 = DAG.getConstant(1ULL << i, ShVT); @@ -2737,7 +2745,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(); +    EVT ShiftAmountTy = TLI.getShiftAmountTy(VT);      if (VT.isVector())        ShiftAmountTy = VT;      unsigned BitsDiff = VT.getScalarType().getSizeInBits() - @@ -2901,7 +2909,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,        // 1 -> Hi        Tmp1 = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0),                           DAG.getConstant(OpTy.getSizeInBits()/2, -                                         TLI.getShiftAmountTy())); +                    TLI.getShiftAmountTy(Node->getOperand(0).getValueType())));        Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1);      } else {        // 0 -> Lo @@ -3260,7 +3268,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,        assert(LC != RTLIB::UNKNOWN_LIBCALL && "Cannot expand this operation!");        LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS);        RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS); -       +        SDValue Ret = ExpandLibCall(LC, Node, isSigned);        BottomHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, Ret);        TopHalf = DAG.getNode(ISD::SRL, dl, Ret.getValueType(), Ret, @@ -3268,7 +3276,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,        TopHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, TopHalf);      }      if (isSigned) { -      Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1, TLI.getShiftAmountTy()); +      Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1, +                             TLI.getShiftAmountTy(BottomHalf.getValueType()));        Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, Tmp1);        TopHalf = DAG.getSetCC(dl, TLI.getSetCCResultType(VT), TopHalf, Tmp1,                               ISD::SETNE); @@ -3286,7 +3295,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node,      Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Node->getOperand(1));      Tmp2 = DAG.getNode(ISD::SHL, dl, PairTy, Tmp2,                         DAG.getConstant(PairTy.getSizeInBits()/2, -                                       TLI.getShiftAmountTy())); +                                       TLI.getShiftAmountTy(PairTy)));      Results.push_back(DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2));      break;    } @@ -3464,7 +3473,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node,      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, TLI.getShiftAmountTy())); +                          DAG.getConstant(DiffBits, TLI.getShiftAmountTy(NVT)));      Results.push_back(Tmp1);      break;    }  | 
