http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57748
--- Comment #35 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- Well, this bug seems to have a symmetical twin on the read side. In the above example, if I add this: if (x->xx[0].b != 3.14F || x->xx[1].a != 0x123456789ABCDEF) abort (); this gets compiled: movdqu (%rdi), %xmm0 ucomiss .LC0(%rip), %xmm0 jp .L2 jne .L2 movdqu (%rdi), %xmm0 movabsq $81985529216486895, %rdx movhlps %xmm0, %xmm1 movq %xmm1, %rax cmpq %rdx, %rax jne .L2 regardless if x is volatile or even with -fstrict-volatile-bitfields (!)