@@ -57886,6 +57886,7 @@ static SDValue pushAddIntoCmovOfConsts(SDNode *N, const SDLoc &DL,
5788657886static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5788757887 TargetLowering::DAGCombinerInfo &DCI,
5788857888 const X86Subtarget &Subtarget) {
57889+ using namespace SDPatternMatch;
5788957890 EVT VT = N->getValueType(0);
5789057891 SDValue Op0 = N->getOperand(0);
5789157892 SDValue Op1 = N->getOperand(1);
@@ -57925,26 +57926,20 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
5792557926 // generic DAG combine without a legal type check, but adding this there
5792657927 // caused regressions.
5792757928 if (VT.isVector()) {
57928- const TargetLowering &TLI = DAG.getTargetLoweringInfo();
57929- if (Op0.getOpcode() == ISD::ZERO_EXTEND &&
57930- Op0.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
57931- TLI.isTypeLegal(Op0.getOperand(0).getValueType())) {
57932- SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op0.getOperand(0));
57933- return DAG.getNode(ISD::SUB, DL, VT, Op1, SExt);
57934- }
57935-
57936- if (Op1.getOpcode() == ISD::ZERO_EXTEND &&
57937- Op1.getOperand(0).getValueType().getVectorElementType() == MVT::i1 &&
57938- TLI.isTypeLegal(Op1.getOperand(0).getValueType())) {
57939- SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, Op1.getOperand(0));
57940- return DAG.getNode(ISD::SUB, DL, VT, Op0, SExt);
57929+ SDValue X, Y;
57930+ EVT BoolVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
57931+ VT.getVectorElementCount());
57932+ if (DAG.getTargetLoweringInfo().isTypeLegal(BoolVT) &&
57933+ sd_match(N, m_Add(m_ZExt(m_AllOf(m_SpecificVT(BoolVT), m_Value(X))),
57934+ m_Value(Y)))) {
57935+ SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND, DL, VT, X);
57936+ return DAG.getNode(ISD::SUB, DL, VT, Y, SExt);
5794157937 }
5794257938 }
5794357939
5794457940 // Peephole for 512-bit VPDPBSSD on non-VLX targets.
5794557941 // TODO: Should this be part of matchPMADDWD/matchPMADDWD_2?
5794657942 if (Subtarget.hasVNNI() && Subtarget.useAVX512Regs() && VT == MVT::v16i32) {
57947- using namespace SDPatternMatch;
5794857943 SDValue Accum, Lo0, Lo1, Hi0, Hi1;
5794957944 if (sd_match(N, m_Add(m_Value(Accum),
5795057945 m_Node(ISD::CONCAT_VECTORS,
0 commit comments