diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2009-09-06 15:41:38 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2009-09-06 15:41:38 +0000 |
commit | f7d601a5bd4fddecedc87ac0a4a57921dac8da60 (patch) | |
tree | 3d4ffb55ede66ac17b980b5df1a89b5c78ca7489 | |
parent | 0d8d6c874e66e197f3af5c7835c7f0b0ff52f0ac (diff) | |
download | gcc-f7d601a5bd4fddecedc87ac0a4a57921dac8da60.zip gcc-f7d601a5bd4fddecedc87ac0a4a57921dac8da60.tar.gz gcc-f7d601a5bd4fddecedc87ac0a4a57921dac8da60.tar.bz2 |
re PR libstdc++/41267 (vector<>::resize() from an empty vector calls memmove for 0 bytes (twice), wasting a lot of cpu time in a production PowerDNS)
2009-09-06 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/41267
* include/bits/stl_algobase.h (__copy_move::__copy_m,
__copy_move_backward::__copy_move_b): Don't call __builtin_memmove
with a null third argument.
From-SVN: r151459
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 10 |
2 files changed, 13 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 44da8a3..acc7355 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2009-09-06 Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/41267 + * include/bits/stl_algobase.h (__copy_move::__copy_m, + __copy_move_backward::__copy_move_b): Don't call __builtin_memmove + with a null third argument. + 2009-09-04 Benjamin Kosnik <bkoz@redhat.com> Revert. diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index 2cef923..c638c54 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -375,9 +375,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) static _Tp* __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result) { - __builtin_memmove(__result, __first, - sizeof(_Tp) * (__last - __first)); - return __result + (__last - __first); + const ptrdiff_t _Num = __last - __first; + if (_Num) + __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); + return __result + _Num; } }; @@ -572,7 +573,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) __copy_move_b(const _Tp* __first, const _Tp* __last, _Tp* __result) { const ptrdiff_t _Num = __last - __first; - __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num); + if (_Num) + __builtin_memmove(__result - _Num, __first, sizeof(_Tp) * _Num); return __result - _Num; } }; |