Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2159,6 +2159,18 @@ DAG.getNode(ISD::ADD, SDLoc(N1), VT, N01, N11)); } + // fold (add (umax X, C), -C) --> (usubsat X, C) + if (N0.getOpcode() == ISD::UMAX && hasOperation(ISD::USUBSAT, VT)) { + auto MatchUSUBSAT = [](ConstantSDNode *Max, ConstantSDNode *Op) { + return (!Max && !Op) || + (Max && Op && Max->getAPIntValue() == (-Op->getAPIntValue())); + }; + if (ISD::matchBinaryPredicate(N0.getOperand(1), N1, MatchUSUBSAT, + /*AllowUndefs*/ true)) + return DAG.getNode(ISD::USUBSAT, DL, VT, N0.getOperand(0), + N0.getOperand(1)); + } + if (SDValue V = foldAddSubBoolOfMaskedVal(N, DAG)) return V; Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -41383,40 +41383,6 @@ PMADDBuilder); } -// Try to turn (add (umax X, C), -C) into (psubus X, C) -static SDValue combineAddToSUBUS(SDNode *N, SelectionDAG &DAG, - const X86Subtarget &Subtarget) { - if (!Subtarget.hasSSE2()) - return SDValue(); - - EVT VT = N->getValueType(0); - - // psubus is available in SSE2 for i8 and i16 vectors. - if (!VT.isVector() || VT.getVectorNumElements() < 2 || - !isPowerOf2_32(VT.getVectorNumElements()) || - !(VT.getVectorElementType() == MVT::i8 || - VT.getVectorElementType() == MVT::i16)) - return SDValue(); - - SDValue Op0 = N->getOperand(0); - SDValue Op1 = N->getOperand(1); - if (Op0.getOpcode() != ISD::UMAX) - return SDValue(); - - // The add should have a constant that is the negative of the max. - auto MatchUSUBSAT = [](ConstantSDNode *Max, ConstantSDNode *Op) { - return (!Max && !Op) || - (Max && Op && Max->getAPIntValue() == (-Op->getAPIntValue())); - }; - if (!ISD::matchBinaryPredicate(Op0.getOperand(1), Op1, MatchUSUBSAT, - /*AllowUndefs*/ true)) - return SDValue(); - - SDLoc DL(N); - return DAG.getNode(ISD::USUBSAT, DL, VT, Op0.getOperand(0), - Op0.getOperand(1)); -} - // Attempt to turn this pattern into PMADDWD. // (mul (add (zext (build_vector)), (zext (build_vector))), // (add (zext (build_vector)), (zext (build_vector))) @@ -41572,9 +41538,6 @@ if (SDValue V = combineIncDecVector(N, DAG)) return V; - if (SDValue V = combineAddToSUBUS(N, DAG, Subtarget)) - return V; - return combineAddOrSubToADCOrSBB(N, DAG); }