https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86214

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P2
                 CC|                            |matz at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org

--- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> ---
The issue with Alex testcase is that inlining when faced with

ff ()
{
  charD.10 cD.2379[1000];

  <bb 2> :
  f (&cD.2379);

  <bb 3> :
  cD.2379 ={v} {CLOBBER};
  return;

  <bb 4> :
<L0>:
  cD.2379 ={v} {CLOBBER};
  resx 1

}

ends up unifying the resx 1 parts, making the lifetime of the two instances
overlap:

g (intD.9 nD.2380)
{
  charD.10 cD.2411[1000];
  charD.10 cD.2410[1000];
...
  <bb 4> :
  f (&cD.2410);

  <bb 5> :
  cD.2410 ={v} {CLOBBER};
  f (&cD.2411);

  <bb 6> :
  cD.2411 ={v} {CLOBBER};
... all fine up to here

  <bb 9> :
<L4>:
  sD.2383 ={v} {CLOBBER};
  cD.2399 ={v} {CLOBBER};
  resx 1

oops.  When analyzing lifetime of variables during RTL expansion we might
want to not consider blocks where only the clobbers mention the vars thus
virtually move those up as far as possible.

Reply via email to