Tweak vector::_M_realloc_insert for code size
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 16 Nov 2017 23:51:20 +0000 (00:51 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 16 Nov 2017 23:51:20 +0000 (23:51 +0000)
2017-11-17  Marc Glisse  <marc.glisse@inria.fr>

* include/bits/vector.tcc (vector::_M_realloc_insert): Cache old
values before the allocation.

From-SVN: r254849

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/vector.tcc

index 4fe0be1..3c9f3e7 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-17  Marc Glisse  <marc.glisse@inria.fr>
+
+       * include/bits/vector.tcc (vector::_M_realloc_insert): Cache old
+       values before the allocation.
+
 2017-11-16  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/std/future (shared_future): Add noexcept to copy constructor
index f14caaa..eadce3c 100644 (file)
@@ -421,6 +421,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     {
       const size_type __len =
        _M_check_len(size_type(1), "vector::_M_realloc_insert");
+      pointer __old_start = this->_M_impl._M_start;
+      pointer __old_finish = this->_M_impl._M_finish;
       const size_type __elems_before = __position - begin();
       pointer __new_start(this->_M_allocate(__len));
       pointer __new_finish(__new_start);
@@ -442,14 +444,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
          __new_finish
            = std::__uninitialized_move_if_noexcept_a
-           (this->_M_impl._M_start, __position.base(),
+           (__old_start, __position.base(),
             __new_start, _M_get_Tp_allocator());
 
          ++__new_finish;
 
          __new_finish
            = std::__uninitialized_move_if_noexcept_a
-           (__position.base(), this->_M_impl._M_finish,
+           (__position.base(), __old_finish,
             __new_finish, _M_get_Tp_allocator());
        }
       __catch(...)
@@ -463,10 +465,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
          __throw_exception_again;
        }
       _GLIBCXX_ASAN_ANNOTATE_REINIT;
-      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
-                   _M_get_Tp_allocator());
-      _M_deallocate(this->_M_impl._M_start,
-                   this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
+      std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
+      _M_deallocate(__old_start,
+                   this->_M_impl._M_end_of_storage - __old_start);
       this->_M_impl._M_start = __new_start;
       this->_M_impl._M_finish = __new_finish;
       this->_M_impl._M_end_of_storage = __new_start + __len;