diff options
-rw-r--r-- | include/llvm/Analysis/TargetTransformInfo.h | 26 | ||||
-rw-r--r-- | lib/Analysis/TargetTransformInfo.cpp | 10 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetTransformInfo.cpp | 6 | ||||
-rw-r--r-- | lib/Transforms/Scalar/LoopIdiomRecognize.cpp | 2 |
4 files changed, 23 insertions, 21 deletions
diff --git a/include/llvm/Analysis/TargetTransformInfo.h b/include/llvm/Analysis/TargetTransformInfo.h index 718dfbb..a421bf6 100644 --- a/include/llvm/Analysis/TargetTransformInfo.h +++ b/include/llvm/Analysis/TargetTransformInfo.h @@ -70,16 +70,18 @@ public: /// \name Scalar Target Information /// @{ - /// PopcntHwSupport - Hardware support for population count. Compared to the - /// SW implementation, HW support is supposed to significantly boost the - /// performance when the population is dense, and it may or may not degrade - /// performance if the population is sparse. A HW support is considered as - /// "Fast" if it can outperform, or is on a par with, SW implementaion when - /// the population is sparse; otherwise, it is considered as "Slow". - enum PopcntHwSupport { - None, - Fast, - Slow + /// \brief Flags indicating the kind of support for population count. + /// + /// Compared to the SW implementation, HW support is supposed to + /// significantly boost the performance when the population is dense, and it + /// may or may not degrade performance if the population is sparse. A HW + /// support is considered as "Fast" if it can outperform, or is on a par + /// with, SW implementaion when the population is sparse; otherwise, it is + /// considered as "Slow". + enum PopcntSupportKind { + PSK_Software, + PSK_SlowHardware, + PSK_FastHardware }; /// isLegalAddImmediate - Return true if the specified immediate is legal @@ -121,8 +123,8 @@ public: /// lookup tables for the target. virtual bool shouldBuildLookupTables() const; - /// getPopcntHwSupport - Return hardware support for population count. - virtual PopcntHwSupport getPopcntHwSupport(unsigned IntTyWidthInBit) const; + /// getPopcntSupport - Return hardware support for population count. + virtual PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const; /// getIntImmCost - Return the expected cost of materializing the given /// integer immediate of the specified type. diff --git a/lib/Analysis/TargetTransformInfo.cpp b/lib/Analysis/TargetTransformInfo.cpp index e156277..0299373 100644 --- a/lib/Analysis/TargetTransformInfo.cpp +++ b/lib/Analysis/TargetTransformInfo.cpp @@ -79,9 +79,9 @@ bool TargetTransformInfo::shouldBuildLookupTables() const { return PrevTTI->shouldBuildLookupTables(); } -TargetTransformInfo::PopcntHwSupport -TargetTransformInfo::getPopcntHwSupport(unsigned IntTyWidthInBit) const { - return PrevTTI->getPopcntHwSupport(IntTyWidthInBit); +TargetTransformInfo::PopcntSupportKind +TargetTransformInfo::getPopcntSupport(unsigned IntTyWidthInBit) const { + return PrevTTI->getPopcntSupport(IntTyWidthInBit); } unsigned TargetTransformInfo::getIntImmCost(const APInt &Imm, Type *Ty) const { @@ -202,8 +202,8 @@ struct NoTTI : ImmutablePass, TargetTransformInfo { return true; } - PopcntHwSupport getPopcntHwSupport(unsigned IntTyWidthInBit) const { - return None; + PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const { + return PSK_Software; } unsigned getIntImmCost(const APInt &Imm, Type *Ty) const { diff --git a/lib/Target/X86/X86TargetTransformInfo.cpp b/lib/Target/X86/X86TargetTransformInfo.cpp index c98681b..8a699af 100644 --- a/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/lib/Target/X86/X86TargetTransformInfo.cpp @@ -76,7 +76,7 @@ public: /// \name Scalar TTI Implementations /// @{ - virtual PopcntHwSupport getPopcntHwSupport(unsigned TyWidth) const; + virtual PopcntSupportKind getPopcntSupport(unsigned TyWidth) const; /// @} @@ -157,12 +157,12 @@ FindInConvertTable(const X86TypeConversionCostTblEntry *Tbl, unsigned len, } -X86TTI::PopcntHwSupport X86TTI::getPopcntHwSupport(unsigned TyWidth) const { +X86TTI::PopcntSupportKind X86TTI::getPopcntSupport(unsigned TyWidth) const { assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2"); // TODO: Currently the __builtin_popcount() implementation using SSE3 // instructions is inefficient. Once the problem is fixed, we should // call ST->hasSSE3() instead of ST->hasSSE4(). - return ST->hasSSE41() ? Fast : None; + return ST->hasSSE41() ? PSK_FastHardware : PSK_Software; } unsigned X86TTI::getNumberOfRegisters(bool Vector) const { diff --git a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index 20eec91..59109a7 100644 --- a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp @@ -311,7 +311,7 @@ NclPopcountRecognize::NclPopcountRecognize(LoopIdiomRecognize &TheLIR): bool NclPopcountRecognize::preliminaryScreen() { const TargetTransformInfo *TTI = LIR.getTargetTransformInfo(); - if (TTI->getPopcntHwSupport(32) != TargetTransformInfo::Fast) + if (TTI->getPopcntSupport(32) != TargetTransformInfo::PSK_FastHardware) return false; // Counting population are usually conducted by few arithmetic instrutions. |