diff --git a/include/llvm/ADT/FoldingSet.h b/include/llvm/ADT/FoldingSet.h index 287127243e7..dbf10aa63ef 100644 --- a/include/llvm/ADT/FoldingSet.h +++ b/include/llvm/ADT/FoldingSet.h @@ -143,6 +143,9 @@ public: void SetNextInBucket(void *N) { NextInFoldingSetBucket = N; } }; + /// clear - Remove all nodes from the folding set. + void clear(); + /// RemoveNode - Remove a node from the folding set, returning true if one /// was removed or false if the node was not in the folding set. bool RemoveNode(Node *N); diff --git a/lib/Support/FoldingSet.cpp b/lib/Support/FoldingSet.cpp index 6966ec8a153..5a96dcd4485 100644 --- a/lib/Support/FoldingSet.cpp +++ b/lib/Support/FoldingSet.cpp @@ -200,19 +200,26 @@ static void **GetBucketFor(const FoldingSetNodeID &ID, //===----------------------------------------------------------------------===// // FoldingSetImpl Implementation -FoldingSetImpl::FoldingSetImpl(unsigned Log2InitSize) : NumNodes(0) { +FoldingSetImpl::FoldingSetImpl(unsigned Log2InitSize) { assert(5 < Log2InitSize && Log2InitSize < 32 && "Initial hash table size out of range"); NumBuckets = 1 << Log2InitSize; Buckets = new void*[NumBuckets+1]; - memset(Buckets, 0, NumBuckets*sizeof(void*)); - - // Set the very last bucket to be a non-null "pointer". - Buckets[NumBuckets] = reinterpret_cast(-1); + clear(); } FoldingSetImpl::~FoldingSetImpl() { delete [] Buckets; } +void FoldingSetImpl::clear() { + // Set all but the last bucket to null pointers. + memset(Buckets, 0, NumBuckets*sizeof(void*)); + + // Set the very last bucket to be a non-null "pointer". + Buckets[NumBuckets] = reinterpret_cast(-1); + + // Reset the node count to zero. + NumNodes = 0; +} /// GrowHashTable - Double the size of the hash table and rehash everything. /// @@ -221,15 +228,9 @@ void FoldingSetImpl::GrowHashTable() { unsigned OldNumBuckets = NumBuckets; NumBuckets <<= 1; - // Reset the node count to zero: we're going to reinsert everything. - NumNodes = 0; - // Clear out new buckets. Buckets = new void*[NumBuckets+1]; - memset(Buckets, 0, NumBuckets*sizeof(void*)); - - // Set the very last bucket to be a non-null "pointer". - Buckets[NumBuckets] = reinterpret_cast(-1); + clear(); // Walk the old buckets, rehashing nodes into their new place. FoldingSetNodeID ID;