http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57748
--- Comment #5 from Martin Jambor <jamborm at gcc dot gnu.org> --- So I only got to this and I definitely won't be able to finish it today or even this week but here is what I have figured out so far. We ICE when expanding statement MEM[(struct resolved_chain *)_19].ips[j_22].ip = _21; before my patch, that statement was not there, instead we had filtered_7->ips[j_22].ip = D.11868_21; which copyprop2 replaces to the above form with my patch. I have not looked at why. The difference is subtle, _19 is a void pointer. I have not looked at why this transformation took place, however, I had the MEM_REF tree dumped and stared at it for a while and see nothing wrong with it. As the code progresses through expand_assignment, offset as filled in get_inner_reference is the same, however get_object_alignment (tem) used to return 64, and now only returns 32 which then pushes us the wrong path which does not handle this case. So now I guess I should figure out why get_object_alignment thinks the alignment is so small...