In the below, the test case tries to write to the stack outside the bounds of the s variable? I can't imagine any good coming from this, and indeed, would be nice for the compiler to complain about such code. If S had a few more bytes at the end, at least the code would not be wildly bad.
Thoughts? On May 31, 2012, at 3:59 AM, Richard Guenther <rguent...@suse.de> wrote: > This fixes PR48493 by backporting a one-liner - we should not go > the movmisalign path for destinations that are not memory. > > Bootstrapped and tested on x86_64-unknown-linux-gnu and on > mips by Andrew, installed. > > Richard. > > 2012-05-31 Richard Guenther <rguent...@suse.de> > > PR middle-end/48493 > * expr.c (expand_assignment): Do not use movmisalign on > non-memory. > > * gcc.dg/torture/pr48493.c: New testcase. > Index: gcc/testsuite/gcc.dg/torture/pr48493.c > =================================================================== > *** gcc/testsuite/gcc.dg/torture/pr48493.c (revision 0) > --- gcc/testsuite/gcc.dg/torture/pr48493.c (revision 0) > *************** > *** 0 **** > --- 1,18 ---- > + /* { dg-do compile } */ > + > + typedef long long T __attribute__((may_alias, aligned (1))); > + > + struct S > + { > + _Complex float d __attribute__((aligned (8))); > + }; > + > + void bar (struct S); > + > + void > + f1 (T x) > + { > + struct S s; > + *(T *) ((char *) &s.d + 1) = x; > + bar (s); > + }