diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 | 
2 files changed, 12 insertions, 5 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 31589fe586b..5510d9a9dab 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -7816,9 +7816,8 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {    SDValue N2 = N->getOperand(2);    SDLoc DL(N); -  // fold (vselect C, X, X) -> X -  if (N1 == N2) -    return N1; +  if (SDValue V = DAG.simplifySelect(N0, N1, N2)) +    return V;    // Canonicalize integer abs.    // vselect (setg[te] X,  0),  X, -X -> diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 1a73a01cc49..d98c609ab3a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5078,6 +5078,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,      break;    }    case ISD::SELECT: +  case ISD::VSELECT:      if (SDValue V = simplifySelect(N1, N2, N3))        return V;      break; @@ -6790,11 +6791,18 @@ SDValue SelectionDAG::simplifySelect(SDValue Cond, SDValue T, SDValue F) {    if (F.isUndef())      return T; -  // fold (select true, T, F) -> T -  // fold (select false, T, F) -> F +  // select true, T, F --> T +  // select false, T, F --> F    if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))      return CondC->isNullValue() ? F : T; +  // TODO: This should simplify VSELECT with constant condition using something +  // like this (but check boolean contents to be complete?): +  //  if (ISD::isBuildVectorAllOnes(Cond.getNode())) +  //    return T; +  //  if (ISD::isBuildVectorAllZeros(Cond.getNode())) +  //    return F; +    // select ?, T, T --> T    if (T == F)      return T; | 

