http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45472
--- Comment #19 from Jason Merrill <jason at gcc dot gnu.org> 2012-02-16 19:41:29 UTC --- It seems to me that volatile reads/writes should get their own gimple statements, not be part of a larger block move. So instead of vv1 = vv2; we should have vv1.a ={v} vv2.a; vv1.b ={v} vv2.b; I agree with Paolo's comment in #12 that we want to copy the non-volatile parts as a block when possible. It seems like breaking a simple struct assignment into these separate statements would be best done in the gimplifier so that front ends don't need to get this right independently. Out of curiousity, what is the use case for a non-volatile struct object with volatile members?