diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.h b/llvm/include/llvm/Analysis/TargetLibraryInfo.h --- a/llvm/include/llvm/Analysis/TargetLibraryInfo.h +++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.h @@ -11,6 +11,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/Optional.h" +#include "llvm/ADT/PackedVector.h" #include "llvm/ADT/Triple.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Function.h" @@ -47,23 +48,19 @@ class TargetLibraryInfoImpl { friend class TargetLibraryInfo; - unsigned char AvailableArray[(NumLibFuncs+3)/4]; - llvm::DenseMap CustomNames; - static StringLiteral const StandardNames[NumLibFuncs]; - bool ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param; - enum AvailabilityState { StandardName = 3, // (memset to all ones) CustomName = 1, Unavailable = 0 // (memset to all zeros) }; - void setState(LibFunc F, AvailabilityState State) { - AvailableArray[F/4] &= ~(3 << 2*(F&3)); - AvailableArray[F/4] |= State << 2*(F&3); - } - AvailabilityState getState(LibFunc F) const { - return static_cast((AvailableArray[F/4] >> 2*(F&3)) & 3); - } + + PackedVector Availability; + llvm::DenseMap CustomNames; + static StringLiteral const StandardNames[NumLibFuncs]; + bool ShouldExtI32Param, ShouldExtI32Return, ShouldSignExtI32Param; + + void setState(LibFunc F, AvailabilityState State) { Availability[F] = State; } + AvailabilityState getState(LibFunc F) const { return Availability[F]; } /// Vectorization descriptors - sorted by ScalarFnName. std::vector VectorDescs; @@ -395,11 +392,12 @@ explicit TargetLibraryInfoWrapperPass(const Triple &T); explicit TargetLibraryInfoWrapperPass(const TargetLibraryInfoImpl &TLI); - TargetLibraryInfo &getTLI(const Function &F LLVM_ATTRIBUTE_UNUSED) { + TargetLibraryInfo &getTLI(const Function &F) { + (void)F; return TLI; } - const TargetLibraryInfo & - getTLI(const Function &F LLVM_ATTRIBUTE_UNUSED) const { + const TargetLibraryInfo &getTLI(const Function &F) const { + (void)F; return TLI; } }; diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -552,56 +552,53 @@ TLI.addVectorizableFunctionsFromVecLib(ClVectorLibrary); } -TargetLibraryInfoImpl::TargetLibraryInfoImpl() { - // Default to everything being available. - memset(AvailableArray, -1, sizeof(AvailableArray)); - +TargetLibraryInfoImpl::TargetLibraryInfoImpl() : Availability(NumLibFuncs) { + for (size_t I = 0; I < NumLibFuncs; ++I) + Availability[I] = AvailabilityState::StandardName; initialize(*this, Triple(), StandardNames); } -TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) { - // Default to everything being available. - memset(AvailableArray, -1, sizeof(AvailableArray)); - +TargetLibraryInfoImpl::TargetLibraryInfoImpl(const Triple &T) + : Availability(NumLibFuncs) { + for (size_t I = 0; I < NumLibFuncs; ++I) + Availability[I] = AvailabilityState::StandardName; initialize(*this, T, StandardNames); } TargetLibraryInfoImpl::TargetLibraryInfoImpl(const TargetLibraryInfoImpl &TLI) - : CustomNames(TLI.CustomNames), ShouldExtI32Param(TLI.ShouldExtI32Param), + : Availability(TLI.Availability), CustomNames(TLI.CustomNames), + ShouldExtI32Param(TLI.ShouldExtI32Param), ShouldExtI32Return(TLI.ShouldExtI32Return), ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) { - memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); VectorDescs = TLI.VectorDescs; ScalarDescs = TLI.ScalarDescs; } TargetLibraryInfoImpl::TargetLibraryInfoImpl(TargetLibraryInfoImpl &&TLI) - : CustomNames(std::move(TLI.CustomNames)), + : Availability(std::move(TLI.Availability)), + CustomNames(std::move(TLI.CustomNames)), ShouldExtI32Param(TLI.ShouldExtI32Param), ShouldExtI32Return(TLI.ShouldExtI32Return), ShouldSignExtI32Param(TLI.ShouldSignExtI32Param) { - std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray), - AvailableArray); VectorDescs = TLI.VectorDescs; ScalarDescs = TLI.ScalarDescs; } TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(const TargetLibraryInfoImpl &TLI) { + Availability = TLI.Availability; CustomNames = TLI.CustomNames; ShouldExtI32Param = TLI.ShouldExtI32Param; ShouldExtI32Return = TLI.ShouldExtI32Return; ShouldSignExtI32Param = TLI.ShouldSignExtI32Param; - memcpy(AvailableArray, TLI.AvailableArray, sizeof(AvailableArray)); return *this; } TargetLibraryInfoImpl &TargetLibraryInfoImpl::operator=(TargetLibraryInfoImpl &&TLI) { + Availability = std::move(TLI.Availability); CustomNames = std::move(TLI.CustomNames); ShouldExtI32Param = TLI.ShouldExtI32Param; ShouldExtI32Return = TLI.ShouldExtI32Return; ShouldSignExtI32Param = TLI.ShouldSignExtI32Param; - std::move(std::begin(TLI.AvailableArray), std::end(TLI.AvailableArray), - AvailableArray); return *this; } @@ -1490,7 +1487,8 @@ } void TargetLibraryInfoImpl::disableAllFunctions() { - memset(AvailableArray, 0, sizeof(AvailableArray)); + for (size_t I = 0; I < NumLibFuncs; ++I) + Availability[I] = AvailabilityState::Unavailable; } static bool compareByScalarFnName(const VecDesc &LHS, const VecDesc &RHS) {