@@ -4782,8 +4782,10 @@ static Align computeCommonAlignment(ArrayRef<Value *> VL) {
47824782
47834783/// Check if \p Order represents reverse order.
47844784static bool isReverseOrder(ArrayRef<unsigned> Order) {
4785+ assert(!Order.empty() &&
4786+ "Order is empty. Please check it before using isReverseOrder.");
47854787 unsigned Sz = Order.size();
4786- return !Order.empty() && all_of(enumerate(Order), [&](const auto &Pair) {
4788+ return all_of(enumerate(Order), [&](const auto &Pair) {
47874789 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
47884790 });
47894791}
@@ -9839,7 +9841,7 @@ void BoUpSLP::transformNodes() {
98399841 Align CommonAlignment = computeCommonAlignment<LoadInst>(E.Scalars);
98409842 // Check if profitable to represent consecutive load + reverse as strided
98419843 // load with stride -1.
9842- if (isReverseOrder(E.ReorderIndices) &&
9844+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
98439845 TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
98449846 SmallVector<int> Mask;
98459847 inversePermutation(E.ReorderIndices, Mask);
@@ -9866,7 +9868,7 @@ void BoUpSLP::transformNodes() {
98669868 Align CommonAlignment = computeCommonAlignment<StoreInst>(E.Scalars);
98679869 // Check if profitable to represent consecutive load + reverse as strided
98689870 // load with stride -1.
9869- if (isReverseOrder(E.ReorderIndices) &&
9871+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
98709872 TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
98719873 SmallVector<int> Mask;
98729874 inversePermutation(E.ReorderIndices, Mask);
@@ -10992,7 +10994,6 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1099210994 unsigned EntryVF = E->getVectorFactor();
1099310995 auto *FinalVecTy = getWidenedType(ScalarTy, EntryVF);
1099410996
10995- bool NeedToShuffleReuses = !E->ReuseShuffleIndices.empty();
1099610997 if (E->isGather()) {
1099710998 if (allConstant(VL))
1099810999 return 0;
@@ -11005,9 +11006,8 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1100511006 }
1100611007 InstructionCost CommonCost = 0;
1100711008 SmallVector<int> Mask;
11008- bool IsReverseOrder = isReverseOrder(E->ReorderIndices);
11009- if (!E->ReorderIndices.empty() &&
11010- (E->State != TreeEntry::StridedVectorize || !IsReverseOrder)) {
11009+ if (!E->ReorderIndices.empty() && (E->State != TreeEntry::StridedVectorize ||
11010+ !isReverseOrder(E->ReorderIndices))) {
1101111011 SmallVector<int> NewMask;
1101211012 if (E->getOpcode() == Instruction::Store) {
1101311013 // For stores the order is actually a mask.
@@ -11018,7 +11018,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
1101811018 }
1101911019 ::addMask(Mask, NewMask);
1102011020 }
11021- if (NeedToShuffleReuses )
11021+ if (!E->ReuseShuffleIndices.empty() )
1102211022 ::addMask(Mask, E->ReuseShuffleIndices);
1102311023 if (!Mask.empty() && !ShuffleVectorInst::isIdentityMask(Mask, Mask.size()))
1102411024 CommonCost =
@@ -15068,7 +15068,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
1506815068 return Vec;
1506915069 }
1507015070
15071- bool IsReverseOrder = isReverseOrder(E->ReorderIndices);
15071+ bool IsReverseOrder =
15072+ !E->ReorderIndices.empty() && isReverseOrder(E->ReorderIndices);
1507215073 auto FinalShuffle = [&](Value *V, const TreeEntry *E) {
1507315074 ShuffleInstructionBuilder ShuffleBuilder(ScalarTy, Builder, *this);
1507415075 if (E->getOpcode() == Instruction::Store &&
0 commit comments