Make the copy constructor of SmallPtrSet much faster.
authorOwen Anderson <resistor@mac.com>
Tue, 24 Jul 2007 21:31:23 +0000 (21:31 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 24 Jul 2007 21:31:23 +0000 (21:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40474 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/SmallPtrSet.cpp

index 122a71da929ace988e378dd3ee18c3cc0cac5c0d..3326923115545dbbd0fa5c7af18bf0e005997c62 100644 (file)
@@ -149,33 +149,23 @@ void SmallPtrSetImpl::Grow() {
 }
 
 SmallPtrSetImpl::SmallPtrSetImpl(const SmallPtrSetImpl& that) {
-  NumElements = that.NumElements;
-  NumTombstones = 0;
+  // If we're becoming small, prepare to insert into our stack space
   if (that.isSmall()) {
-    CurArraySize = that.CurArraySize;
     CurArray = &SmallArray[0];
-    // Copy the entire contents of the array, including the -1's and the null
-    // terminator.
-    memcpy(CurArray, that.CurArray, sizeof(void*)*(CurArraySize+1));
+  // Otherwise, allocate new heap space (unless we were the same size)
   } else {
-    CurArraySize = that.NumElements < 64 ? 128 : that.CurArraySize*2;
-    CurArray = (void**)malloc(sizeof(void*) * (CurArraySize+1));
+    CurArray = (void**)malloc(sizeof(void*) * (that.CurArraySize+1));
     assert(CurArray && "Failed to allocate memory?");
-    memset(CurArray, -1, CurArraySize*sizeof(void*));
-    
-    // The end pointer, always valid, is set to a valid element to help the
-    // iterator.
-    CurArray[CurArraySize] = 0;
-
-    // Copy over all valid entries.
-    for (void **BucketPtr = that.CurArray, **E = that.CurArray+that.CurArraySize;
-         BucketPtr != E; ++BucketPtr) {
-      // Copy over the element if it is valid.
-      void *Elt = *BucketPtr;
-      if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
-        *const_cast<void**>(FindBucketFor(Elt)) = Elt;
-    }
   }
+  
+  // Copy over the new array size
+  CurArraySize = that.CurArraySize;
+
+  // Copy over the contents from the other set
+  memcpy(CurArray, that.CurArray, sizeof(void*)*(CurArraySize+1));
+  
+  NumElements = that.NumElements;
+  NumTombstones = that.NumTombstones;
 }
 
 /// CopyFrom - implement operator= from a smallptrset that has the same pointer