http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57748
--- Comment #28 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- (In reply to Richard Biener from comment #19) > Barking up wrong trees. Hacky fix looks like: > > Index: gcc/expr.c > =================================================================== > --- gcc/expr.c (revision 202043) > +++ gcc/expr.c (working copy) > @@ -4753,6 +4753,9 @@ expand_assignment (tree to, tree from, b > { > enum machine_mode address_mode; > rtx offset_rtx; > + rtx saved_to_rtx = to_rtx; > + if (misalignp) > + to_rtx = mem; > > if (!MEM_P (to_rtx)) > { > @@ -4785,6 +4788,11 @@ expand_assignment (tree to, tree from, b > to_rtx = offset_address (to_rtx, offset_rtx, > highest_pow2_factor_for_target (to, > offset)); > + if (misalignp) > + { > + mem = to_rtx; > + to_rtx = saved_to_rtx; > + } > } > > /* No action is needed if the target is not a memory and the field > > this patch generates wrong code too: foo: .LFB9: .cfi_startproc pushq %rbx .cfi_def_cfa_offset 16 .cfi_offset 3, -16 movq %rdi, %rbx subq $16, %rsp .cfi_def_cfa_offset 32 call get_i movdqu (%rbx), %xmm0 cltq movq .LC1(%rip), %xmm1 psrldq $8, %xmm0 punpcklqdq %xmm0, %xmm1 movdqu %xmm1, 16(%rbx,%rax,8) addq $16, %rsp .cfi_def_cfa_offset 16 popq %rbx .cfi_def_cfa_offset 8 ret .cfi_endproc loads *s into xmm0, modifies low part, writes back at s->b[0] and s->b[1].