Make SmallVector's grow use memcpy in common cases
authorDan Gohman <gohman@apple.com>
Mon, 30 Jun 2008 21:45:13 +0000 (21:45 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 30 Jun 2008 21:45:13 +0000 (21:45 +0000)
instead of std::uninitialized_copy, which uses memmove.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52928 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/SmallVector.h

index 3d1640cb5710ad6d2587aee1a31220b22d5e7e95..daf6ee53fcf67c665632ca381ab0d02e89160e3f 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_ADT_SMALLVECTOR_H
 
 #include "llvm/ADT/iterator.h"
+#include "llvm/Support/type_traits.h"
 #include <algorithm>
 #include <memory>
 
@@ -349,7 +350,11 @@ void SmallVectorImpl<T>::grow(size_t MinSize) {
   T *NewElts = static_cast<T*>(operator new(NewCapacity*sizeof(T)));
   
   // Copy the elements over.
-  std::uninitialized_copy(Begin, End, NewElts);
+  if (is_class<T>::value)
+    std::uninitialized_copy(Begin, End, NewElts);
+  else
+    // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove).
+    memcpy(NewElts, Begin, CurSize * sizeof(T));
   
   // Destroy the original elements.
   destroy_range(Begin, End);