https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61473
Bug ID: 61473
Summary: register sized memmove not inlined
Product: gcc
Version: 4.10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: jtaylor.debian at googlemail dot com
in this example file compiled with gcc-4.10 -O3 inlines the memcpy, but not the
memmove:
#include <string.h>
void a(int *a, int *b)
{
memcpy(a, b, sizeof(*a));
}
void b(int *a, int *b)
{
memmove(a, b, sizeof(*a));
}
at least on x86 the integer can be stored in fully in a register and saved back
to arbitrary aligned memory, so it should not matter if the two address overlap
and gcc should be able to replace it with a much faster inline memcpy.
Currently gcc only inlines the memmove for 1 byte types.
I am using a recent svn copy of gcc:
$ gcc-4.10 --version
gcc (GCC) 4.10.0 20140605 (experimental)