@@ -57886,6 +57886,7 @@ static SDValue pushAddIntoCmovOfConsts(SDNode *N, const SDLoc &DL,
57886
57886
static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
57887
57887
TargetLowering::DAGCombinerInfo &DCI,
57888
57888
const X86Subtarget &Subtarget) {
57889
+ using namespace SDPatternMatch;
57889
57890
EVT VT = N->getValueType(0);
57890
57891
SDValue Op0 = N->getOperand(0);
57891
57892
SDValue Op1 = N->getOperand(1);
@@ -57925,26 +57926,20 @@ static SDValue combineAdd(SDNode *N, SelectionDAG &DAG,
57925
57926
// generic DAG combine without a legal type check, but adding this there
57926
57927
// caused regressions.
57927
57928
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);
57941
57937
}
57942
57938
}
57943
57939
57944
57940
// Peephole for 512-bit VPDPBSSD on non-VLX targets.
57945
57941
// TODO: Should this be part of matchPMADDWD/matchPMADDWD_2?
57946
57942
if (Subtarget.hasVNNI() && Subtarget.useAVX512Regs() && VT == MVT::v16i32) {
57947
- using namespace SDPatternMatch;
57948
57943
SDValue Accum, Lo0, Lo1, Hi0, Hi1;
57949
57944
if (sd_match(N, m_Add(m_Value(Accum),
57950
57945
m_Node(ISD::CONCAT_VECTORS,
0 commit comments