[Bug target/43814] gcc failed to inline memcpy
mkuvyrkov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Dec 4 18:09:00 GMT 2010
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43814
--- Comment #9 from Maxim Kuvyrkov <mkuvyrkov at gcc dot gnu.org> 2010-12-04 18:09:15 UTC ---
(In reply to comment #8)
> In the end we _should_ be able to use alignment information of the
> types used at the access (that's also more reliable as compared to
> use alignment information from pointer argument types).
>
> But we already do that in MEM_REF expansion:
>
> align = MAX (TYPE_ALIGN (TREE_TYPE (exp)),
> get_object_alignment (exp, BIGGEST_ALIGNMENT));
Indeed. SRC will be considered 4-byte aligned in
==
unsigned long long get_ull(const unsigned int *src)
{
unsigned long long tmp;
tmp = src[0];
return tmp;
}
==
, but only 1-byte aligned in
==
unsigned long long get_ull(const unsigned int *src)
{
unsigned long long tmp;
__builtin_memcpy(&tmp, &src[0], 8);
return tmp;
}
==
It seems we should really use for MEM_REFs
==
align = get_pointer_alignment (exp, BIGGEST_ALIGNMENT);
==
without relying on type alignment. Unfortunately, that will worsen code
generation even more.
More information about the Gcc-bugs
mailing list