struct Bar { int p; };
struct Foo { struct Bar *p; };
int foo(struct Foo *f)
{
  f->p->p = 1;
  bar(f);
  return f->p->p;
}

.alias1:

  #   VUSE <SMT.4_6>;
  D.1528_2 = f_1->p; 
  #   SMT.5_8 = V_MAY_DEF <SMT.5_7>;
  D.1528_2->p = 1;
  #   .GLOBAL_VAR_10 = V_MAY_DEF <.GLOBAL_VAR_9>;
  bar (f_1);
  #   VUSE <SMT.4_6>;
  D.1528_3 = f_1->p;
  #   VUSE <SMT.5_8>;
  D.1529_4 = D.1528_3->p;
  return D.1529_4;

and fre then does:

  #   VUSE <SMT.4_6>;
  D.1528_2 = f_1->p;
  #   SMT.5_8 = V_MAY_DEF <SMT.5_7>;
  D.1528_2->p = 1;
  #   .GLOBAL_VAR_10 = V_MAY_DEF <.GLOBAL_VAR_9>;
  bar (f_1);
  D.1528_3 = D.1528_2;
  #   VUSE <SMT.5_8>;
  D.1529_4 = D.1528_3->p;
  return D.1529_4;


miscompiles kde4.


-- 
           Summary: [4.2 Regression] Wrong aliasing with global var grouping
                    during call clobbering
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: wrong-code, alias
          Severity: blocker
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


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

Reply via email to