http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444
--- Comment #14 from Martin Jambor <jamborm at gcc dot gnu.org> 2012-01-18 11:23:00 UTC --- Created attachment 26362 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26362 patch-in-progress I talked to richi on IRC yesterday and we agreed that because we rely on build_ref_for_model to create the whole chain of COMPONENT_REFs on strict alignment platforms, that we would disable some scalarization in cases like this, after all. However, in addition to what richi suggested in comment #12, I found out that that was not enough to make the test pass on i686. Also, propagation across assignments is not the only way how these may be created for the aggregate on the LHS, they might just be there because of pre-existing accesses elsewhere in the function. So I looked at the caster dumps again and found out that indeed the very first assignment MEM[(char * {ref-all})&c1x128] = MEM[(char * {ref-all})&c4x32]; had the LHS replaced by a SRA vector replacement and the RHS by a reference created by build_ref_for_model with the same problems. This lead to a similar situation but with switched sides. So I looked at where these build_ref_for_model an came up with the following patch which is fairly straightforward and makes the testcase pass also on i686. However, there are two problems with the patch. 1. This is the easy part. I'm afraid similar problems are lurking in processing aggregate copies with children accesses. But those could be dealt with afterwards. 2. When I bootstrapped gcc and run the testsuite with this patch, I got a new failure in libstdc++: 23_containers/forward_list/modifiers/1.cc The failure persists with -fno-tree-sra, so something went wrong when compiling the library. The patch is very simple and only disabling stuff which then has to through the VIEW_CONVERT_EXPR path so at the moment I think that either the condition guarding the following force_gimple_rhs = true; is wrong or I have uncovered some other bug :-(