summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/SmallPtrSet.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-07-24 21:31:23 +0000
committerOwen Anderson <resistor@mac.com>2007-07-24 21:31:23 +0000
commit4c540243191e7598c397068c4f27e824ce7d505f (patch)
treed7a20ff21cbeed52dfa9191a0cf983a739642795 /llvm/lib/Support/SmallPtrSet.cpp
parent0c46451d2b749dabe19eb09c1d4d70374347ac0a (diff)
downloadbcm5719-llvm-4c540243191e7598c397068c4f27e824ce7d505f.tar.gz
bcm5719-llvm-4c540243191e7598c397068c4f27e824ce7d505f.zip
Make the copy constructor of SmallPtrSet much faster.
llvm-svn: 40474
Diffstat (limited to 'llvm/lib/Support/SmallPtrSet.cpp')
-rw-r--r--llvm/lib/Support/SmallPtrSet.cpp34
1 files changed, 12 insertions, 22 deletions
diff --git a/llvm/lib/Support/SmallPtrSet.cpp b/llvm/lib/Support/SmallPtrSet.cpp
index 122a71da929..33269231155 100644
--- a/llvm/lib/Support/SmallPtrSet.cpp
+++ b/llvm/lib/Support/SmallPtrSet.cpp
@@ -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
OpenPOWER on IntegriCloud