summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2010-06-08 11:44:30 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2010-06-08 11:44:30 +0000
commitd164d3d9e74aa099ce7ef86ac0724fe504f7c3f9 (patch)
treef1514d4f5ce92aa15f9fed424d52667db54d40c8
parente77ff11a346a76a61c1d9669db8c894bc7b7144b (diff)
downloadexternal_llvm-d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9.zip
external_llvm-d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9.tar.gz
external_llvm-d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9.tar.bz2
Use realloc instead of malloc+memcpy when growing a POD SmallVector. A smart
realloc implementation can try to expand the allocated memory block in-place, avoiding the copy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105605 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/SmallVector.h7
-rw-r--r--lib/Support/SmallVector.cpp21
2 files changed, 16 insertions, 12 deletions
diff --git a/include/llvm/ADT/SmallVector.h b/include/llvm/ADT/SmallVector.h
index 0f0aedb..e4fa809 100644
--- a/include/llvm/ADT/SmallVector.h
+++ b/include/llvm/ADT/SmallVector.h
@@ -17,6 +17,7 @@
#include "llvm/Support/type_traits.h"
#include <algorithm>
#include <cassert>
+#include <cstdlib>
#include <cstring>
#include <memory>
@@ -207,7 +208,7 @@ void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
size_t NewCapacity = 2*CurCapacity;
if (NewCapacity < MinSize)
NewCapacity = MinSize;
- T *NewElts = static_cast<T*>(operator new(NewCapacity*sizeof(T)));
+ T *NewElts = static_cast<T*>(malloc(NewCapacity*sizeof(T)));
// Copy the elements over.
this->uninitialized_copy(this->begin(), this->end(), NewElts);
@@ -217,7 +218,7 @@ void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
- operator delete(this->begin());
+ free(this->begin());
this->setEnd(NewElts+CurSize);
this->BeginX = NewElts;
@@ -282,7 +283,7 @@ public:
// If this wasn't grown from the inline copy, deallocate the old space.
if (!this->isSmall())
- operator delete(this->begin());
+ free(this->begin());
}
diff --git a/lib/Support/SmallVector.cpp b/lib/Support/SmallVector.cpp
index 6821382..2e17af8 100644
--- a/lib/Support/SmallVector.cpp
+++ b/lib/Support/SmallVector.cpp
@@ -21,15 +21,18 @@ void SmallVectorBase::grow_pod(size_t MinSizeInBytes, size_t TSize) {
size_t NewCapacityInBytes = 2 * capacity_in_bytes();
if (NewCapacityInBytes < MinSizeInBytes)
NewCapacityInBytes = MinSizeInBytes;
- void *NewElts = operator new(NewCapacityInBytes);
-
- // Copy the elements over. No need to run dtors on PODs.
- memcpy(NewElts, this->BeginX, CurSizeBytes);
-
- // If this wasn't grown from the inline copy, deallocate the old space.
- if (!this->isSmall())
- operator delete(this->BeginX);
-
+
+ void *NewElts;
+ if (this->isSmall()) {
+ NewElts = malloc(NewCapacityInBytes);
+
+ // Copy the elements over. No need to run dtors on PODs.
+ memcpy(NewElts, this->BeginX, CurSizeBytes);
+ } else {
+ // If this wasn't grown from the inline copy, grow the allocated space.
+ NewElts = realloc(this->BeginX, NewCapacityInBytes);
+ }
+
this->EndX = (char*)NewElts+CurSizeBytes;
this->BeginX = NewElts;
this->CapacityX = (char*)this->BeginX + NewCapacityInBytes;