mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
DenseMap: Perform the pod-like object optimization when the value type is POD-like, not the DenseMapInfo for it.
Purge now unused template arguments. This has been broken since r91421. Patch by Lubos Lunak! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154170 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9a2b6e1d7b
commit
4e58263459
@ -30,12 +30,11 @@ namespace llvm {
|
||||
|
||||
template<typename KeyT, typename ValueT,
|
||||
typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||
typename ValueInfoT = DenseMapInfo<ValueT>, bool IsConst = false>
|
||||
bool IsConst = false>
|
||||
class DenseMapIterator;
|
||||
|
||||
template<typename KeyT, typename ValueT,
|
||||
typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||
typename ValueInfoT = DenseMapInfo<ValueT> >
|
||||
typename KeyInfoT = DenseMapInfo<KeyT> >
|
||||
class DenseMap {
|
||||
typedef std::pair<KeyT, ValueT> BucketT;
|
||||
unsigned NumBuckets;
|
||||
@ -80,7 +79,7 @@ public:
|
||||
|
||||
typedef DenseMapIterator<KeyT, ValueT, KeyInfoT> iterator;
|
||||
typedef DenseMapIterator<KeyT, ValueT,
|
||||
KeyInfoT, ValueInfoT, true> const_iterator;
|
||||
KeyInfoT, true> const_iterator;
|
||||
inline iterator begin() {
|
||||
// When the map is empty, avoid the overhead of AdvancePastEmptyBuckets().
|
||||
return empty() ? end() : iterator(Buckets, Buckets+NumBuckets);
|
||||
@ -256,7 +255,7 @@ public:
|
||||
private:
|
||||
void CopyFrom(const DenseMap& other) {
|
||||
if (NumBuckets != 0 &&
|
||||
(!isPodLike<KeyInfoT>::value || !isPodLike<ValueInfoT>::value)) {
|
||||
(!isPodLike<KeyT>::value || !isPodLike<ValueT>::value)) {
|
||||
const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
|
||||
for (BucketT *P = Buckets, *E = Buckets+NumBuckets; P != E; ++P) {
|
||||
if (!KeyInfoT::isEqual(P->first, EmptyKey) &&
|
||||
@ -285,7 +284,7 @@ private:
|
||||
|
||||
Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
|
||||
|
||||
if (isPodLike<KeyInfoT>::value && isPodLike<ValueInfoT>::value)
|
||||
if (isPodLike<KeyT>::value && isPodLike<ValueT>::value)
|
||||
memcpy(Buckets, other.Buckets, NumBuckets * sizeof(BucketT));
|
||||
else
|
||||
for (size_t i = 0; i < NumBuckets; ++i) {
|
||||
@ -502,12 +501,12 @@ public:
|
||||
};
|
||||
|
||||
template<typename KeyT, typename ValueT,
|
||||
typename KeyInfoT, typename ValueInfoT, bool IsConst>
|
||||
typename KeyInfoT, bool IsConst>
|
||||
class DenseMapIterator {
|
||||
typedef std::pair<KeyT, ValueT> Bucket;
|
||||
typedef DenseMapIterator<KeyT, ValueT,
|
||||
KeyInfoT, ValueInfoT, true> ConstIterator;
|
||||
friend class DenseMapIterator<KeyT, ValueT, KeyInfoT, ValueInfoT, true>;
|
||||
KeyInfoT, true> ConstIterator;
|
||||
friend class DenseMapIterator<KeyT, ValueT, KeyInfoT, true>;
|
||||
public:
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef typename conditional<IsConst, const Bucket, Bucket>::type value_type;
|
||||
@ -528,7 +527,7 @@ public:
|
||||
// const_iterator and the default copy constructor is used.
|
||||
// Otherwise this is a copy constructor for iterator.
|
||||
DenseMapIterator(const DenseMapIterator<KeyT, ValueT,
|
||||
KeyInfoT, ValueInfoT, false>& I)
|
||||
KeyInfoT, false>& I)
|
||||
: Ptr(I.Ptr), End(I.End) {}
|
||||
|
||||
reference operator*() const {
|
||||
@ -566,9 +565,9 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
template<typename KeyT, typename ValueT, typename KeyInfoT, typename ValueInfoT>
|
||||
template<typename KeyT, typename ValueT, typename KeyInfoT>
|
||||
static inline size_t
|
||||
capacity_in_bytes(const DenseMap<KeyT, ValueT, KeyInfoT, ValueInfoT> &X) {
|
||||
capacity_in_bytes(const DenseMap<KeyT, ValueT, KeyInfoT> &X) {
|
||||
return X.getMemorySize();
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
template<typename KeyT, typename ValueT, typename Config, typename ValueInfoT>
|
||||
template<typename KeyT, typename ValueT, typename Config>
|
||||
class ValueMapCallbackVH;
|
||||
|
||||
template<typename DenseMapT, typename KeyT>
|
||||
@ -72,13 +72,11 @@ struct ValueMapConfig {
|
||||
};
|
||||
|
||||
/// See the file comment.
|
||||
template<typename KeyT, typename ValueT, typename Config = ValueMapConfig<KeyT>,
|
||||
typename ValueInfoT = DenseMapInfo<ValueT> >
|
||||
template<typename KeyT, typename ValueT, typename Config =ValueMapConfig<KeyT> >
|
||||
class ValueMap {
|
||||
friend class ValueMapCallbackVH<KeyT, ValueT, Config, ValueInfoT>;
|
||||
typedef ValueMapCallbackVH<KeyT, ValueT, Config, ValueInfoT> ValueMapCVH;
|
||||
typedef DenseMap<ValueMapCVH, ValueT, DenseMapInfo<ValueMapCVH>,
|
||||
ValueInfoT> MapT;
|
||||
friend class ValueMapCallbackVH<KeyT, ValueT, Config>;
|
||||
typedef ValueMapCallbackVH<KeyT, ValueT, Config> ValueMapCVH;
|
||||
typedef DenseMap<ValueMapCVH, ValueT, DenseMapInfo<ValueMapCVH> > MapT;
|
||||
typedef typename Config::ExtraData ExtraData;
|
||||
MapT Map;
|
||||
ExtraData Data;
|
||||
@ -190,11 +188,11 @@ private:
|
||||
|
||||
// This CallbackVH updates its ValueMap when the contained Value changes,
|
||||
// according to the user's preferences expressed through the Config object.
|
||||
template<typename KeyT, typename ValueT, typename Config, typename ValueInfoT>
|
||||
template<typename KeyT, typename ValueT, typename Config>
|
||||
class ValueMapCallbackVH : public CallbackVH {
|
||||
friend class ValueMap<KeyT, ValueT, Config, ValueInfoT>;
|
||||
friend class ValueMap<KeyT, ValueT, Config>;
|
||||
friend struct DenseMapInfo<ValueMapCallbackVH>;
|
||||
typedef ValueMap<KeyT, ValueT, Config, ValueInfoT> ValueMapT;
|
||||
typedef ValueMap<KeyT, ValueT, Config> ValueMapT;
|
||||
typedef typename llvm::remove_pointer<KeyT>::type KeySansPointerT;
|
||||
|
||||
ValueMapT *Map;
|
||||
@ -244,9 +242,9 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
template<typename KeyT, typename ValueT, typename Config, typename ValueInfoT>
|
||||
struct DenseMapInfo<ValueMapCallbackVH<KeyT, ValueT, Config, ValueInfoT> > {
|
||||
typedef ValueMapCallbackVH<KeyT, ValueT, Config, ValueInfoT> VH;
|
||||
template<typename KeyT, typename ValueT, typename Config>
|
||||
struct DenseMapInfo<ValueMapCallbackVH<KeyT, ValueT, Config> > {
|
||||
typedef ValueMapCallbackVH<KeyT, ValueT, Config> VH;
|
||||
typedef DenseMapInfo<KeyT> PointerInfo;
|
||||
|
||||
static inline VH getEmptyKey() {
|
||||
|
@ -30,8 +30,7 @@ class GVMaterializer;
|
||||
class LLVMContext;
|
||||
class StructType;
|
||||
template<typename T> struct DenseMapInfo;
|
||||
template<typename KeyT, typename ValueT,
|
||||
typename KeyInfoT, typename ValueInfoT> class DenseMap;
|
||||
template<typename KeyT, typename ValueT, typename KeyInfoT> class DenseMap;
|
||||
|
||||
template<> struct ilist_traits<Function>
|
||||
: public SymbolTableListTraits<Function, Module> {
|
||||
@ -299,8 +298,8 @@ public:
|
||||
void getMDKindNames(SmallVectorImpl<StringRef> &Result) const;
|
||||
|
||||
|
||||
typedef DenseMap<StructType*, unsigned, DenseMapInfo<StructType*>,
|
||||
DenseMapInfo<unsigned> > NumeredTypesMapTy;
|
||||
typedef DenseMap<StructType*, unsigned, DenseMapInfo<StructType*> >
|
||||
NumeredTypesMapTy;
|
||||
|
||||
/// findUsedStructTypes - Walk the entire module and find all of the
|
||||
/// struct types that are in use, returning them in a vector.
|
||||
|
@ -66,7 +66,7 @@ struct isPodLike {
|
||||
// std::pair's are pod-like if their elements are.
|
||||
template<typename T, typename U>
|
||||
struct isPodLike<std::pair<T, U> > {
|
||||
static const bool value = isPodLike<T>::value & isPodLike<U>::value;
|
||||
static const bool value = isPodLike<T>::value && isPodLike<U>::value;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user