diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index fb30d46cfda1b..47b9f70b6fa02 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -5477,11 +5477,13 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom) { // Try build correct order for extractelement instructions. SmallVector ReusedMask(TE.ReuseShuffleIndices.begin(), TE.ReuseShuffleIndices.end()); - if (TE.getOpcode() == Instruction::ExtractElement && !TE.isAltShuffle() && + if (TE.getOpcode() == Instruction::ExtractElement && all_of(TE.Scalars, [Sz](Value *V) { std::optional Idx = getExtractIndex(cast(V)); return Idx && *Idx < Sz; })) { + assert(!TE.isAltShuffle() && "Alternate instructions are only supported " + "by BinaryOperator and CastInst."); SmallVector ReorderMask(Sz, PoisonMaskElem); if (TE.ReorderIndices.empty()) std::iota(ReorderMask.begin(), ReorderMask.end(), 0); @@ -5526,9 +5528,11 @@ BoUpSLP::getReorderingData(const TreeEntry &TE, bool TopToBottom) { if ((TE.State == TreeEntry::Vectorize || TE.State == TreeEntry::StridedVectorize) && (isa(TE.getMainOp()) || - (TopToBottom && isa(TE.getMainOp()))) && - !TE.isAltShuffle()) + (TopToBottom && isa(TE.getMainOp())))) { + assert(!TE.isAltShuffle() && "Alternate instructions are only supported by " + "BinaryOperator and CastInst."); return TE.ReorderIndices; + } if (TE.State == TreeEntry::Vectorize && TE.getOpcode() == Instruction::PHI) { if (!TE.ReorderIndices.empty()) return TE.ReorderIndices; @@ -5924,8 +5928,11 @@ void BoUpSLP::reorderTopToBottom() { continue; } // Stores actually store the mask, not the order, need to invert. - if (OpTE->State == TreeEntry::Vectorize && !OpTE->isAltShuffle() && + if (OpTE->State == TreeEntry::Vectorize && OpTE->getOpcode() == Instruction::Store && !Order.empty()) { + assert(!OpTE->isAltShuffle() && + "Alternate instructions are only supported by BinaryOperator " + "and CastInst."); SmallVector Mask; inversePermutation(Order, Mask); unsigned E = Order.size(); @@ -6188,8 +6195,11 @@ void BoUpSLP::reorderBottomToTop(bool IgnoreReorder) { return P.second == OpTE; }); // Stores actually store the mask, not the order, need to invert. - if (OpTE->State == TreeEntry::Vectorize && !OpTE->isAltShuffle() && + if (OpTE->State == TreeEntry::Vectorize && OpTE->getOpcode() == Instruction::Store && !Order.empty()) { + assert(!OpTE->isAltShuffle() && + "Alternate instructions are only supported by BinaryOperator " + "and CastInst."); SmallVector Mask; inversePermutation(Order, Mask); unsigned E = Order.size();