[Bug middle-end/86471] GCC/libstdc++ outputs inferior code for std::fill and std::fill_n vs std::memset on c-style arrays

pinskia at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Jul 12 23:35:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86471

--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Matt Bentley from comment #6)
> Suggested patch for libstdc++, std_algobase.h, line 688:
>   template<typename _ForwardIterator, typename _Tp>
>     inline typename
>     __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, void>::__type
>     __fill_a(_ForwardIterator __first, _ForwardIterator __last,
> 	     const _Tp& __value)
>     {
>       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));
> 		}
>     }
> 
> Comments?
This is incorrect for floating point types and non scalars.  And it introduces
an extra check at runtime if value is not known to compile time.


More information about the Gcc-bugs mailing list