[llvm] 17b701c - [LV] Collect a list of all element types found in the loop (NFC)
Kerry McLaughlin via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 6 02:46:24 PDT 2021
Author: Kerry McLaughlin
Date: 2021-07-06T10:37:41+01:00
New Revision: 17b701c43ca6459db020bff075b119f33a4a8ec5
URL: https://github.com/llvm/llvm-project/commit/17b701c43ca6459db020bff075b119f33a4a8ec5
DIFF: https://github.com/llvm/llvm-project/commit/17b701c43ca6459db020bff075b119f33a4a8ec5.diff
LOG: [LV] Collect a list of all element types found in the loop (NFC)
Splits `getSmallestAndWidestTypes` into two functions, one of which now collects
a list of all element types found in the loop (`ElementTypesInLoop`). This ensures we do not
have to iterate over all instructions in the loop again in other places, such as in D102253
which disables scalable vectorization of a loop if any of the instructions use invalid types.
Reviewed By: sdesmalen
Differential Revision: https://reviews.llvm.org/D105437
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 617300f07db0..f3e5b020e8b6 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -1305,6 +1305,9 @@ class LoopVectorizationCostModel {
/// Collect values we want to ignore in the cost model.
void collectValuesToIgnore();
+ /// Collect all element types in the loop for which widening is needed.
+ void collectElementTypesForWidening();
+
/// Split reductions into those that happen in the loop, and those that happen
/// outside. In loop reductions are collected into InLoopReductionChains.
void collectInLoopReductions();
@@ -1890,6 +1893,9 @@ class LoopVectorizationCostModel {
/// Values to ignore in the cost model when VF > 1.
SmallPtrSet<const Value *, 16> VecValuesToIgnore;
+ /// All element types found in the loop.
+ SmallPtrSet<Type *, 16> ElementTypesInLoop;
+
/// Profitable vector factors.
SmallVector<VectorizationFactor, 8> ProfitableVFs;
};
@@ -6246,7 +6252,17 @@ LoopVectorizationCostModel::getSmallestAndWidestTypes() {
unsigned MinWidth = -1U;
unsigned MaxWidth = 8;
const DataLayout &DL = TheFunction->getParent()->getDataLayout();
+ for (Type *T : ElementTypesInLoop) {
+ MinWidth = std::min<unsigned>(
+ MinWidth, DL.getTypeSizeInBits(T->getScalarType()).getFixedSize());
+ MaxWidth = std::max<unsigned>(
+ MaxWidth, DL.getTypeSizeInBits(T->getScalarType()).getFixedSize());
+ }
+ return {MinWidth, MaxWidth};
+}
+void LoopVectorizationCostModel::collectElementTypesForWidening() {
+ ElementTypesInLoop.clear();
// For each block.
for (BasicBlock *BB : TheLoop->blocks()) {
// For each instruction in the loop.
@@ -6292,14 +6308,9 @@ LoopVectorizationCostModel::getSmallestAndWidestTypes() {
!isAccessInterleaved(&I) && !isLegalGatherOrScatter(&I))
continue;
- MinWidth = std::min(MinWidth,
- (unsigned)DL.getTypeSizeInBits(T->getScalarType()));
- MaxWidth = std::max(MaxWidth,
- (unsigned)DL.getTypeSizeInBits(T->getScalarType()));
+ ElementTypesInLoop.insert(T);
}
}
-
- return {MinWidth, MaxWidth};
}
unsigned LoopVectorizationCostModel::selectInterleaveCount(ElementCount VF,
@@ -9840,6 +9851,8 @@ static bool processLoopInVPlanNativePath(
// Get user vectorization factor.
ElementCount UserVF = Hints.getWidth();
+ CM.collectElementTypesForWidening();
+
// Plan how to best vectorize, return the best VF and its cost.
const VectorizationFactor VF = LVP.planInVPlanNativePath(UserVF);
@@ -10061,6 +10074,7 @@ bool LoopVectorizePass::processLoop(Loop *L) {
LoopVectorizationCostModel CM(SEL, L, PSE, LI, &LVL, *TTI, TLI, DB, AC, ORE,
F, &Hints, IAI);
CM.collectValuesToIgnore();
+ CM.collectElementTypesForWidening();
// Use the planner for vectorization.
LoopVectorizationPlanner LVP(L, LI, TLI, TTI, &LVL, CM, IAI, PSE, Hints,
More information about the llvm-commits
mailing list