18template <
size_t FixedSize,
bool InlinePtrHash>
20 const void *SrcBuckets,
const UsedT *SrcUsed,
21 unsigned SrcNumBuckets,
size_t RuntimeSize,
23 const size_t BucketSize = FixedSize ? FixedSize : RuntimeSize;
24 char *Dst =
static_cast<char *
>(DstBuckets);
25 const char *Src =
static_cast<const char *
>(SrcBuckets);
27 const char *SrcBucket = Src +
static_cast<size_t>(
I) * BucketSize;
29 if constexpr (InlinePtrHash) {
31 std::memcpy(&
Key, SrcBucket,
sizeof(
Key));
34 Hash = Hasher(SrcBucket);
36 unsigned BucketNo = Hash & Mask;
37 while (
used(DstUsed, BucketNo))
38 BucketNo = (BucketNo + 1) & Mask;
39 std::memcpy(Dst +
static_cast<size_t>(BucketNo) * BucketSize, SrcBucket,
45template <
bool InlinePtrHash>
47 const void *Src,
const UsedT *SrcUsed,
48 unsigned SrcNumBuckets,
size_t BucketSize,
52#define REHASH_CASE(N) \
54 return rehashLoop<N, InlinePtrHash>(Dst, DstUsed, Mask, Src, SrcUsed, \
55 SrcNumBuckets, BucketSize, Hasher);
67 SrcNumBuckets, BucketSize, Hasher);
72 unsigned DstNumBuckets,
73 const void *Src,
const UsedT *SrcUsed,
74 unsigned SrcNumBuckets,
77 const unsigned Mask = DstNumBuckets - 1;
86 unsigned OldNumBuckets,
87 unsigned NewNumBuckets,
88 size_t BucketSize,
size_t Align,
91 UsedT *NewUsed =
usedFor(Storage, BucketSize, NewNumBuckets);
95 OldNumBuckets, BucketSize, Hasher);
static void rehashLoop(void *DstBuckets, UsedT *DstUsed, unsigned Mask, const void *SrcBuckets, const UsedT *SrcUsed, unsigned SrcNumBuckets, size_t RuntimeSize, BucketHasher Hasher)
static void rehashBySize(void *Dst, UsedT *DstUsed, unsigned Mask, const void *Src, const UsedT *SrcUsed, unsigned SrcNumBuckets, size_t BucketSize, BucketHasher Hasher)
This file defines the DenseMap class.
This file defines counterparts of C library allocation functions defined in the namespace 'std'.
void setUsed(UsedT *U, size_t I)
UsedT * usedFor(void *Buckets, size_t BucketSize, unsigned Num)
void clearUsed(UsedT *U, unsigned Num)
LLVM_ATTRIBUTE_ALWAYS_INLINE void forEachUsed(const UsedT *U, unsigned N, Fn Func)
size_t allocBytes(size_t BucketSize, unsigned Num)
unsigned(*)(const void *Key) BucketHasher
Hashes the key, at offset 0 in a bucket.
LLVM_ABI void * growRelocatable(void *OldBuckets, const UsedT *OldUsed, unsigned OldNumBuckets, unsigned NewNumBuckets, size_t BucketSize, size_t Align, BucketHasher Hasher, bool FreeOld)
Allocate a table of NewNumBuckets buckets and rehash the OldNumBuckets buckets at OldBuckets into it,...
bool used(const UsedT *U, size_t I)
LLVM_ABI void rehashRelocatable(void *Dst, UsedT *DstUsed, unsigned DstNumBuckets, const void *Src, const UsedT *SrcUsed, unsigned SrcNumBuckets, size_t BucketSize, BucketHasher Hasher)
Rehash the live buckets of Src into the empty Dst, which must have room for all of them.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void * allocate_buffer(size_t Size, size_t Alignment)
Allocate a buffer of memory with the given size and alignment.
LLVM_ABI void deallocate_buffer(void *Ptr, size_t Size, size_t Alignment)
Deallocate a buffer of memory with the given size and alignment.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
This struct is a compact representation of a valid (non-zero power of two) alignment.
An information struct used to provide DenseMap with the various necessary components for a given valu...