http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45722
--- Comment #33 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2010-11-12 17:34:26 UTC --- > The memory has MEM_ALIGN 8, but we of course just ignore that for > STRICT_ALIGNMENT targets. So the situation is similar to the old > mishandling of > > typedef int myint __attribute__((aligned(1))); > > int foo (myint *p) > { > return *p; > } > > int main() > { > char c[5]; > return foo (&c[1]); > } > > where on old GCC releases we don't run into unaligned memory load > handling for STRICT_ALINGMENT targets either (INDIRECT_REF never > tried to handle that case, I tried to cover up for that with > usign movmisalign where available for MEM_REF). Now as the alignment > info on the type of the mem-ref is bogus the > > align = MAX (TYPE_ALIGN (TREE_TYPE (exp)), > get_object_alignment (exp, BIGGEST_ALIGNMENT)); > > hunk will make that handling not trigger anyway. > > So, it's a) SRAs fault to not preserve alignment b) a general and > very very old problem of GCC (the C FE also doesn't have proper > types when taking the address of a field of a packed struct). Yes, accesses to unaligned stuff is an old problem, see for example PR c/18287, and INDIRECT_REFs indeed never tried to handle this. However, this shouldn't be the problem here since there are no indirect accesses involved, it's just: struct E sE; struct E x; x = sE; Why on earth does SRA now introduce indirect accesses to scalarize a direct assignment between 2 structures with the same type?