[llvm] [ADT] Extract DenseMapStorage from DenseMap (NFC) (PR #226664)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 27 18:28:31 PDT 2026
================
@@ -192,6 +192,101 @@ LLVM_ABI void *growRelocatable(void *OldBuckets, const UsedT *OldUsed,
size_t BucketSize, size_t Align,
BucketHasher Hasher, bool FreeOld);
+// A snapshot of the three fields the hot lookup paths need. Fetching them
+// together lets SmallDenseMap test its Small discriminator once rather than
+// once per accessor; for plain DenseMap it is three member loads either way.
+template <typename BucketT> struct StorageRep {
+ const BucketT *Buckets;
+ const UsedT *Used;
+ unsigned NumBuckets;
+};
+
+template <typename BucketT> class DenseMapStorage {
+ BucketT *Buckets = nullptr;
+ UsedT *Used = nullptr;
+ unsigned NumEntries = 0;
+ unsigned NumBuckets = 0;
+
+public:
+ DenseMapStorage() = default;
+
+ unsigned getNumEntries() const { return NumEntries; }
+ void setNumEntries(unsigned Num) { NumEntries = Num; }
+
+ BucketT *getBuckets() const { return Buckets; }
+ UsedT *getUsed() const { return Used; }
+ unsigned getNumBuckets() const { return NumBuckets; }
+ StorageRep<BucketT> getRep() const { return {Buckets, Used, NumBuckets}; }
+
+ void swap(DenseMapStorage &RHS) {
+ std::swap(Buckets, RHS.Buckets);
+ std::swap(Used, RHS.Used);
+ std::swap(NumEntries, RHS.NumEntries);
+ std::swap(NumBuckets, RHS.NumBuckets);
+ }
+
+ void setStorage(void *Storage, unsigned Num) {
+ Buckets = static_cast<BucketT *>(Storage);
+ Used = usedFor(Storage, sizeof(BucketT), Num);
+ NumBuckets = Num;
+ }
+
+ void growShared(unsigned MinNumBuckets, BucketHasher Hasher) {
----------------
MaskRay wrote:
Just `grow`
https://github.com/llvm/llvm-project/pull/226664
More information about the llvm-commits
mailing list