@@ -9487,6 +9487,15 @@ class BaseShuffleAnalysis {
94879487 return Builder.createShuffleVector(V1, NewMask);
94889488 return Builder.createIdentity(V1);
94899489 }
9490+
9491+ /// Transforms mask \p CommonMask per given \p Mask to make proper set after
9492+ /// shuffle emission.
9493+ static void transformMaskAfterShuffle(MutableArrayRef<int> CommonMask,
9494+ ArrayRef<int> Mask) {
9495+ for (unsigned I : seq<unsigned>(CommonMask.size()))
9496+ if (Mask[I] != PoisonMaskElem)
9497+ CommonMask[I] = I;
9498+ }
94909499};
94919500} // namespace
94929501
@@ -10317,14 +10326,6 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
1031710326 }
1031810327 return Cost;
1031910328 }
10320- /// Transforms mask \p CommonMask per given \p Mask to make proper set after
10321- /// shuffle emission.
10322- static void transformMaskAfterShuffle(MutableArrayRef<int> CommonMask,
10323- ArrayRef<int> Mask) {
10324- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
10325- if (Mask[Idx] != PoisonMaskElem)
10326- CommonMask[Idx] = Idx;
10327- }
1032810329 /// Adds the cost of reshuffling \p E1 and \p E2 (if present), using given
1032910330 /// mask \p Mask, register number \p Part, that includes \p SliceSize
1033010331 /// elements.
@@ -10947,9 +10948,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
1094710948 Cost += createShuffle(Vec, InVectors.back(), CommonMask);
1094810949 else
1094910950 Cost += createShuffle(Vec, nullptr, CommonMask);
10950- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
10951- if (CommonMask[Idx] != PoisonMaskElem)
10952- CommonMask[Idx] = Idx;
10951+ transformMaskAfterShuffle(CommonMask, CommonMask);
1095310952 assert(VF > 0 &&
1095410953 "Expected vector length for the final value before action.");
1095510954 Value *V = cast<Value *>(Vec);
@@ -10962,9 +10961,7 @@ class BoUpSLP::ShuffleCostEstimator : public BaseShuffleAnalysis {
1096210961 Cost += createShuffle(Vec, InVectors.back(), CommonMask);
1096310962 else
1096410963 Cost += createShuffle(Vec, nullptr, CommonMask);
10965- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
10966- if (CommonMask[Idx] != PoisonMaskElem)
10967- CommonMask[Idx] = Idx;
10964+ transformMaskAfterShuffle(CommonMask, CommonMask);
1096810965 // Add subvectors permutation cost.
1096910966 if (!SubVectorsMask.empty()) {
1097010967 assert(SubVectorsMask.size() <= CommonMask.size() &&
@@ -14214,15 +14211,6 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
1421414211 ShuffleBuilder);
1421514212 }
1421614213
14217- /// Transforms mask \p CommonMask per given \p Mask to make proper set after
14218- /// shuffle emission.
14219- static void transformMaskAfterShuffle(MutableArrayRef<int> CommonMask,
14220- ArrayRef<int> Mask) {
14221- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
14222- if (Mask[Idx] != PoisonMaskElem)
14223- CommonMask[Idx] = Idx;
14224- }
14225-
1422614214 /// Cast value \p V to the vector type with the same number of elements, but
1422714215 /// the base type \p ScalarTy.
1422814216 Value *castToScalarTyElem(Value *V,
@@ -14555,9 +14543,7 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
1455514543 } else {
1455614544 Vec = createShuffle(Vec, nullptr, CommonMask);
1455714545 }
14558- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
14559- if (CommonMask[Idx] != PoisonMaskElem)
14560- CommonMask[Idx] = Idx;
14546+ transformMaskAfterShuffle(CommonMask, CommonMask);
1456114547 assert(VF > 0 &&
1456214548 "Expected vector length for the final value before action.");
1456314549 unsigned VecVF = cast<FixedVectorType>(Vec->getType())->getNumElements();
@@ -14577,9 +14563,7 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
1457714563 } else {
1457814564 Vec = createShuffle(Vec, nullptr, CommonMask);
1457914565 }
14580- for (unsigned Idx = 0, Sz = CommonMask.size(); Idx < Sz; ++Idx)
14581- if (CommonMask[Idx] != PoisonMaskElem)
14582- CommonMask[Idx] = Idx;
14566+ transformMaskAfterShuffle(CommonMask, CommonMask);
1458314567 auto CreateSubVectors = [&](Value *Vec,
1458414568 SmallVectorImpl<int> &CommonMask) {
1458514569 for (auto [E, Idx] : SubVectors) {
@@ -14620,10 +14604,7 @@ class BoUpSLP::ShuffleInstructionBuilder final : public BaseShuffleAnalysis {
1462014604 Value *InsertVec =
1462114605 CreateSubVectors(PoisonValue::get(Vec->getType()), CommonMask);
1462214606 Vec = createShuffle(InsertVec, Vec, SVMask);
14623- for (unsigned I : seq<unsigned>(CommonMask.size())) {
14624- if (SVMask[I] != PoisonMaskElem)
14625- CommonMask[I] = I;
14626- }
14607+ transformMaskAfterShuffle(CommonMask, SVMask);
1462714608 }
1462814609 InVectors.front() = Vec;
1462914610 }
0 commit comments