https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45274
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- The alias-set issue doesn't occur since quite some time (it's using alias-set 1 for me). Also restrict is working. GCC 6 optimizes this on x86_64 to foo: .LFB0: .cfi_startproc movzbl (%rdi), %edx movzbl (%rsi), %eax movl %edx, %r8d movl %edx, %ecx andl $-4, %eax andl $1, %r8d andl $2, %ecx orl %r8d, %eax orl %ecx, %eax movl %edx, %ecx andl $8, %edx andl $4, %ecx andl $-13, %eax orl %ecx, %eax orl %edx, %eax movb %al, (%rsi) movl (%rdi), %eax andl $-16, %eax movl %eax, %edx movl (%rsi), %eax andl $15, %eax orl %edx, %eax movl %eax, (%rsi) ret thus it is doing a good job in piecewise copying of the struct. It doesn't detect that it can simply use a 32bit load/store. But there are duplicates in bugzilla for that issue. Interestingly with some bitfield lowering work plus some match.pd hackery I get that: foo: .LFB0: .cfi_startproc movl (%rdi), %eax movl %eax, (%rsi) ret whee.