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.
|
||||
bool enableAggressiveInterleaving(bool LoopHasReductions) const;
|
||||
|
||||
/// \brief Enable matching of interleaved access groups.
|
||||
bool enableInterleavedAccessVectorization() const;
|
||||
|
||||
/// \brief Return hardware support for population count.
|
||||
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
|
||||
|
||||
|
@ -578,6 +581,7 @@ public:
|
|||
virtual unsigned getJumpBufSize() = 0;
|
||||
virtual bool shouldBuildLookupTables() = 0;
|
||||
virtual bool enableAggressiveInterleaving(bool LoopHasReductions) = 0;
|
||||
virtual bool enableInterleavedAccessVectorization() = 0;
|
||||
virtual PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) = 0;
|
||||
virtual bool haveFastSqrt(Type *Ty) = 0;
|
||||
virtual int getFPOpCost(Type *Ty) = 0;
|
||||
|
@ -719,6 +723,9 @@ public:
|
|||
bool enableAggressiveInterleaving(bool LoopHasReductions) override {
|
||||
return Impl.enableAggressiveInterleaving(LoopHasReductions);
|
||||
}
|
||||
bool enableInterleavedAccessVectorization() override {
|
||||
return Impl.enableInterleavedAccessVectorization();
|
||||
}
|
||||
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) override {
|
||||
return Impl.getPopcntSupport(IntTyWidthInBit);
|
||||
}
|
||||
|
|
|
@ -230,6 +230,8 @@ public:
|
|||
|
||||
bool enableAggressiveInterleaving(bool LoopHasReductions) { return false; }
|
||||
|
||||
bool enableInterleavedAccessVectorization() { return false; }
|
||||
|
||||
TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) {
|
||||
return TTI::PSK_Software;
|
||||
}
|
||||
|
|
|
@ -166,6 +166,10 @@ bool TargetTransformInfo::enableAggressiveInterleaving(bool LoopHasReductions) c
|
|||
return TTIImpl->enableAggressiveInterleaving(LoopHasReductions);
|
||||
}
|
||||
|
||||
bool TargetTransformInfo::enableInterleavedAccessVectorization() const {
|
||||
return TTIImpl->enableInterleavedAccessVectorization();
|
||||
}
|
||||
|
||||
TargetTransformInfo::PopcntSupportKind
|
||||
TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const {
|
||||
return TTIImpl->getPopcntSupport(IntTyWidthInBit);
|
||||
|
|
|
@ -3880,9 +3880,15 @@ bool LoopVectorizationLegality::canVectorize() {
|
|||
: "")
|
||||
<< "!\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.
|
||||
if (EnableInterleavedMemAccesses)
|
||||
InterleaveInfo.analyzeInterleaving(Strides);
|
||||
if (UseInterleaved)
|
||||
InterleaveInfo.analyzeInterleaving(Strides);
|
||||
|
||||
// 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
|
||||
|
|
Loading…
Reference in New Issue