[llvm] 2672c6e - [SLP][NFC]Add processBuildVector member function, NFC.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Fri May 5 11:03:21 PDT 2023
Author: Alexey Bataev
Date: 2023-05-05T11:00:53-07:00
New Revision: 2672c6e4dc6123a413b23cca6d818f128d38e40c
URL: https://github.com/llvm/llvm-project/commit/2672c6e4dc6123a413b23cca6d818f128d38e40c
DIFF: https://github.com/llvm/llvm-project/commit/2672c6e4dc6123a413b23cca6d818f128d38e40c.diff
LOG: [SLP][NFC]Add processBuildVector member function, NFC.
Introduce processBuildVector as a next step to generalize code for cost
estimation and code emission for gather/buildvector nodes.
Differential Revision: https://reviews.llvm.org/D149973
Added:
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 0823086e47ad..c4b709019cc2 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -2455,6 +2455,12 @@ class BoUpSLP {
/// \p E.
Value *vectorizeOperand(TreeEntry *E, unsigned NodeIdx);
+ /// Create a new vector from a list of scalar values. Produces a sequence
+ /// which exploits values reused across lanes, and arranges the inserts
+ /// for ease of later optimization.
+ template <typename BVTy, typename ResTy, typename... Args>
+ ResTy processBuildVector(const TreeEntry *E, Args &...Params);
+
/// Create a new vector from a list of scalar values. Produces a sequence
/// which exploits values reused across lanes, and arranges the inserts
/// for ease of later optimization.
@@ -9603,7 +9609,8 @@ Value *BoUpSLP::vectorizeOperand(TreeEntry *E, unsigned NodeIdx) {
return vectorizeTree(I->get());
}
-Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
+template <typename BVTy, typename ResTy, typename... Args>
+ResTy BoUpSLP::processBuildVector(const TreeEntry *E, Args &...Params) {
assert(E->State == TreeEntry::NeedToGather && "Expected gather node.");
unsigned VF = E->getVectorFactor();
@@ -9644,8 +9651,8 @@ Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
std::fill(Mask.begin(), Mask.end(), I);
return true;
};
- ShuffleInstructionBuilder ShuffleBuilder(Builder, *this);
- Value *Vec = nullptr;
+ BVTy ShuffleBuilder(Params...);
+ ResTy Res = ResTy();
SmallVector<int> Mask;
SmallVector<int> ExtractMask;
std::optional<TargetTransformInfo::ShuffleKind> ExtractShuffle;
@@ -9702,8 +9709,8 @@ Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
Mask[I] = Entries.front()->findLaneForValue(V);
}
ShuffleBuilder.add(Entries.front()->VectorizedValue, Mask);
- Vec = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
- return Vec;
+ Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
+ return Res;
}
if (!Resized) {
unsigned VF1 = Entries.front()->getVectorFactor();
@@ -9917,9 +9924,9 @@ Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
(IsSingleShuffle && ((IsIdentityShuffle &&
IsNonPoisoned) || IsUsedInExpr) && isa<UndefValue>(V));
}))
- Vec = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
+ Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
else
- Vec = ShuffleBuilder.finalize(
+ Res = ShuffleBuilder.finalize(
E->ReuseShuffleIndices, E->Scalars.size(),
[&](Value *&Vec, SmallVectorImpl<int> &Mask) {
TryPackScalars(NonConstants, Mask, /*IsRootPoison=*/false);
@@ -9929,9 +9936,9 @@ Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
// Gather unique scalars and all constants.
SmallVector<int> ReuseMask(GatheredScalars.size(), PoisonMaskElem);
TryPackScalars(GatheredScalars, ReuseMask, /*IsRootPoison=*/true);
- Vec = ShuffleBuilder.gather(GatheredScalars);
- ShuffleBuilder.add(Vec, ReuseMask);
- Vec = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
+ Value *BV = ShuffleBuilder.gather(GatheredScalars);
+ ShuffleBuilder.add(BV, ReuseMask);
+ Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
} else {
// Gather all constants.
SmallVector<int> Mask(E->Scalars.size(), PoisonMaskElem);
@@ -9939,14 +9946,19 @@ Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
if (!isa<PoisonValue>(V))
Mask[I] = I;
}
- Vec = ShuffleBuilder.gather(E->Scalars);
- ShuffleBuilder.add(Vec, Mask);
- Vec = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
+ Value *BV = ShuffleBuilder.gather(E->Scalars);
+ ShuffleBuilder.add(BV, Mask);
+ Res = ShuffleBuilder.finalize(E->ReuseShuffleIndices);
}
if (NeedFreeze)
- Vec = ShuffleBuilder.createFreeze(Vec);
- return Vec;
+ Res = ShuffleBuilder.createFreeze(Res);
+ return Res;
+}
+
+Value *BoUpSLP::createBuildVector(const TreeEntry *E) {
+ return processBuildVector<ShuffleInstructionBuilder, Value *>(E, Builder,
+ *this);
}
Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
More information about the llvm-commits
mailing list