Skip to content

Commit

Permalink
[TTI] Change TargetTransformInfo::getMinimumVF to return ElementCount
Browse files Browse the repository at this point in the history
This will be needed in the loop-vectorizer where the minimum VF
requested may be a scalable VF. getMinimumVF now takes an additional
operand 'IsScalableVF' that indicates whether a scalable VF is required.

Reviewed By: kparzysz, rampitec

Differential Revision: https://reviews.llvm.org/D96020
  • Loading branch information
sdesmalen-arm committed Feb 11, 2021
1 parent 33a58c1 commit 703130f
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 11 deletions.
11 changes: 7 additions & 4 deletions llvm/include/llvm/Analysis/TargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -945,7 +945,8 @@ class TargetTransformInfo {
/// \return The minimum vectorization factor for types of given element
/// bit width, or 0 if there is no minimum VF. The returned value only
/// applies when shouldMaximizeVectorBandwidth returns true.
unsigned getMinimumVF(unsigned ElemWidth) const;
/// If IsScalable is true, the returned ElementCount must be a scalable VF.
ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const;

/// \return The maximum vectorization factor for types of given element
/// bit width and opcode, or 0 if there is no maximum VF.
Expand Down Expand Up @@ -1523,7 +1524,8 @@ class TargetTransformInfo::Concept {
virtual unsigned getMinVectorRegisterBitWidth() = 0;
virtual Optional<unsigned> getMaxVScale() const = 0;
virtual bool shouldMaximizeVectorBandwidth(bool OptSize) const = 0;
virtual unsigned getMinimumVF(unsigned ElemWidth) const = 0;
virtual ElementCount getMinimumVF(unsigned ElemWidth,
bool IsScalable) const = 0;
virtual unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const = 0;
virtual bool shouldConsiderAddressTypePromotion(
const Instruction &I, bool &AllowPromotionWithoutCommonHeader) = 0;
Expand Down Expand Up @@ -1951,8 +1953,9 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept {
bool shouldMaximizeVectorBandwidth(bool OptSize) const override {
return Impl.shouldMaximizeVectorBandwidth(OptSize);
}
unsigned getMinimumVF(unsigned ElemWidth) const override {
return Impl.getMinimumVF(ElemWidth);
ElementCount getMinimumVF(unsigned ElemWidth,
bool IsScalable) const override {
return Impl.getMinimumVF(ElemWidth, IsScalable);
}
unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const override {
return Impl.getMaximumVF(ElemWidth, Opcode);
Expand Down
4 changes: 3 additions & 1 deletion llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,9 @@ class TargetTransformInfoImplBase {

bool shouldMaximizeVectorBandwidth(bool OptSize) const { return false; }

unsigned getMinimumVF(unsigned ElemWidth) const { return 0; }
ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const {
return ElementCount::get(0, IsScalable);
}

unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const { return 0; }

Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Analysis/TargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,8 +640,9 @@ bool TargetTransformInfo::shouldMaximizeVectorBandwidth(bool OptSize) const {
return TTIImpl->shouldMaximizeVectorBandwidth(OptSize);
}

unsigned TargetTransformInfo::getMinimumVF(unsigned ElemWidth) const {
return TTIImpl->getMinimumVF(ElemWidth);
ElementCount TargetTransformInfo::getMinimumVF(unsigned ElemWidth,
bool IsScalable) const {
return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
}

unsigned TargetTransformInfo::getMaximumVF(unsigned ElemWidth,
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,10 @@ unsigned HexagonTTIImpl::getMinVectorRegisterBitWidth() const {
return useHVX() ? ST.getVectorLength()*8 : 32;
}

unsigned HexagonTTIImpl::getMinimumVF(unsigned ElemWidth) const {
return (8 * ST.getVectorLength()) / ElemWidth;
ElementCount HexagonTTIImpl::getMinimumVF(unsigned ElemWidth,
bool IsScalable) const {
assert(!IsScalable && "Scalable VFs are not supported for Hexagon");
return ElementCount::getFixed((8 * ST.getVectorLength()) / ElemWidth);
}

unsigned HexagonTTIImpl::getScalarizationOverhead(VectorType *Ty,
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/Hexagon/HexagonTargetTransformInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class HexagonTTIImpl : public BasicTTIImplBase<HexagonTTIImpl> {
unsigned getMaxInterleaveFactor(unsigned VF);
unsigned getRegisterBitWidth(bool Vector) const;
unsigned getMinVectorRegisterBitWidth() const;
unsigned getMinimumVF(unsigned ElemWidth) const;
ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const;

bool shouldMaximizeVectorBandwidth(bool OptSize) const {
return true;
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5812,7 +5812,8 @@ LoopVectorizationCostModel::computeFeasibleMaxVF(unsigned ConstTripCount,
break;
}
}
if (auto MinVF = ElementCount::getFixed(TTI.getMinimumVF(SmallestType))) {
if (ElementCount MinVF =
TTI.getMinimumVF(SmallestType, /*IsScalable=*/false)) {
if (ElementCount::isKnownLT(MaxVF, MinVF)) {
LLVM_DEBUG(dbgs() << "LV: Overriding calculated MaxVF(" << MaxVF
<< ") with target's minimum: " << MinVF << '\n');
Expand Down

0 comments on commit 703130f

Please sign in to comment.