Skip to content

Commit 5797ed6

Browse files
authored
[GISel][SDAG] Avoid push_back in loops for some shuffle mask handling. (#119434)
Each call to push_back contains a check to see if the vector needs to grow. Using resize or giving the size to the constructor can reduce the number of checks for growing.
1 parent d78fe84 commit 5797ed6

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6172,9 +6172,8 @@ LegalizerHelper::equalizeVectorShuffleLengths(MachineInstr &MI) {
61726172
if (MaskNumElts < SrcNumElts) {
61736173
// Extend mask to match new destination vector size with
61746174
// undef values.
6175-
SmallVector<int, 16> NewMask(Mask);
6176-
for (unsigned I = MaskNumElts; I < SrcNumElts; ++I)
6177-
NewMask.push_back(-1);
6175+
SmallVector<int, 16> NewMask(SrcNumElts, -1);
6176+
llvm::copy(Mask, NewMask.begin());
61786177

61796178
moreElementsVectorDst(MI, SrcTy, 0);
61806179
MIRBuilder.setInstrAndDebugLoc(MI);
@@ -6254,16 +6253,14 @@ LegalizerHelper::moreElementsVectorShuffle(MachineInstr &MI,
62546253
moreElementsVectorSrc(MI, MoreTy, 2);
62556254

62566255
// Adjust mask based on new input vector length.
6257-
SmallVector<int, 16> NewMask;
6256+
SmallVector<int, 16> NewMask(WidenNumElts, -1);
62586257
for (unsigned I = 0; I != NumElts; ++I) {
62596258
int Idx = Mask[I];
62606259
if (Idx < static_cast<int>(NumElts))
6261-
NewMask.push_back(Idx);
6260+
NewMask[I] = Idx;
62626261
else
6263-
NewMask.push_back(Idx - NumElts + WidenNumElts);
6262+
NewMask[I] = Idx - NumElts + WidenNumElts;
62646263
}
6265-
for (unsigned I = NumElts; I != WidenNumElts; ++I)
6266-
NewMask.push_back(-1);
62676264
moreElementsVectorDst(MI, MoreTy, 0);
62686265
MIRBuilder.setInstrAndDebugLoc(MI);
62696266
MIRBuilder.buildShuffleVector(MI.getOperand(0).getReg(),

llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6421,16 +6421,14 @@ SDValue DAGTypeLegalizer::WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N) {
64216421
SDValue InOp2 = GetWidenedVector(N->getOperand(1));
64226422

64236423
// Adjust mask based on new input vector length.
6424-
SmallVector<int, 16> NewMask;
6424+
SmallVector<int, 16> NewMask(WidenNumElts, -1);
64256425
for (unsigned i = 0; i != NumElts; ++i) {
64266426
int Idx = N->getMaskElt(i);
64276427
if (Idx < (int)NumElts)
6428-
NewMask.push_back(Idx);
6428+
NewMask[i] = Idx;
64296429
else
6430-
NewMask.push_back(Idx - NumElts + WidenNumElts);
6430+
NewMask[i] = Idx - NumElts + WidenNumElts;
64316431
}
6432-
for (unsigned i = NumElts; i != WidenNumElts; ++i)
6433-
NewMask.push_back(-1);
64346432
return DAG.getVectorShuffle(WidenVT, dl, InOp1, InOp2, NewMask);
64356433
}
64366434

@@ -6478,12 +6476,8 @@ SDValue DAGTypeLegalizer::WidenVecRes_VECTOR_REVERSE(SDNode *N) {
64786476

64796477
// Use VECTOR_SHUFFLE to combine new vector from 'ReverseVal' for
64806478
// fixed-vectors.
6481-
SmallVector<int, 16> Mask;
6482-
for (unsigned i = 0; i != VTNumElts; ++i) {
6483-
Mask.push_back(IdxVal + i);
6484-
}
6485-
for (unsigned i = VTNumElts; i != WidenNumElts; ++i)
6486-
Mask.push_back(-1);
6479+
SmallVector<int, 16> Mask(WidenNumElts, -1);
6480+
std::iota(Mask.begin(), Mask.begin() + VTNumElts, IdxVal);
64876481

64886482
return DAG.getVectorShuffle(WidenVT, dl, ReverseVal, DAG.getUNDEF(WidenVT),
64896483
Mask);

0 commit comments

Comments
 (0)