https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97205
--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 27 Oct 2020, bernd.edlinger at hotmail dot de wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97205 > > --- Comment #2 from Bernd Edlinger <bernd.edlinger at hotmail dot de> --- > Thanks for reporting this. > > The expansion of assignments to misaligned ssa names > does not handle the case of misaligned stores, which > would result in incorrect code without the assertion. > > I have an untested patch below: > > diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c > index 3706f0a..12b81cd 100644 > --- a/gcc/emit-rtl.c > +++ b/gcc/emit-rtl.c > @@ -2089,7 +2089,8 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int > objectp, > { > gcc_assert (handled_component_p (t) > || TREE_CODE (t) == MEM_REF > - || TREE_CODE (t) == TARGET_MEM_REF); > + || TREE_CODE (t) == TARGET_MEM_REF > + || TREE_CODE (t) == SSA_NAME); Can you track down this? It's a red herring to have a MEM_EXPR that just is a SSA_NAME. > attrs.expr = t; > attrs.offset_known_p = true; > attrs.offset = 0; > diff --git a/gcc/expr.c b/gcc/expr.c > index 9d951e8..49f2699 100644 > --- a/gcc/expr.c > +++ b/gcc/expr.c > @@ -5200,6 +5200,9 @@ expand_assignment (tree to, tree from, bool nontemporal) > || (TREE_CODE (to) == MEM_REF > && (REF_REVERSE_STORAGE_ORDER (to) > || mem_ref_refers_to_non_mem_p (to))) > + || (TREE_CODE (to) == SSA_NAME > + && mode != BLKmode > + && TYPE_ALIGN (TREE_TYPE (to)) < GET_MODE_ALIGNMENT (mode)) But an SSA name is a register, esp. one with non-BLKmode. And if expanded to a stack location that stack location should better be aligned... or be BLKmode. So I think the bug is elsewhere? > || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE) > { > machine_mode mode1; > diff --git a/gcc/testsuite/gcc.c-torture/compile/pr97205.c > b/gcc/testsuite/gcc.c-torture/compile/pr97205.c > new file mode 100644 > index 0000000..6600011 > --- /dev/null > +++ b/gcc/testsuite/gcc.c-torture/compile/pr97205.c > @@ -0,0 +1,7 @@ > +int a; > +typedef __attribute__((aligned(2))) int x; > +int f () > +{ > + x b = a; > + return b; > +} > >