Skip to content

Commit

Permalink
[LV][NFC]Introduce isScalableVectorizationAllowed() to refactor getMa…
Browse files Browse the repository at this point in the history
…xLegalScalableVF().

Adds isScalableVectorizationAllowed() and the corresponding data member
to query if the scalable vectorization is supported rather than
performing the analysis each time the scalable vector factor is
requested.

Part of #91403

Reviewers: ayalz, fhahn

Reviewed By: fhahn, ayalz

Pull Request: #98916
  • Loading branch information
alexey-bataev authored Jul 17, 2024
1 parent 2901848 commit 8156be6
Showing 1 changed file with 39 additions and 10 deletions.
49 changes: 39 additions & 10 deletions llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1628,6 +1628,10 @@ class LoopVectorizationCostModel {
ElementCount MaxSafeVF,
bool FoldTailByMasking);

/// Checks if scalable vectorization is supported and enabled. Caches the
/// result to avoid repeated debug dumps for repeated queries.
bool isScalableVectorizationAllowed();

/// \return the maximum legal scalable VF, based on the safe max number
/// of elements.
ElementCount getMaxLegalScalableVF(unsigned MaxSafeElements);
Expand Down Expand Up @@ -1692,6 +1696,9 @@ class LoopVectorizationCostModel {
std::optional<std::pair<TailFoldingStyle, TailFoldingStyle>>
ChosenTailFoldingStyle;

/// true if scalable vectorization is supported and enabled.
std::optional<bool> IsScalableVectorizationAllowed;

/// A map holding scalar costs for different vectorization factors. The
/// presence of a cost for an instruction in the mapping indicates that the
/// instruction will be scalarized when vectorizing with the associated
Expand Down Expand Up @@ -4144,15 +4151,18 @@ bool LoopVectorizationCostModel::runtimeChecksRequired() {
return false;
}

ElementCount
LoopVectorizationCostModel::getMaxLegalScalableVF(unsigned MaxSafeElements) {
bool LoopVectorizationCostModel::isScalableVectorizationAllowed() {
if (IsScalableVectorizationAllowed)
return *IsScalableVectorizationAllowed;

IsScalableVectorizationAllowed = false;
if (!TTI.supportsScalableVectors() && !ForceTargetSupportsScalableVectors)
return ElementCount::getScalable(0);
return false;

if (Hints->isScalableVectorizationDisabled()) {
reportVectorizationInfo("Scalable vectorization is explicitly disabled",
"ScalableVectorizationDisabled", ORE, TheLoop);
return ElementCount::getScalable(0);
return false;
}

LLVM_DEBUG(dbgs() << "LV: Scalable vectorization is available\n");
Expand All @@ -4172,7 +4182,7 @@ LoopVectorizationCostModel::getMaxLegalScalableVF(unsigned MaxSafeElements) {
"Scalable vectorization not supported for the reduction "
"operations found in this loop.",
"ScalableVFUnfeasible", ORE, TheLoop);
return ElementCount::getScalable(0);
return false;
}

// Disable scalable vectorization if the loop contains any instructions
Expand All @@ -4184,17 +4194,36 @@ LoopVectorizationCostModel::getMaxLegalScalableVF(unsigned MaxSafeElements) {
reportVectorizationInfo("Scalable vectorization is not supported "
"for all element types found in this loop.",
"ScalableVFUnfeasible", ORE, TheLoop);
return ElementCount::getScalable(0);
return false;
}

if (!Legal->isSafeForAnyVectorWidth()) {
std::optional<unsigned> MaxVScale = getMaxVScale(*TheFunction, TTI);
if (!MaxVScale) {
reportVectorizationInfo(
"The target does not provide maximum vscale value.",
"ScalableVFUnfeasible", ORE, TheLoop);
return false;
}
}

IsScalableVectorizationAllowed = true;
return true;
}

ElementCount
LoopVectorizationCostModel::getMaxLegalScalableVF(unsigned MaxSafeElements) {
if (!isScalableVectorizationAllowed())
return ElementCount::getScalable(0);

auto MaxScalableVF = ElementCount::getScalable(
std::numeric_limits<ElementCount::ScalarTy>::max());
if (Legal->isSafeForAnyVectorWidth())
return MaxScalableVF;

std::optional<unsigned> MaxVScale = getMaxVScale(*TheFunction, TTI);
// Limit MaxScalableVF by the maximum safe dependence distance.
if (std::optional<unsigned> MaxVScale = getMaxVScale(*TheFunction, TTI))
MaxScalableVF = ElementCount::getScalable(MaxSafeElements / *MaxVScale);
else
MaxScalableVF = ElementCount::getScalable(0);
MaxScalableVF = ElementCount::getScalable(MaxSafeElements / *MaxVScale);

if (!MaxScalableVF)
reportVectorizationInfo(
Expand Down

0 comments on commit 8156be6

Please sign in to comment.