@@ -4780,8 +4780,10 @@ static Align computeCommonAlignment(ArrayRef<Value *> VL) {
47804780
47814781/// Check if \p Order represents reverse order.
47824782static bool isReverseOrder(ArrayRef<unsigned> Order) {
4783+ assert(!Order.empty() &&
4784+ "Order is empty. Please check it before using isReverseOrder.");
47834785 unsigned Sz = Order.size();
4784- return !Order.empty() && all_of(enumerate(Order), [&](const auto &Pair) {
4786+ return all_of(enumerate(Order), [&](const auto &Pair) {
47854787 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
47864788 });
47874789}
@@ -9837,7 +9839,7 @@ void BoUpSLP::transformNodes() {
98379839 Align CommonAlignment = computeCommonAlignment<LoadInst>(E.Scalars);
98389840 // Check if profitable to represent consecutive load + reverse as strided
98399841 // load with stride -1.
9840- if (isReverseOrder(E.ReorderIndices) &&
9842+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
98419843 TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
98429844 SmallVector<int> Mask;
98439845 inversePermutation(E.ReorderIndices, Mask);
@@ -9864,7 +9866,7 @@ void BoUpSLP::transformNodes() {
98649866 Align CommonAlignment = computeCommonAlignment<StoreInst>(E.Scalars);
98659867 // Check if profitable to represent consecutive load + reverse as strided
98669868 // load with stride -1.
9867- if (isReverseOrder(E.ReorderIndices) &&
9869+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
98689870 TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
98699871 SmallVector<int> Mask;
98709872 inversePermutation(E.ReorderIndices, Mask);
@@ -10990,7 +10992,6 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1099010992 unsigned EntryVF = E->getVectorFactor();
1099110993 auto *FinalVecTy = getWidenedType(ScalarTy, EntryVF);
1099210994
10993- bool NeedToShuffleReuses = !E->ReuseShuffleIndices.empty();
1099410995 if (E->isGather()) {
1099510996 if (allConstant(VL))
1099610997 return 0;
@@ -11003,9 +11004,8 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1100311004 }
1100411005 InstructionCost CommonCost = 0;
1100511006 SmallVector<int> Mask;
11006- bool IsReverseOrder = isReverseOrder(E->ReorderIndices);
11007- if (!E->ReorderIndices.empty() &&
11008- (E->State != TreeEntry::StridedVectorize || !IsReverseOrder)) {
11007+ if (!E->ReorderIndices.empty() && (E->State != TreeEntry::StridedVectorize ||
11008+ !isReverseOrder(E->ReorderIndices))) {
1100911009 SmallVector<int> NewMask;
1101011010 if (E->getOpcode() == Instruction::Store) {
1101111011 // For stores the order is actually a mask.
@@ -11016,7 +11016,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1101611016 }
1101711017 ::addMask(Mask, NewMask);
1101811018 }
11019- if (NeedToShuffleReuses )
11019+ if (!E->ReuseShuffleIndices.empty() )
1102011020 ::addMask(Mask, E->ReuseShuffleIndices);
1102111021 if (!Mask.empty() && !ShuffleVectorInst::isIdentityMask(Mask, Mask.size()))
1102211022 CommonCost =
@@ -15064,7 +15064,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1506415064 return Vec;
1506515065 }
1506615066
15067- bool IsReverseOrder = isReverseOrder(E->ReorderIndices);
15067+ bool IsReverseOrder =
15068+ !E->ReorderIndices.empty() && isReverseOrder(E->ReorderIndices);
1506815069 auto FinalShuffle = [&](Value *V, const TreeEntry *E) {
1506915070 ShuffleInstructionBuilder ShuffleBuilder(ScalarTy, Builder, *this);
1507015071 if (E->getOpcode() == Instruction::Store &&
0 commit comments