diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index a1d7515f031cf..10c6b9fae9274 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -4780,8 +4780,10 @@ static Align computeCommonAlignment(ArrayRef VL) { /// Check if \p Order represents reverse order. static bool isReverseOrder(ArrayRef Order) { + assert(!Order.empty() && + "Order is empty. Please check it before using isReverseOrder."); unsigned Sz = Order.size(); - return !Order.empty() && all_of(enumerate(Order), [&](const auto &Pair) { + return all_of(enumerate(Order), [&](const auto &Pair) { return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value(); }); } @@ -9837,7 +9839,7 @@ void BoUpSLP::transformNodes() { Align CommonAlignment = computeCommonAlignment(E.Scalars); // Check if profitable to represent consecutive load + reverse as strided // load with stride -1. - if (isReverseOrder(E.ReorderIndices) && + if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) && TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) { SmallVector Mask; inversePermutation(E.ReorderIndices, Mask); @@ -9864,7 +9866,7 @@ void BoUpSLP::transformNodes() { Align CommonAlignment = computeCommonAlignment(E.Scalars); // Check if profitable to represent consecutive load + reverse as strided // load with stride -1. - if (isReverseOrder(E.ReorderIndices) && + if (!E.ReorderIndices.empty() && isReverseOrder(E.ReorderIndices) && TTI->isLegalStridedLoadStore(VecTy, CommonAlignment)) { SmallVector Mask; inversePermutation(E.ReorderIndices, Mask); @@ -10990,7 +10992,6 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef VectorizedVals, unsigned EntryVF = E->getVectorFactor(); auto *FinalVecTy = getWidenedType(ScalarTy, EntryVF); - bool NeedToShuffleReuses = !E->ReuseShuffleIndices.empty(); if (E->isGather()) { if (allConstant(VL)) return 0; @@ -11003,9 +11004,8 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef VectorizedVals, } InstructionCost CommonCost = 0; SmallVector Mask; - bool IsReverseOrder = isReverseOrder(E->ReorderIndices); - if (!E->ReorderIndices.empty() && - (E->State != TreeEntry::StridedVectorize || !IsReverseOrder)) { + if (!E->ReorderIndices.empty() && (E->State != TreeEntry::StridedVectorize || + !isReverseOrder(E->ReorderIndices))) { SmallVector NewMask; if (E->getOpcode() == Instruction::Store) { // For stores the order is actually a mask. @@ -11016,7 +11016,7 @@ BoUpSLP::getEntryCost(const TreeEntry *E, ArrayRef VectorizedVals, } ::addMask(Mask, NewMask); } - if (NeedToShuffleReuses) + if (!E->ReuseShuffleIndices.empty()) ::addMask(Mask, E->ReuseShuffleIndices); if (!Mask.empty() && !ShuffleVectorInst::isIdentityMask(Mask, Mask.size())) CommonCost = @@ -15064,7 +15064,8 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E, bool PostponedPHIs) { return Vec; } - bool IsReverseOrder = isReverseOrder(E->ReorderIndices); + bool IsReverseOrder = + !E->ReorderIndices.empty() && isReverseOrder(E->ReorderIndices); auto FinalShuffle = [&](Value *V, const TreeEntry *E) { ShuffleInstructionBuilder ShuffleBuilder(ScalarTy, Builder, *this); if (E->getOpcode() == Instruction::Store &&