@@ -10596,7 +10596,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10596
10596
inversePermutation(E->ReorderIndices, ReorderMask);
10597
10597
if (!ReorderMask.empty())
10598
10598
reorderScalars(GatheredScalars, ReorderMask);
10599
- auto FindReusedSplat = [&](MutableArrayRef<int> Mask, unsigned InputVF) {
10599
+ auto FindReusedSplat = [&](MutableArrayRef<int> Mask, unsigned InputVF,
10600
+ unsigned I, unsigned SliceSize) {
10600
10601
if (!isSplat(E->Scalars) || none_of(E->Scalars, [](Value *V) {
10601
10602
return isa<UndefValue>(V) && !isa<PoisonValue>(V);
10602
10603
}))
@@ -10619,11 +10620,13 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10619
10620
Idx == 0) ||
10620
10621
(Mask.size() == InputVF &&
10621
10622
ShuffleVectorInst::isIdentityMask(Mask, Mask.size()))) {
10622
- std::iota(Mask.begin(), Mask.end(), 0);
10623
+ std::iota(std::next(Mask.begin(), I * SliceSize),
10624
+ std::next(Mask.begin(), (I + 1) * SliceSize), 0);
10623
10625
} else {
10624
- unsigned I =
10626
+ unsigned IVal =
10625
10627
*find_if_not(Mask, [](int Idx) { return Idx == PoisonMaskElem; });
10626
- std::fill(Mask.begin(), Mask.end(), I);
10628
+ std::fill(std::next(Mask.begin(), I * SliceSize),
10629
+ std::next(Mask.begin(), (I + 1) * SliceSize), IVal);
10627
10630
}
10628
10631
return true;
10629
10632
};
@@ -10872,7 +10875,8 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10872
10875
} else if (Vec1) {
10873
10876
IsUsedInExpr &= FindReusedSplat(
10874
10877
ExtractMask,
10875
- cast<FixedVectorType>(Vec1->getType())->getNumElements());
10878
+ cast<FixedVectorType>(Vec1->getType())->getNumElements(), 0,
10879
+ ExtractMask.size());
10876
10880
ShuffleBuilder.add(Vec1, ExtractMask, /*ForExtracts=*/true);
10877
10881
IsNonPoisoned &= isGuaranteedNotToBePoison(Vec1);
10878
10882
} else {
@@ -10898,7 +10902,7 @@ ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
10898
10902
copy(SubMask, std::next(VecMask.begin(), I * SliceSize));
10899
10903
if (TEs.size() == 1) {
10900
10904
IsUsedInExpr &=
10901
- FindReusedSplat(VecMask, TEs.front()->getVectorFactor());
10905
+ FindReusedSplat(VecMask, TEs.front()->getVectorFactor(), I, SliceSize );
10902
10906
ShuffleBuilder.add(*TEs.front(), VecMask);
10903
10907
if (TEs.front()->VectorizedValue)
10904
10908
IsNonPoisoned &=
0 commit comments