@@ -4782,8 +4782,10 @@ static Align computeCommonAlignment(ArrayRef<Value *> VL) {
4782
4782
4783
4783
/// Check if \p Order represents reverse order.
4784
4784
static bool isReverseOrder(ArrayRef<unsigned> Order) {
4785
+ assert(!Order.empty() &&
4786
+ "Order is empty. Please check it before using isReverseOrder.");
4785
4787
unsigned Sz = Order.size();
4786
- return !Order.empty() && all_of(enumerate(Order), [&](const auto &Pair) {
4788
+ return all_of(enumerate(Order), [&](const auto &Pair) {
4787
4789
return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
4788
4790
});
4789
4791
}
@@ -9839,7 +9841,7 @@ void BoUpSLP::transformNodes() {
9839
9841
Align CommonAlignment = computeCommonAlignment<LoadInst>(E.Scalars);
9840
9842
// Check if profitable to represent consecutive load + reverse as strided
9841
9843
// load with stride -1.
9842
- if (isReverseOrder(E.ReorderIndices) &&
9844
+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
9843
9845
TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
9844
9846
SmallVector<int> Mask;
9845
9847
inversePermutation(E.ReorderIndices, Mask);
@@ -9866,7 +9868,7 @@ void BoUpSLP::transformNodes() {
9866
9868
Align CommonAlignment = computeCommonAlignment<StoreInst>(E.Scalars);
9867
9869
// Check if profitable to represent consecutive load + reverse as strided
9868
9870
// load with stride -1.
9869
- if (isReverseOrder(E.ReorderIndices) &&
9871
+ if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) &&
9870
9872
TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) {
9871
9873
SmallVector<int> Mask;
9872
9874
inversePermutation(E.ReorderIndices, Mask);
@@ -10992,7 +10994,6 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
10992
10994
unsigned EntryVF = E->getVectorFactor();
10993
10995
auto *FinalVecTy = getWidenedType(ScalarTy, EntryVF);
10994
10996
10995
- bool NeedToShuffleReuses = !E->ReuseShuffleIndices.empty();
10996
10997
if (E->isGather()) {
10997
10998
if (allConstant(VL))
10998
10999
return 0;
@@ -11005,9 +11006,8 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
11005
11006
}
11006
11007
InstructionCost CommonCost = 0;
11007
11008
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))) {
11011
11011
SmallVector<int> NewMask;
11012
11012
if (E->getOpcode() == Instruction::Store) {
11013
11013
// For stores the order is actually a mask.
@@ -11018,7 +11018,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef<Value *> VectorizedVals,
11018
11018
}
11019
11019
::addMask(Mask, NewMask);
11020
11020
}
11021
- if (NeedToShuffleReuses )
11021
+ if (!E->ReuseShuffleIndices.empty() )
11022
11022
::addMask(Mask, E->ReuseShuffleIndices);
11023
11023
if (!Mask.empty() && !ShuffleVectorInst::isIdentityMask(Mask, Mask.size()))
11024
11024
CommonCost =
@@ -15068,7 +15068,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) {
15068
15068
return Vec;
15069
15069
}
15070
15070
15071
- bool IsReverseOrder = isReverseOrder(E->ReorderIndices);
15071
+ bool IsReverseOrder =
15072
+ !E->ReorderIndices.empty() && isReverseOrder(E->ReorderIndices);
15072
15073
auto FinalShuffle = [&](Value *V, const TreeEntry *E) {
15073
15074
ShuffleInstructionBuilder ShuffleBuilder(ScalarTy, Builder, *this);
15074
15075
if (E->getOpcode() == Instruction::Store &&
0 commit comments