forked from OSchip/llvm-project
[TTI] Add a hook for specifying per-target defaults for Interleaved Accesses
Summary: This adds a hook to TTI which enables us to selectively turn on by default interleaved access vectorization for targets on which we have have performed the required benchmarking. Reviewers: rengolin Subscribers: rengolin, llvm-commits Differential Revision: http://reviews.llvm.org/D11901 llvm-svn: 244449
This commit is contained in:
parent
e29ab2bfab
commit
61bdc51339
|
@ -357,6 +357,9 @@ public:
|
||||||
/// \brief Don't restrict interleaved unrolling to small loops.
|
/// \brief Don't restrict interleaved unrolling to small loops.
|
||||||
bool enableAggressiveInterleaving(bool LoopHasReductions) const;
|
bool enableAggressiveInterleaving(bool LoopHasReductions) const;
|
||||||
|
|
||||||
|
/// \brief Enable matching of interleaved access groups.
|
||||||
|
bool enableInterleavedAccessVectorization() const;
|
||||||
|
|
||||||
/// \brief Return hardware support for population count.
|
/// \brief Return hardware support for population count.
|
||||||
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
|
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
|
||||||
|
|
||||||
|
@ -578,6 +581,7 @@ public:
|
||||||
virtual unsigned getJumpBufSize() = 0;
|
virtual unsigned getJumpBufSize() = 0;
|
||||||
virtual bool shouldBuildLookupTables() = 0;
|
virtual bool shouldBuildLookupTables() = 0;
|
||||||
virtual bool enableAggressiveInterleaving(bool LoopHasReductions) = 0;
|
virtual bool enableAggressiveInterleaving(bool LoopHasReductions) = 0;
|
||||||
|
virtual bool enableInterleavedAccessVectorization() = 0;
|
||||||
virtual PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) = 0;
|
virtual PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) = 0;
|
||||||
virtual bool haveFastSqrt(Type *Ty) = 0;
|
virtual bool haveFastSqrt(Type *Ty) = 0;
|
||||||
virtual int getFPOpCost(Type *Ty) = 0;
|
virtual int getFPOpCost(Type *Ty) = 0;
|
||||||
|
@ -719,6 +723,9 @@ public:
|
||||||
bool enableAggressiveInterleaving(bool LoopHasReductions) override {
|
bool enableAggressiveInterleaving(bool LoopHasReductions) override {
|
||||||
return Impl.enableAggressiveInterleaving(LoopHasReductions);
|
return Impl.enableAggressiveInterleaving(LoopHasReductions);
|
||||||
}
|
}
|
||||||
|
bool enableInterleavedAccessVectorization() override {
|
||||||
|
return Impl.enableInterleavedAccessVectorization();
|
||||||
|
}
|
||||||
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) override {
|
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) override {
|
||||||
return Impl.getPopcntSupport(IntTyWidthInBit);
|
return Impl.getPopcntSupport(IntTyWidthInBit);
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,6 +230,8 @@ public:
|
||||||
|
|
||||||
bool enableAggressiveInterleaving(bool LoopHasReductions) { return false; }
|
bool enableAggressiveInterleaving(bool LoopHasReductions) { return false; }
|
||||||
|
|
||||||
|
bool enableInterleavedAccessVectorization() { return false; }
|
||||||
|
|
||||||
TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) {
|
TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) {
|
||||||
return TTI::PSK_Software;
|
return TTI::PSK_Software;
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,10 @@ bool TargetTransformInfo::enableAggressiveInterleaving(bool LoopHasReductions) c
|
||||||
return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
|
return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TargetTransformInfo::enableInterleavedAccessVectorization() const {
|
||||||
|
return TTIImpl->enableInterleavedAccessVectorization();
|
||||||
|
}
|
||||||
|
|
||||||
TargetTransformInfo::PopcntSupportKind
|
TargetTransformInfo::PopcntSupportKind
|
||||||
TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
|
TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
|
||||||
return TTIImpl->getPopcntSupport(IntTyWidthInBit);
|
return TTIImpl->getPopcntSupport(IntTyWidthInBit);
|
||||||
|
|
|
@ -3880,9 +3880,15 @@ bool LoopVectorizationLegality::canVectorize() {
|
||||||
: "")
|
: "")
|
||||||
<< "!\n");
|
<< "!\n");
|
||||||
|
|
||||||
|
bool UseInterleaved = TTI->enableInterleavedAccessVectorization();
|
||||||
|
|
||||||
|
// If an override option has been passed in for interleaved accesses, use it.
|
||||||
|
if (EnableInterleavedMemAccesses.getNumOccurrences() > 0)
|
||||||
|
UseInterleaved = EnableInterleavedMemAccesses;
|
||||||
|
|
||||||
// Analyze interleaved memory accesses.
|
// Analyze interleaved memory accesses.
|
||||||
if (EnableInterleavedMemAccesses)
|
if (UseInterleaved)
|
||||||
InterleaveInfo.analyzeInterleaving(Strides);
|
InterleaveInfo.analyzeInterleaving(Strides);
|
||||||
|
|
||||||
// Okay! We can vectorize. At this point we don't have any other mem analysis
|
// Okay! We can vectorize. At this point we don't have any other mem analysis
|
||||||
// which may limit our maximum vectorization factor, so just return true with
|
// which may limit our maximum vectorization factor, so just return true with
|
||||||
|
|
Loading…
Reference in New Issue