mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[TTI] Change TargetTransformInfo::getMinimumVF to return ElementCount
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
This commit is contained in:
parent
87a9aa8569
commit
e6c099942e
@ -945,7 +945,8 @@ public:
|
|||||||
/// \return The minimum vectorization factor for types of given element
|
/// \return The minimum vectorization factor for types of given element
|
||||||
/// bit width, or 0 if there is no minimum VF. The returned value only
|
/// bit width, or 0 if there is no minimum VF. The returned value only
|
||||||
/// applies when shouldMaximizeVectorBandwidth returns true.
|
/// 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
|
/// \return The maximum vectorization factor for types of given element
|
||||||
/// bit width and opcode, or 0 if there is no maximum VF.
|
/// bit width and opcode, or 0 if there is no maximum VF.
|
||||||
@ -1523,7 +1524,8 @@ public:
|
|||||||
virtual unsigned getMinVectorRegisterBitWidth() = 0;
|
virtual unsigned getMinVectorRegisterBitWidth() = 0;
|
||||||
virtual Optional<unsigned> getMaxVScale() const = 0;
|
virtual Optional<unsigned> getMaxVScale() const = 0;
|
||||||
virtual bool shouldMaximizeVectorBandwidth(bool OptSize) 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 unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const = 0;
|
||||||
virtual bool shouldConsiderAddressTypePromotion(
|
virtual bool shouldConsiderAddressTypePromotion(
|
||||||
const Instruction &I, bool &AllowPromotionWithoutCommonHeader) = 0;
|
const Instruction &I, bool &AllowPromotionWithoutCommonHeader) = 0;
|
||||||
@ -1951,8 +1953,9 @@ public:
|
|||||||
bool shouldMaximizeVectorBandwidth(bool OptSize) const override {
|
bool shouldMaximizeVectorBandwidth(bool OptSize) const override {
|
||||||
return Impl.shouldMaximizeVectorBandwidth(OptSize);
|
return Impl.shouldMaximizeVectorBandwidth(OptSize);
|
||||||
}
|
}
|
||||||
unsigned getMinimumVF(unsigned ElemWidth) const override {
|
ElementCount getMinimumVF(unsigned ElemWidth,
|
||||||
return Impl.getMinimumVF(ElemWidth);
|
bool IsScalable) const override {
|
||||||
|
return Impl.getMinimumVF(ElemWidth, IsScalable);
|
||||||
}
|
}
|
||||||
unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const override {
|
unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const override {
|
||||||
return Impl.getMaximumVF(ElemWidth, Opcode);
|
return Impl.getMaximumVF(ElemWidth, Opcode);
|
||||||
|
@ -374,7 +374,9 @@ public:
|
|||||||
|
|
||||||
bool shouldMaximizeVectorBandwidth(bool OptSize) const { return false; }
|
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; }
|
unsigned getMaximumVF(unsigned ElemWidth, unsigned Opcode) const { return 0; }
|
||||||
|
|
||||||
|
@ -640,8 +640,9 @@ bool TargetTransformInfo::shouldMaximizeVectorBandwidth(bool OptSize) const {
|
|||||||
return TTIImpl->shouldMaximizeVectorBandwidth(OptSize);
|
return TTIImpl->shouldMaximizeVectorBandwidth(OptSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned TargetTransformInfo::getMinimumVF(unsigned ElemWidth) const {
|
ElementCount TargetTransformInfo::getMinimumVF(unsigned ElemWidth,
|
||||||
return TTIImpl->getMinimumVF(ElemWidth);
|
bool IsScalable) const {
|
||||||
|
return TTIImpl->getMinimumVF(ElemWidth, IsScalable);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned TargetTransformInfo::getMaximumVF(unsigned ElemWidth,
|
unsigned TargetTransformInfo::getMaximumVF(unsigned ElemWidth,
|
||||||
|
@ -104,8 +104,10 @@ unsigned HexagonTTIImpl::getMinVectorRegisterBitWidth() const {
|
|||||||
return useHVX() ? ST.getVectorLength()*8 : 32;
|
return useHVX() ? ST.getVectorLength()*8 : 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned HexagonTTIImpl::getMinimumVF(unsigned ElemWidth) const {
|
ElementCount HexagonTTIImpl::getMinimumVF(unsigned ElemWidth,
|
||||||
return (8 * ST.getVectorLength()) / 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,
|
unsigned HexagonTTIImpl::getScalarizationOverhead(VectorType *Ty,
|
||||||
|
@ -82,7 +82,7 @@ public:
|
|||||||
unsigned getMaxInterleaveFactor(unsigned VF);
|
unsigned getMaxInterleaveFactor(unsigned VF);
|
||||||
unsigned getRegisterBitWidth(bool Vector) const;
|
unsigned getRegisterBitWidth(bool Vector) const;
|
||||||
unsigned getMinVectorRegisterBitWidth() const;
|
unsigned getMinVectorRegisterBitWidth() const;
|
||||||
unsigned getMinimumVF(unsigned ElemWidth) const;
|
ElementCount getMinimumVF(unsigned ElemWidth, bool IsScalable) const;
|
||||||
|
|
||||||
bool shouldMaximizeVectorBandwidth(bool OptSize) const {
|
bool shouldMaximizeVectorBandwidth(bool OptSize) const {
|
||||||
return true;
|
return true;
|
||||||
|
@ -5812,7 +5812,8 @@ LoopVectorizationCostModel::computeFeasibleMaxVF(unsigned ConstTripCount,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (auto MinVF = ElementCount::getFixed(TTI.getMinimumVF(SmallestType))) {
|
if (ElementCount MinVF =
|
||||||
|
TTI.getMinimumVF(SmallestType, /*IsScalable=*/false)) {
|
||||||
if (ElementCount::isKnownLT(MaxVF, MinVF)) {
|
if (ElementCount::isKnownLT(MaxVF, MinVF)) {
|
||||||
LLVM_DEBUG(dbgs() << "LV: Overriding calculated MaxVF(" << MaxVF
|
LLVM_DEBUG(dbgs() << "LV: Overriding calculated MaxVF(" << MaxVF
|
||||||
<< ") with target's minimum: " << MinVF << '\n');
|
<< ") with target's minimum: " << MinVF << '\n');
|
||||||
|
Loading…
Reference in New Issue
Block a user