https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50417
--- Comment #16 from npl at chello dot at --- rguenther: Funny enough, I am using memcpy because thats the only standard conform way to move data around that might be aliased. And I use this often to parse binary streams from a network. I think you are missing some key points, first that gcc readily replaces functions it knows - which can be disabled at will. On x86, for all those samples the call WILL BE replaced. (And in C++, RVO is explicitly allowed for example) So its pointless to discuss whether or not gcc should provide builtins (atleast in the context of this bug). Instead talk about the replacing feature that seems to work inconsistent / suboptimal. One more sample to demonstrate this (all compiled with O2): #include <string.h> int foo_ptr(const int *s) { /* nope */ int v; memcpy(&v, s, sizeof(v)); return v; } int foo_ref(const int &s) { /* nope */ int v; memcpy(&v, &s, sizeof(v)); return v; } int foo_refloc(const int &s) { /* This actually works */ int b = s; int v; memcpy(&v, &b, sizeof(v)); return v; } int foo_badalias(const char *s) { /* Nope, but then THIS shouldnt be be replaced by a aligned load */ int v; memcpy(&v, (int *)s, sizeof(v)); return v; } int foo_badalias2(const char *s) { /* That works, but is undefined behaviour (casting from a pointer with less alignment)! */ int v = *(int *)s; return v; }