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



--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-10-02 
13:31:24 UTC ---

Right now we only have control flow insensitive points to ESCAPED set, so I'm

afraid this is unfixable, unless we change that.  Only with control flow

sensitive ESCAPED we'd be able to clear the tmp var out of the escaped set at

the CLOBBER point (but it would need to be kept in other points to sets, as we

could e.g. CSE pure/const calls that return the var's address).



Another example where control flow insensitive ESCAPED prevents some

optimizations:

struct S { char p[40]; };

void bar (struct S *);

void foo (void)

{

  struct S a, b, c, d, e;

  a.p[0] = 1;

  b.p[0] = 1;

  c.p[0] = 1;

  d.p[0] = 1;

  e.p[0] = 1;

  a.p[0] = 2;

  bar (&a);

  b.p[0] = 2;

  bar (&b);

  c.p[0] = 2;

  bar (&c);

  d.p[0] = 2;

  bar (&d);

  e.p[0] = 2;

  bar (&e);

}



As we add all the vars into the ESCAPED set and consider it being used even by

the a call then, DSE can't optimize away the = 1 stores with the exception of

a.p[0] = 1;.

Reply via email to