diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2010-06-08 11:44:30 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2010-06-08 11:44:30 +0000 |
commit | 4e36e5bb4c194a474e653e74bb9c465af90511fb (patch) | |
tree | a301be48168dbeff055b1b561df73ec64110f6bd /llvm/lib/Support/SmallVector.cpp | |
parent | 05911246083206723b4e025286bdfa8da6574e76 (diff) | |
download | bcm5719-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.cpp | 21 |
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; |