On Fri, Jan 8, 2016 at 12:24 PM, Eric Botcazou <ebotca...@libertysurf.fr> wrote: >> See some existing PR. The GCC middle-end cannot assume that pointers >> are aligned according to their type (while at least the C language would >> support that notion). > > Only on x86. It could (and used to) do it on strict-alignment architectures.
As the GIMPLE type system treats all pointer types equal (independet on alignment) "random" types may end up in the actual arguments of the memcpy (because what matters is the pointer value, not the type). In practice this is of course usually one of the types in an original conversion chain and thus "fine" if the source language is C. I don't see that it should be dependent on strict-alignment or not (such special-cases of interpreting source language semantics are bad for portability). In the middle-end (including RTL) alignment is on memory references and the issue with things like memcpy is that it is not treated as "memory reference" with explicitely recorded alignments. I doubt "used to do it" has applied to say void foo (int *p) { if (p & ~3) link_error (); } Richard. > -- > Eric Botcazou