typedef struct E { int p; struct E *n; } *EP; typedef struct C { EP x; short cn, cp; } *CP;
__attribute__((noinline)) CP foo (CP h, EP x) { EP pl = 0, *pa = &pl; EP nl = 0, *na = &nl; EP n; while (x) { n = x->n; if ((x->p & 1) == 1) { h->cp++; *pa = x; pa = &((*pa)->n); } else { h->cn++; *na = x; na = &((*na)->n); } x = n; } *pa = nl; *na = 0; h->x = pl; return h; } int main (void) { struct C c = { 0, 0, 0 }; struct E e[2] = { { 0, &e[1] }, { 1, 0 } }; EP p; foo (&c, &e[0]); if (c.cn != 1 || c.cp != 1) __builtin_abort (); if (c.x != &e[1]) __builtin_abort (); if (e[1].n != &e[0]) __builtin_abort (); if (e[0].n) __builtin_abort (); return 0; } is miscompiled on x86_64-linux with -O2, works with -O2 -fno-strict-aliasing and with 4.3.2. When miscompiled, the *na = 0 store is optimized away. -- Summary: [4.4 Regression] -fstrict-aliasing miscompilation Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39100