http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45472
--- Comment #21 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-02-20 11:43:01 UTC --- (In reply to comment #19) > 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? There is no valid use-case for this. So I think we should just declare this issue a non-issue (middle-end wise). If the C or C++ standards say that vv1 = vv2 should behave as if the copy was elementwise then the frontends need changing. Certainly not the gimplifier - that's not the kitchen-sink for things you don't want to properly describe in GENERIC to the middle-end ;)