[llvm-commits] [llvm] r40474 - /llvm/trunk/lib/Support/SmallPtrSet.cpp

Owen Anderson resistor at mac.com
Tue Jul 24 14:31:23 PDT 2007


Author: resistor
Date: Tue Jul 24 16:31:23 2007
New Revision: 40474

URL: http://llvm.org/viewvc/llvm-project?rev=40474&view=rev
Log:
Make the copy constructor of SmallPtrSet much faster.

Modified:
    llvm/trunk/lib/Support/SmallPtrSet.cpp

Modified: llvm/trunk/lib/Support/SmallPtrSet.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SmallPtrSet.cpp?rev=40474&r1=40473&r2=40474&view=diff

==============================================================================
--- llvm/trunk/lib/Support/SmallPtrSet.cpp (original)
+++ llvm/trunk/lib/Support/SmallPtrSet.cpp Tue Jul 24 16:31:23 2007
@@ -149,33 +149,23 @@
 }
 
 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





More information about the llvm-commits mailing list