File tree 2 files changed +23
-5
lines changed
2 files changed +23
-5
lines changed Original file line number Diff line number Diff line change @@ -185,8 +185,8 @@ class SmallPtrSetImplBase : public DebugEpochBase {
185
185
return false ;
186
186
}
187
187
188
- auto *Bucket = FindBucketFor (Ptr );
189
- if (*Bucket != Ptr )
188
+ auto *Bucket = doFind (Ptr );
189
+ if (!Bucket )
190
190
return false ;
191
191
192
192
*const_cast <const void **>(Bucket) = getTombstoneMarker ();
@@ -211,8 +211,7 @@ class SmallPtrSetImplBase : public DebugEpochBase {
211
211
}
212
212
213
213
// Big set case.
214
- auto *Bucket = FindBucketFor (Ptr );
215
- if (*Bucket == Ptr )
214
+ if (auto *Bucket = doFind (Ptr ))
216
215
return Bucket;
217
216
return EndPointer ();
218
217
}
@@ -222,6 +221,7 @@ class SmallPtrSetImplBase : public DebugEpochBase {
222
221
private:
223
222
std::pair<const void *const *, bool > insert_imp_big (const void *Ptr );
224
223
224
+ const void *const *doFind (const void *Ptr ) const ;
225
225
const void * const *FindBucketFor (const void *Ptr ) const ;
226
226
void shrink_and_clear ();
227
227
Original file line number Diff line number Diff line change @@ -62,7 +62,25 @@ SmallPtrSetImplBase::insert_imp_big(const void *Ptr) {
62
62
return std::make_pair (Bucket, true );
63
63
}
64
64
65
- const void * const *SmallPtrSetImplBase::FindBucketFor (const void *Ptr ) const {
65
+ const void *const *SmallPtrSetImplBase::doFind (const void *Ptr ) const {
66
+ unsigned BucketNo =
67
+ DenseMapInfo<void *>::getHashValue (Ptr ) & (CurArraySize - 1 );
68
+ unsigned ProbeAmt = 1 ;
69
+ while (true ) {
70
+ const void *const *Bucket = CurArray + BucketNo;
71
+ if (LLVM_LIKELY (*Bucket == Ptr ))
72
+ return Bucket;
73
+ if (LLVM_LIKELY (*Bucket == getEmptyMarker ()))
74
+ return nullptr ;
75
+
76
+ // Otherwise, it's a hash collision or a tombstone, continue quadratic
77
+ // probing.
78
+ BucketNo += ProbeAmt++;
79
+ BucketNo &= CurArraySize - 1 ;
80
+ }
81
+ }
82
+
83
+ const void *const *SmallPtrSetImplBase::FindBucketFor (const void *Ptr ) const {
66
84
unsigned Bucket = DenseMapInfo<void *>::getHashValue (Ptr ) & (CurArraySize-1 );
67
85
unsigned ArraySize = CurArraySize;
68
86
unsigned ProbeAmt = 1 ;
You can’t perform that action at this time.
0 commit comments