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 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(Value)); + PtrType Ptr = PtrTraits::getFromVoidPointer(const_cast(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(FindBucketFor(Elt)) = const_cast(Elt); + if (Bucket != getTombstoneMarker() && Bucket != getEmptyMarker()) + *const_cast(FindBucketFor(Bucket)) = const_cast(Bucket); } if (!WasSmall) - free(OldBuckets); + free(OldBuckets.begin()); NumNonEmpty -= NumTombstones; NumTombstones = 0; IsSmall = false;