[llvm] [ADT] Use range-based for loops in SmallPtrSet (NFC) (PR #152882)

Kazu Hirata via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 9 15:10:25 PDT 2025


https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/152882

This patch introduces helper function buckets() to convert two loops
to range-based for loops.


>From d567bf5f9b2d692d27521fe95da5efbe483ea937 Mon Sep 17 00:00:00 2001
From: Kazu Hirata <kazu at google.com>
Date: Sat, 9 Aug 2025 07:07:37 -0700
Subject: [PATCH] [ADT] Use range-based for loops in SmallPtrSet (NFC)

This patch introduces helper function buckets() to convert two loops
to range-based for loops.
---
 llvm/include/llvm/ADT/SmallPtrSet.h | 13 ++++++++-----
 llvm/lib/Support/SmallPtrSet.cpp    | 12 +++++-------
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/llvm/include/llvm/ADT/SmallPtrSet.h b/llvm/include/llvm/ADT/SmallPtrSet.h
index 88aedf26dcaac..f0f28ac37761e 100644
--- a/llvm/include/llvm/ADT/SmallPtrSet.h
+++ b/llvm/include/llvm/ADT/SmallPtrSet.h
@@ -156,6 +156,10 @@ class SmallPtrSetImplBase : public DebugEpochBase {
     return {CurArray, CurArray + NumNonEmpty};
   }
 
+  iterator_range<const void **> buckets() {
+    return make_range(CurArray, EndPointer());
+  }
+
   /// insert_imp - This returns true if the pointer was new to the set, false if
   /// it was already in the set.  This is hidden from the client so that the
   /// derived class can check that the right type of pointer is passed in.
@@ -441,13 +445,12 @@ class SmallPtrSetImpl : public SmallPtrSetImplBase {
       return Removed;
     }
 
-    for (const void **APtr = CurArray, **E = EndPointer(); APtr != E; ++APtr) {
-      const void *Value = *APtr;
-      if (Value == getTombstoneMarker() || Value == getEmptyMarker())
+    for (const void *&Bucket : buckets()) {
+      if (Bucket == getTombstoneMarker() || Bucket == getEmptyMarker())
         continue;
-      PtrType Ptr = PtrTraits::getFromVoidPointer(const_cast<void *>(Value));
+      PtrType Ptr = PtrTraits::getFromVoidPointer(const_cast<void *>(Bucket));
       if (P(Ptr)) {
-        *APtr = getTombstoneMarker();
+        Bucket = getTombstoneMarker();
         ++NumTombstones;
         incrementEpoch();
         Removed = true;
diff --git a/llvm/lib/Support/SmallPtrSet.cpp b/llvm/lib/Support/SmallPtrSet.cpp
index 83143a7fe80fa..0c226970906d9 100644
--- a/llvm/lib/Support/SmallPtrSet.cpp
+++ b/llvm/lib/Support/SmallPtrSet.cpp
@@ -110,8 +110,7 @@ const void *const *SmallPtrSetImplBase::FindBucketFor(const void *Ptr) const {
 /// Grow - Allocate a larger backing store for the buckets and move it over.
 ///
 void SmallPtrSetImplBase::Grow(unsigned NewSize) {
-  const void **OldBuckets = CurArray;
-  const void **OldEnd = EndPointer();
+  auto OldBuckets = buckets();
   bool WasSmall = isSmall();
 
   // Install the new array.  Clear all the buckets to empty.
@@ -123,15 +122,14 @@ void SmallPtrSetImplBase::Grow(unsigned NewSize) {
   memset(CurArray, -1, NewSize*sizeof(void*));
 
   // Copy over all valid entries.
-  for (const void **BucketPtr = OldBuckets; BucketPtr != OldEnd; ++BucketPtr) {
+  for (const void *&Bucket : OldBuckets) {
     // Copy over the element if it is valid.
-    const void *Elt = *BucketPtr;
-    if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
-      *const_cast<void**>(FindBucketFor(Elt)) = const_cast<void*>(Elt);
+    if (Bucket != getTombstoneMarker() && Bucket != getEmptyMarker())
+      *const_cast<void **>(FindBucketFor(Bucket)) = const_cast<void *>(Bucket);
   }
 
   if (!WasSmall)
-    free(OldBuckets);
+    free(OldBuckets.begin());
   NumNonEmpty -= NumTombstones;
   NumTombstones = 0;
   IsSmall = false;



More information about the llvm-commits mailing list