diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index bf85212e6a92ea..8607b501753590 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5253,24 +5253,25 @@ SDValue DAGCombiner::visitABD(SDNode *N) { !DAG.isConstantIntBuildVectorOrConstantInt(N1)) return DAG.getNode(Opcode, DL, N->getVTList(), N1, N0); - if (VT.isVector()) { + if (VT.isVector()) if (SDValue FoldedVOp = SimplifyVBinOp(N, DL)) return FoldedVOp; - // fold (abds x, 0) -> abs x - // fold (abdu x, 0) -> x - if (ISD::isConstantSplatVectorAllZeros(N1.getNode())) { - if (Opcode == ISD::ABDS) - return DAG.getNode(ISD::ABS, DL, VT, N0); - if (Opcode == ISD::ABDU) - return N0; - } - } - // fold (abd x, undef) -> 0 if (N0.isUndef() || N1.isUndef()) return DAG.getConstant(0, DL, VT); + SDValue X; + + // fold (abds x, 0) -> abs x + if (sd_match(N, m_c_BinOp(ISD::ABDS, m_Value(X), m_Zero())) && + (!LegalOperations || hasOperation(ISD::ABS, VT))) + return DAG.getNode(ISD::ABS, DL, VT, X); + + // fold (abdu x, 0) -> x + if (sd_match(N, m_c_BinOp(ISD::ABDU, m_Value(X), m_Zero()))) + return X; + // fold (abds x, y) -> (abdu x, y) iff both args are known positive if (Opcode == ISD::ABDS && hasOperation(ISD::ABDU, VT) && DAG.SignBitIsZero(N0) && DAG.SignBitIsZero(N1))