diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/CodeGen/SelectionDAGNodes.h | 4 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 21 | 
3 files changed, 32 insertions, 13 deletions
| diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index f8248b84533..41407f15654 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -74,6 +74,10 @@ namespace ISD {    /// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low    /// element is not an undef.    bool isScalarToVector(const SDNode *N); + +  /// allOperandsUndef - Return true if the node has at least one operand +  /// and all operands of the specified node are ISD::UNDEF. +  bool allOperandsUndef(const SDNode *N);  }  // end llvm:ISD namespace  //===----------------------------------------------------------------------===// diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 1e87d5184f2..0e5ecd5d2dc 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -7598,6 +7598,11 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {    unsigned NumInScalars = N->getNumOperands();    DebugLoc dl = N->getDebugLoc();    EVT VT = N->getValueType(0); + +  // A vector built entirely of undefs is undef. +  if (ISD::allOperandsUndef(N)) +    return DAG.getUNDEF(VT); +    // Check to see if this is a BUILD_VECTOR of a bunch of values    // which come from any_extend or zero_extend nodes. If so, we can create    // a new BUILD_VECTOR using bit-casts which may enable other BUILD_VECTOR @@ -7605,12 +7610,11 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {    // using shuffles.    EVT SourceType = MVT::Other;    bool AllAnyExt = true; -  bool AllUndef = true; +    for (unsigned i = 0; i != NumInScalars; ++i) {      SDValue In = N->getOperand(i);      // Ignore undef inputs.      if (In.getOpcode() == ISD::UNDEF) continue; -    AllUndef = false;      bool AnyExt  = In.getOpcode() == ISD::ANY_EXTEND;      bool ZeroExt = In.getOpcode() == ISD::ZERO_EXTEND; @@ -7638,9 +7642,6 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {      AllAnyExt &= AnyExt;    } -  if (AllUndef) -    return DAG.getUNDEF(VT); -    // In order to have valid types, all of the inputs must be extended from the    // same source type and all of the inputs must be any or zero extend.    // Scalar sizes must be a power of two. @@ -7817,14 +7818,7 @@ SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) {      return N->getOperand(0);    // Check if all of the operands are undefs. -  bool AllUndef = true; -  for (unsigned i = 0; i < N->getNumOperands(); ++i) -    if (N->getOperand(i).getOpcode() != ISD::UNDEF) { -      AllUndef = false; -      break; -    } - -  if (AllUndef) +  if (ISD::allOperandsUndef(N))      return DAG.getUNDEF(N->getValueType(0));    return SDValue(); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index a8dce2176fb..3947648e6a7 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -219,6 +219,22 @@ bool ISD::isScalarToVector(const SDNode *N) {    return true;  } +/// allOperandsUndef - Return true if the node has at least one operand +/// and all operands of the specified node are ISD::UNDEF. +bool ISD::allOperandsUndef(const SDNode *N) { +  // Return false if the node has no operands. +  // This is "logically inconsistent" with the definition of "all" but +  // is probably the desired behavior. +  if (N->getNumOperands() == 0) +    return false; + +  for (unsigned i = 0, e = N->getNumOperands(); i != e ; ++i) +    if (N->getOperand(i).getOpcode() != ISD::UNDEF) +      return false; + +  return true; +} +  /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)  /// when given the operation for (X op Y).  ISD::CondCode ISD::getSetCCSwappedOperands(ISD::CondCode Operation) { @@ -2674,6 +2690,11 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,      if (N1 == N2) return N1;      break;    case ISD::CONCAT_VECTORS: +    // Concat of UNDEFs is UNDEF. +    if (N1.getOpcode() == ISD::UNDEF && +        N2.getOpcode() == ISD::UNDEF) +      return getUNDEF(VT); +      // A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to      // one big BUILD_VECTOR.      if (N1.getOpcode() == ISD::BUILD_VECTOR && | 

