aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2009-09-06 15:41:38 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2009-09-06 15:41:38 +0000
commitf7d601a5bd4fddecedc87ac0a4a57921dac8da60 (patch)
tree3d4ffb55ede66ac17b980b5df1a89b5c78ca7489
parent0d8d6c874e66e197f3af5c7835c7f0b0ff52f0ac (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/stl_algobase.h10
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;
}
};