summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/SmallVector.cpp
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
commit4e36e5bb4c194a474e653e74bb9c465af90511fb (patch)
treea301be48168dbeff055b1b561df73ec64110f6bd /llvm/lib/Support/SmallVector.cpp
parent05911246083206723b4e025286bdfa8da6574e76 (diff)
downloadbcm5719-llvm-4e36e5bb4c194a474e653e74bb9c465af90511fb.tar.gz
bcm5719-llvm-4e36e5bb4c194a474e653e74bb9c465af90511fb.zip
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. llvm-svn: 105605
Diffstat (limited to 'llvm/lib/Support/SmallVector.cpp')
-rw-r--r--llvm/lib/Support/SmallVector.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/Support/SmallVector.cpp b/llvm/lib/Support/SmallVector.cpp
index 6821382bb3c..2e17af86415 100644
--- a/llvm/lib/Support/SmallVector.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud