aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2024-02-20 18:57:23 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-04-06 20:14:13 +0000
commit74626c16ff489c0d64cf2843dfd522e7c544f3ce (patch)
tree441818ef31aa77fd78545cceaf89fbf1e8e54fd1 /contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
parentb3edf4467982447620505a28fc82e38a414c07dc (diff)
parente15a4f0a320e3c1248539511adee55a201e9ed2e (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 601d2454c1e1..0a9e2c7f49f5 100644
--- a/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/contrib/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10215,8 +10215,18 @@ public:
UniqueBases.insert(VecBase);
// If the only one use is vectorized - can delete the extractelement
// itself.
- if (!EI->hasOneUse() || any_of(EI->users(), [&](User *U) {
- return !R.ScalarToTreeEntry.count(U);
+ if (!EI->hasOneUse() || (NumParts != 1 && count(E->Scalars, EI) > 1) ||
+ any_of(EI->users(), [&](User *U) {
+ const TreeEntry *UTE = R.getTreeEntry(U);
+ return !UTE || R.MultiNodeScalars.contains(U) ||
+ count_if(R.VectorizableTree,
+ [&](const std::unique_ptr<TreeEntry> &TE) {
+ return any_of(TE->UserTreeIndices,
+ [&](const EdgeInfo &Edge) {
+ return Edge.UserTE == UTE;
+ }) &&
+ is_contained(TE->Scalars, EI);
+ }) != 1;
}))
continue;
R.eraseInstruction(EI);