@@ -17518,65 +17518,46 @@ performVecReduceAddZextCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
17518
17518
SDValue VecOp = ZEXT->getOperand(0);
17519
17519
VecVT = VecOp.getValueType();
17520
17520
bool IsScalableType = VecVT.isScalableVector();
17521
+ SmallVector<SDValue, 2> ResultValues;
17521
17522
17522
- if (TLI.isTypeLegal(VecVT)) {
17523
- if (!IsScalableType &&
17524
- !TLI.useSVEForFixedLengthVectorVT(
17525
- VecVT,
17526
- /*OverrideNEON=*/Subtarget.useSVEForFixedLengthVectors(VecVT)))
17527
- return SDValue();
17528
-
17529
- if (!IsScalableType) {
17530
- EVT ContainerVT = getContainerForFixedLengthVector(DAG, VecVT);
17531
- VecOp = convertToScalableVector(DAG, ContainerVT, VecOp);
17532
- }
17533
- VecVT = VecOp.getValueType();
17534
- EVT RdxVT = N->getValueType(0);
17535
- RdxVT = getPackedSVEVectorVT(RdxVT);
17536
- SDValue Pg = getPredicateForVector(DAG, DL, VecVT);
17537
- SDValue Res = DAG.getNode(
17538
- ISD::INTRINSIC_WO_CHAIN, DL, MVT::i64,
17539
- DAG.getConstant(Intrinsic::aarch64_sve_uaddv, DL, MVT::i64), Pg, VecOp);
17540
- EVT ResVT = MVT::i64;
17541
- if (ResVT != N->getValueType(0))
17542
- Res = DAG.getAnyExtOrTrunc(Res, DL, N->getValueType(0));
17543
- return Res;
17544
- }
17545
-
17546
- SmallVector<SDValue, 4> SplitVals;
17547
- SmallVector<SDValue, 4> PrevVals;
17548
- PrevVals.push_back(VecOp);
17549
- while (true) {
17523
+ if (!TLI.isTypeLegal(VecVT)) {
17524
+ SmallVector<SDValue, 2> PrevValues;
17525
+ PrevValues.push_back(VecOp);
17526
+ while (true) {
17550
17527
17551
- if (!VecVT.isScalableVector() &&
17552
- !PrevVals [0].getValueType().getVectorElementCount().isKnownEven())
17553
- return SDValue();
17528
+ if (!VecVT.isScalableVector() &&
17529
+ !PrevValues [0].getValueType().getVectorElementCount().isKnownEven())
17530
+ return SDValue();
17554
17531
17555
- for (SDValue Vec : PrevVals) {
17556
- SDValue Lo, Hi;
17557
- std::tie(Lo, Hi) = DAG.SplitVector(Vec, DL);
17558
- SplitVals.push_back(Lo);
17559
- SplitVals.push_back(Hi);
17532
+ for (SDValue Vec : PrevValues) {
17533
+ SDValue Lo, Hi;
17534
+ std::tie(Lo, Hi) = DAG.SplitVector(Vec, DL);
17535
+ ResultValues.push_back(Lo);
17536
+ ResultValues.push_back(Hi);
17537
+ }
17538
+ if (TLI.isTypeLegal(ResultValues[0].getValueType()))
17539
+ break;
17540
+ PrevValues.clear();
17541
+ std::copy(ResultValues.begin(), ResultValues.end(),
17542
+ std::back_inserter(PrevValues));
17543
+ ResultValues.clear();
17560
17544
}
17561
- if (TLI.isTypeLegal(SplitVals[0].getValueType()))
17562
- break;
17563
- PrevVals.clear();
17564
- std::copy(SplitVals.begin(), SplitVals.end(), std::back_inserter(PrevVals));
17565
- SplitVals.clear();
17545
+ } else {
17546
+ ResultValues.push_back(VecOp);
17566
17547
}
17567
17548
SDNode *VecRed = N;
17568
17549
EVT ElemType = VecRed->getValueType(0);
17569
- SmallVector<SDValue, 4 > Results;
17550
+ SmallVector<SDValue, 2 > Results;
17570
17551
17571
17552
if (!IsScalableType &&
17572
17553
!TLI.useSVEForFixedLengthVectorVT(
17573
- SplitVals [0].getValueType(),
17554
+ ResultValues [0].getValueType(),
17574
17555
/*OverrideNEON=*/Subtarget.useSVEForFixedLengthVectors(
17575
- SplitVals [0].getValueType())))
17556
+ ResultValues [0].getValueType())))
17576
17557
return SDValue();
17577
17558
17578
- for (unsigned Num = 0; Num < SplitVals .size(); ++Num) {
17579
- SDValue Reg = SplitVals [Num];
17559
+ for (unsigned Num = 0; Num < ResultValues .size(); ++Num) {
17560
+ SDValue Reg = ResultValues [Num];
17580
17561
EVT RdxVT = Reg->getValueType(0);
17581
17562
SDValue Pg = getPredicateForVector(DAG, DL, RdxVT);
17582
17563
if (!IsScalableType) {
@@ -17591,7 +17572,7 @@ performVecReduceAddZextCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
17591
17572
Results.push_back(Res);
17592
17573
}
17593
17574
SDValue ToAdd = Results[0];
17594
- for (unsigned I = 1; I < SplitVals .size(); ++I)
17575
+ for (unsigned I = 1; I < ResultValues .size(); ++I)
17595
17576
ToAdd = DAG.getNode(ISD::ADD, DL, ElemType, ToAdd, Results[I]);
17596
17577
return ToAdd;
17597
17578
}
0 commit comments