@@ -18052,6 +18052,15 @@ static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
1805218052// v16i32 abs(
1805318053// v16i32 sub(
1805418054// v16i32 [sign|zero]_extend(v16i8 a), v16i32 [sign|zero]_extend(v16i8 b))))
18055+ //
18056+ // or
18057+ //
18058+ // i32 vecreduce_add(
18059+ // v16i32 zext(
18060+ // v16i16 abs(
18061+ // v16i16 sub(
18062+ // v16i16 [sign|zero]_extend(v16i8 a), v16i16 [sign|zero]_extend(v16i8 b))))
18063+ //
1805518064// =================>
1805618065// i32 vecreduce_add(
1805718066// v4i32 UADDLP(
@@ -18067,23 +18076,35 @@ static SDValue performVecReduceAddCombineWithUADDLP(SDNode *N,
1806718076 return SDValue();
1806818077
1806918078 SDValue VecReduceOp0 = N->getOperand(0);
18079+ bool SawTrailingZext = false;
18080+ // Look through an optional post-ABS ZEXT from v16i16 -> v16i32.
18081+ if (VecReduceOp0.getOpcode() == ISD::ZERO_EXTEND &&
18082+ VecReduceOp0->getValueType(0) == MVT::v16i32 &&
18083+ VecReduceOp0->getOperand(0)->getOpcode() == ISD::ABS &&
18084+ VecReduceOp0->getOperand(0)->getValueType(0) == MVT::v16i16) {
18085+ SawTrailingZext = true;
18086+ VecReduceOp0 = VecReduceOp0.getOperand(0);
18087+ }
18088+
18089+ // Peel off an optional post-ABS extend (v16i16 -> v16i32).
18090+ MVT AbsInputVT = SawTrailingZext ? MVT::v16i16 : MVT::v16i32;
18091+ // Assumed v16i16 or v16i32 abs input
1807018092 unsigned Opcode = VecReduceOp0.getOpcode();
18071- // Assumed v16i32 abs
18072- if (Opcode != ISD::ABS || VecReduceOp0->getValueType(0) != MVT::v16i32)
18093+ if (Opcode != ISD::ABS || VecReduceOp0->getValueType(0) != AbsInputVT)
1807318094 return SDValue();
1807418095
1807518096 SDValue ABS = VecReduceOp0;
18076- // Assumed v16i32 sub
18097+ // Assumed v16i16 or v16i32 sub
1807718098 if (ABS->getOperand(0)->getOpcode() != ISD::SUB ||
18078- ABS->getOperand(0)->getValueType(0) != MVT::v16i32 )
18099+ ABS->getOperand(0)->getValueType(0) != AbsInputVT )
1807918100 return SDValue();
1808018101
1808118102 SDValue SUB = ABS->getOperand(0);
1808218103 unsigned Opcode0 = SUB->getOperand(0).getOpcode();
1808318104 unsigned Opcode1 = SUB->getOperand(1).getOpcode();
18084- // Assumed v16i32 type
18085- if (SUB->getOperand(0)->getValueType(0) != MVT::v16i32 ||
18086- SUB->getOperand(1)->getValueType(0) != MVT::v16i32 )
18105+ // Assumed v16i16 or v16i32 type
18106+ if (SUB->getOperand(0)->getValueType(0) != AbsInputVT ||
18107+ SUB->getOperand(1)->getValueType(0) != AbsInputVT )
1808718108 return SDValue();
1808818109
1808918110 // Assumed zext or sext
0 commit comments