Skip to content

Commit 5731cf1

Browse files
Dinar TemirbulatovDinar Temirbulatov
authored andcommitted
Resolved remarks.
1 parent 251df1b commit 5731cf1

File tree

1 file changed

+25
-32
lines changed

1 file changed

+25
-32
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
#include <cctype>
9696
#include <cstdint>
9797
#include <cstdlib>
98+
#include <deque>
9899
#include <iterator>
99100
#include <limits>
100101
#include <optional>
@@ -17503,6 +17504,8 @@ static SDValue performVecReduceAddCombineWithUADDLP(SDNode *N,
1750317504
return DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i32, UADDLP);
1750417505
}
1750517506

17507+
// Turn [sign|zero]_extend(vecreduce_add()) into SVE's SADDV|UADDV
17508+
// instructions.
1750617509
static SDValue
1750717510
performVecReduceAddExtCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
1750817511
const AArch64TargetLowering &TLI) {
@@ -17513,53 +17516,43 @@ performVecReduceAddExtCombine(SDNode *N, TargetLowering::DAGCombinerInfo &DCI,
1751317516

1751417517
SelectionDAG &DAG = DCI.DAG;
1751517518
auto &Subtarget = DAG.getSubtarget<AArch64Subtarget>();
17516-
SDNode *ZEXT = N->getOperand(0).getNode();
17517-
EVT VecVT = ZEXT->getOperand(0).getValueType();
17519+
SDValue VecOp = N->getOperand(0).getOperand(0);
1751817520
SDLoc DL(N);
1751917521

17520-
SDValue VecOp = ZEXT->getOperand(0);
17521-
VecVT = VecOp.getValueType();
17522-
bool IsScalableType = VecVT.isScalableVector();
17523-
SmallVector<SDValue, 2> ResultValues;
17522+
bool IsScalableType = VecOp.getValueType().isScalableVector();
17523+
std::deque<SDValue> ResultValues;
17524+
ResultValues.push_back(VecOp);
1752417525

17525-
if (!TLI.isTypeLegal(VecVT)) {
17526-
SmallVector<SDValue, 2> PrevValues;
17527-
PrevValues.push_back(VecOp);
17526+
// Split the input vectors if not legal.
17527+
while (!TLI.isTypeLegal(ResultValues.front().getValueType())) {
17528+
if (!ResultValues.front()
17529+
.getValueType()
17530+
.getVectorElementCount()
17531+
.isKnownEven())
17532+
return SDValue();
17533+
EVT CurVT = ResultValues.front().getValueType();
1752817534
while (true) {
17529-
17530-
if (!VecVT.isScalableVector() &&
17531-
!PrevValues[0].getValueType().getVectorElementCount().isKnownEven())
17532-
return SDValue();
17533-
17534-
for (SDValue Vec : PrevValues) {
17535-
SDValue Lo, Hi;
17536-
std::tie(Lo, Hi) = DAG.SplitVector(Vec, DL);
17537-
ResultValues.push_back(Lo);
17538-
ResultValues.push_back(Hi);
17539-
}
17540-
if (TLI.isTypeLegal(ResultValues[0].getValueType()))
17535+
SDValue Vec = ResultValues.front();
17536+
if (Vec.getValueType() != CurVT)
1754117537
break;
17542-
PrevValues.clear();
17543-
std::copy(ResultValues.begin(), ResultValues.end(),
17544-
std::back_inserter(PrevValues));
17545-
ResultValues.clear();
17538+
ResultValues.pop_front();
17539+
SDValue Lo, Hi;
17540+
std::tie(Lo, Hi) = DAG.SplitVector(Vec, DL);
17541+
ResultValues.push_back(Lo);
17542+
ResultValues.push_back(Hi);
1754617543
}
17547-
} else {
17548-
ResultValues.push_back(VecOp);
1754917544
}
17550-
SDNode *VecRed = N;
17551-
EVT ElemType = VecRed->getValueType(0);
17552-
SmallVector<SDValue, 2> Results;
1755317545

17546+
EVT ElemType = N->getValueType(0);
17547+
SmallVector<SDValue, 2> Results;
1755417548
if (!IsScalableType &&
1755517549
!TLI.useSVEForFixedLengthVectorVT(
1755617550
ResultValues[0].getValueType(),
1755717551
/*OverrideNEON=*/Subtarget.useSVEForFixedLengthVectors(
1755817552
ResultValues[0].getValueType())))
1755917553
return SDValue();
1756017554

17561-
for (unsigned Num = 0; Num < ResultValues.size(); ++Num) {
17562-
SDValue Reg = ResultValues[Num];
17555+
for (SDValue Reg : ResultValues) {
1756317556
EVT RdxVT = Reg->getValueType(0);
1756417557
SDValue Pg = getPredicateForVector(DAG, DL, RdxVT);
1756517558
if (!IsScalableType) {

0 commit comments

Comments
 (0)