[PATCH] D159205: [SLP]Try to vectorize scalars, being vectorized already, but do not need to be scheduled.
Alexey Bataev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 20 09:28:23 PDT 2023
ABataev added a comment.
In D159205#4648813 <https://reviews.llvm.org/D159205#4648813>, @ABataev wrote:
> In D159205#4648767 <https://reviews.llvm.org/D159205#4648767>, @bgraur wrote:
>
>> In D159205#4648763 <https://reviews.llvm.org/D159205#4648763>, @ABataev wrote:
>>
>>> In D159205#4648753 <https://reviews.llvm.org/D159205#4648753>, @bgraur wrote:
>>>
>>>>> Is there something else above, like assertion message? It would really help more rather than the rest of the stack trace
>>>>
>>>> No, I've built the code with assertions enabled in the compiler and no assertion was triggered. The stack trace is all I get.
>>>
>>> Ok, I'll try to prepare a fix, but it would be good to see a reproducer.
>>
>> Working on the repro. Please CC me to the fix and I can check if it fixes the issue.
>
> I have a patch, could you try it?
>
> diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> index 38ef4fa9464f..94abd8ac59da 100644
> --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
> @@ -2916,8 +2916,11 @@ private:
> const TreeEntry *TE = getTreeEntry(V);
> assert((!TE || TE == Last || doesNotNeedToBeScheduled(V)) &&
> "Scalar already in tree!");
> - if (TE)
> + if (TE) {
> + if (TE != Last)
> + MultiNodeScalar.insert(V);
> continue;
> + }
> ScalarToTreeEntry[V] = Last;
> }
> // Update the scheduler bundle to point to this TreeEntry.
> @@ -2976,6 +2979,9 @@ private:
> /// Maps a specific scalar to its tree entry.
> SmallDenseMap<Value *, TreeEntry *> ScalarToTreeEntry;
>
> + /// List of scalar, used in several vectorize nodes.
> + SmallDenseSet<Value *> MultiNodeScalar;
> +
> /// Maps a value to the proposed vectorizable size.
> SmallDenseMap<Value *, unsigned> InstrElementSize;
>
> @@ -9843,17 +9849,32 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx) {
> S = getSameOpcode(*It, *TLI);
> }
> if (S.getOpcode()) {
> - if (TreeEntry *VE = getTreeEntry(S.OpValue);
> - VE && VE->isSame(VL) &&
> - (any_of(VE->UserTreeIndices,
> - [E, NodeIdx](const EdgeInfo &EI) {
> - return EI.UserTE == E && EI.EdgeIdx == NodeIdx;
> - }) ||
> - any_of(VectorizableTree,
> - [E, NodeIdx, VE](const std::unique_ptr<TreeEntry> &TE) {
> - return TE->isOperandGatherNode({E, NodeIdx}) &&
> - VE->isSame(TE->Scalars);
> - }))) {
> + auto CheckSameVE = [&](const TreeEntry *VE) {
> + return VE->isSame(VL) &&
> + (any_of(VE->UserTreeIndices,
> + [E, NodeIdx](const EdgeInfo &EI) {
> + return EI.UserTE == E && EI.EdgeIdx == NodeIdx;
> + }) ||
> + any_of(VectorizableTree,
> + [E, NodeIdx, VE](const std::unique_ptr<TreeEntry> &TE) {
> + return TE->isOperandGatherNode({E, NodeIdx}) &&
> + VE->isSame(TE->Scalars);
> + }));
> + };
> + TreeEntry *VE = getTreeEntry(S.OpValue);
> + bool IsSameVE = VE && CheckSameVE(VE);
> + if (!IsSameVE && MultiNodeScalar.contains(S.OpValue)) {
> + auto *I =
> + find_if(VectorizableTree, [&](const std::unique_ptr<TreeEntry> &TE) {
> + return TE->State != TreeEntry::NeedToGather && TE.get() != VE &&
> + CheckSameVE(TE.get());
> + });
> + if (I != VectorizableTree.end()) {
> + VE = I->get();
> + IsSameVE = true;
> + }
> + }
> + if (IsSameVE) {
> auto FinalShuffle = [&](Value *V, ArrayRef<int> Mask) {
> ShuffleInstructionBuilder ShuffleBuilder(Builder, *this);
> ShuffleBuilder.add(V, Mask);
I was able to prepare a reproducer for this, will fix it soon. Let me know if it fixes your issue.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D159205/new/
https://reviews.llvm.org/D159205
More information about the llvm-commits
mailing list