http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47370

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.01.20 08:19:09
                 CC|                            |jakub at gcc dot gnu.org
   Target Milestone|---                         |4.6.0
     Ever Confirmed|0                           |1

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-01-20 
08:19:09 UTC ---
Tiny bit reduced:

struct S { int s; };

void
foo (void)
{
  for (;;)
    ;
}

struct S
bar (void)
{
  struct S s = { 99 };
  return s;
}

void
baz (void)
{
  struct S s[1];
  s[0] = bar ();
  bar ();
  foo ();
}

Only happens with -m32.  My bet is this goes wrong during inlining.
We have
MEM[(struct S *)&<retval>] = s$s_5;
stmt where &RESULT_DECL satisfies is_gimple_mem_ref_addr.
But after inlining this becomes
MEM[(struct S *)&s[0]] = s$s_5;
and ADDR_EXPR of ARRAY_REF is not is_gimple_mem_ref_addr, so I suppose the
inliner needs to fix this up somewhere.

Reply via email to