[Bug middle-end/86471] GCC/libstdc++ outputs inferior code for std::fill and std::fill_n vs std::memset on c-style arrays
mattreecebentley at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Jul 15 12:38:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86471
--- Comment #10 from Matt Bentley <mattreecebentley at gmail dot com> ---
(In reply to Marc Glisse from comment #9)
> (In reply to Andrew Pinski from comment #7)
> We could also use __builtin_constant_p, if the function is inlined often
> enough (don't know if it is).
Right - so then the proposed function becomes:
template<typename _ForwardIterator, typename _Tp>
inline typename
__gnu_cxx::__enable_if<__is_pointer_helper<_Tp>::__value ||
__is_integral_helper<_Tp>::__value, void>::__type
__fill_a(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __value)
{
if (__builtin_constant_p(__value) == 1)
{
if (__value != reinterpret_cast<_Tp>(0))
{
const _Tp __tmp = __value;
for (; __first != __last; ++__first)
*__first = __tmp;
}
else
{
if (const size_t __len = __last - __first)
__builtin_memset(reinterpret_cast<void *>(__first), 0,
__len *
sizeof(_Tp));
}
}
else
{
const _Tp __tmp = __value;
for (; __first != __last; ++__first)
*__first = __tmp;
}
}
, if I'm getting the enable_if syntax correct?
More information about the Gcc-bugs
mailing list