[llvm] r212816 - raw_svector_ostream: grow and reserve atomically
Alp Toker
alp at nuanti.com
Fri Jul 11 07:02:04 PDT 2014
Author: alp
Date: Fri Jul 11 09:02:04 2014
New Revision: 212816
URL: http://llvm.org/viewvc/llvm-project?rev=212816&view=rev
Log:
raw_svector_ostream: grow and reserve atomically
Including the scratch buffer size in the initial reservation eliminates the
subsequent malloc+move operation and offers a healthier constant growth with
less memory wastage.
When doing this, take care to avoid invalidating the source buffer.
Modified:
llvm/trunk/lib/Support/raw_ostream.cpp
Modified: llvm/trunk/lib/Support/raw_ostream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=212816&r1=212815&r2=212816&view=diff
==============================================================================
--- llvm/trunk/lib/Support/raw_ostream.cpp (original)
+++ llvm/trunk/lib/Support/raw_ostream.cpp Fri Jul 11 09:02:04 2014
@@ -729,24 +729,26 @@ void raw_svector_ostream::resync() {
}
void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
- // If we're writing bytes from the end of the buffer into the smallvector, we
- // don't need to copy the bytes, just commit the bytes because they are
- // already in the right place.
- if (Ptr == OS.end()) {
- assert(OS.size() + Size <= OS.capacity() && "Invalid write_impl() call!");
- OS.set_size(OS.size() + Size);
+ size_t NewSize = OS.size() + Size;
+ size_t NewReservation = NewSize + 64;
+
+ bool NoOverlap = Ptr + Size < OS.begin() || Ptr > OS.begin() + OS.capacity();
+
+ if (NoOverlap) {
+ assert(!GetNumBytesInBuffer());
+ OS.reserve(NewReservation);
+ memcpy(OS.end(), Ptr, Size);
+ OS.set_size(NewSize);
+ } else if (Ptr == OS.end()) {
+ // Grow the buffer to include the scratch area without copying.
+ assert(NewSize <= OS.capacity() && "Invalid write_impl() call!");
+ OS.set_size(NewSize);
+ OS.reserve(NewReservation);
} else {
- assert(GetNumBytesInBuffer() == 0 &&
- "Should be writing from buffer if some bytes in it");
- // Otherwise, do copy the bytes.
- OS.append(Ptr, Ptr+Size);
+ OS.append(Ptr, Ptr + Size);
+ OS.reserve(NewReservation);
}
- // Grow the vector if necessary.
- if (OS.capacity() - OS.size() < 64)
- OS.reserve(OS.capacity() * 2);
-
- // Update the buffer position.
SetBuffer(OS.end(), OS.capacity() - OS.size());
}
More information about the llvm-commits
mailing list