| /* Bad PTA results (incorrect store handling) was causing us to delete |
| *na = 0 store. */ |
| |
| 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; |
| } |
| |
| |