diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 41 | 
1 files changed, 20 insertions, 21 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 8959ac92c1f..9c67c3e948c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3190,7 +3190,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {    if (!LegalOperations && N1.getOpcode() == ISD::SRL && N1.hasOneUse()) {      SDValue ShAmt = N1.getOperand(1);      ConstantSDNode *ShAmtC = isConstOrConstSplat(ShAmt); -    if (ShAmtC && ShAmtC->getZExtValue() == N1.getScalarValueSizeInBits() - 1) { +    if (ShAmtC && +        ShAmtC->getAPIntValue() == (N1.getScalarValueSizeInBits() - 1)) {        SDValue SRA = DAG.getNode(ISD::SRA, DL, VT, N1.getOperand(0), ShAmt);        return DAG.getNode(ISD::ADD, DL, VT, N0, SRA);      } @@ -7492,6 +7493,7 @@ SDValue DAGCombiner::visitSRA(SDNode *N) {        return DAG.getNode(ISD::SRA, SDLoc(N), VT, N0, NewOp1);    } +  // fold (sra (trunc (sra x, c1)), c2) -> (trunc (sra x, c1 + c2))    // fold (sra (trunc (srl x, c1)), c2) -> (trunc (sra x, c1 + c2))    //      if c1 is equal to the number of bits the trunc removes    // TODO - support non-uniform vector shift amounts. @@ -7499,20 +7501,17 @@ SDValue DAGCombiner::visitSRA(SDNode *N) {        (N0.getOperand(0).getOpcode() == ISD::SRL ||         N0.getOperand(0).getOpcode() == ISD::SRA) &&        N0.getOperand(0).hasOneUse() && -      N0.getOperand(0).getOperand(1).hasOneUse() && -      N1C) { +      N0.getOperand(0).getOperand(1).hasOneUse() && N1C) {      SDValue N0Op0 = N0.getOperand(0);      if (ConstantSDNode *LargeShift = isConstOrConstSplat(N0Op0.getOperand(1))) { -      unsigned LargeShiftVal = LargeShift->getZExtValue();        EVT LargeVT = N0Op0.getValueType(); - -      if (LargeVT.getScalarSizeInBits() - OpSizeInBits == LargeShiftVal) { +      unsigned TruncBits = LargeVT.getScalarSizeInBits() - OpSizeInBits; +      if (LargeShift->getAPIntValue() == TruncBits) {          SDLoc DL(N); -        SDValue Amt = -          DAG.getConstant(LargeShiftVal + N1C->getZExtValue(), DL, -                          getShiftAmountTy(N0Op0.getOperand(0).getValueType())); -        SDValue SRA = DAG.getNode(ISD::SRA, DL, LargeVT, -                                  N0Op0.getOperand(0), Amt); +        SDValue Amt = DAG.getConstant(N1C->getZExtValue() + TruncBits, DL, +                                      getShiftAmountTy(LargeVT)); +        SDValue SRA = +            DAG.getNode(ISD::SRA, DL, LargeVT, N0Op0.getOperand(0), Amt);          return DAG.getNode(ISD::TRUNCATE, DL, VT, SRA);        }      } @@ -7632,7 +7631,7 @@ SDValue DAGCombiner::visitSRL(SDNode *N) {      // Shifting in all undef bits?      EVT SmallVT = N0.getOperand(0).getValueType();      unsigned BitSize = SmallVT.getScalarSizeInBits(); -    if (N1C->getZExtValue() >= BitSize) +    if (N1C->getAPIntValue().uge(BitSize))        return DAG.getUNDEF(VT);      if (!LegalTypes || TLI.isTypeDesirableForOp(ISD::SRL, SmallVT)) { @@ -7653,7 +7652,7 @@ SDValue DAGCombiner::visitSRL(SDNode *N) {    // fold (srl (sra X, Y), 31) -> (srl X, 31).  This srl only looks at the sign    // bit, which is unmodified by sra. -  if (N1C && N1C->getZExtValue() + 1 == OpSizeInBits) { +  if (N1C && N1C->getAPIntValue() == (OpSizeInBits - 1)) {      if (N0.getOpcode() == ISD::SRA)        return DAG.getNode(ISD::SRL, SDLoc(N), VT, N0.getOperand(0), N1);    } @@ -10370,14 +10369,14 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {    // fold (sext_in_reg (srl X, 23), i8) -> (sra X, 23) iff possible.    // We already fold "(sext_in_reg (srl X, 25), i8) -> srl X, 25" above.    if (N0.getOpcode() == ISD::SRL) { -    if (ConstantSDNode *ShAmt = dyn_cast<ConstantSDNode>(N0.getOperand(1))) -      if (ShAmt->getZExtValue()+EVTBits <= VTBits) { +    if (auto *ShAmt = dyn_cast<ConstantSDNode>(N0.getOperand(1))) +      if (ShAmt->getAPIntValue().ule(VTBits - EVTBits)) {          // We can turn this into an SRA iff the input to the SRL is already sign          // extended enough.          unsigned InSignBits = DAG.ComputeNumSignBits(N0.getOperand(0)); -        if (VTBits-(ShAmt->getZExtValue()+EVTBits) < InSignBits) -          return DAG.getNode(ISD::SRA, SDLoc(N), VT, -                             N0.getOperand(0), N0.getOperand(1)); +        if (((VTBits - EVTBits) - ShAmt->getZExtValue()) < InSignBits) +          return DAG.getNode(ISD::SRA, SDLoc(N), VT, N0.getOperand(0), +                             N0.getOperand(1));        }    } @@ -17869,14 +17868,14 @@ SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) {          return SDValue();      } -    unsigned IdentityIndex = i * PartNumElem; -    ConstantSDNode *CS = dyn_cast<ConstantSDNode>(Op.getOperand(1)); +    auto *CS = dyn_cast<ConstantSDNode>(Op.getOperand(1));      // The extract index must be constant.      if (!CS)        return SDValue();      // Check that we are reading from the identity index. -    if (CS->getZExtValue() != IdentityIndex) +    unsigned IdentityIndex = i * PartNumElem; +    if (CS->getAPIntValue() != IdentityIndex)        return SDValue();    } | 

