https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80933
--- Comment #4 from Martin Sebor <msebor at gcc dot gnu.org> ---
There is so much special handling of all these built-ins in so many places that
makes keeping them all in sync with one another tricky business. I think it
would help if more of the salient properties of the major built-ins were
abstracted into general attributes and the handling code simplified to test for
the attributes instead. For instance, if there were a helper, say 'bool
is_call_bzero_like_p (gimple *)' then code similar to this (tree-ssa-sccvn.c)
if (((gimple_call_builtin_p (def_stmt, BUILT_IN_MEMSET))
&& integer_zerop (gimple_call_arg (def_stmt, 1))
&& tree_fits_uhwi_p (gimple_call_arg (def_stmt, 2)))
|| gimple_call_builtin_p (def_stmt, BUILT_IN_BZERO))
(that's currently missing the the BUILT_IN_BZERO test) could call
is_call_bzero_like_p(call) instead, and would handle not just these two
built-ins but any other built-in or user-defined function decorated with the
same attributes.
Transforming bzero() into memset(0) would get around the problem in the case
oif these two but not all equivalent built-ins can be easily transformed
without making compromises. For example, transforming mempcpy to memcpy is
probably not a good approach to dealing with the problem.