1 /* Bad PTA results (incorrect store handling) was causing us to delete
2 *na = 0 store. */
3
4 typedef struct E
5 {
6 int p;
7 struct E *n;
8 } *EP;
9
10 typedef struct C
11 {
12 EP x;
13 short cn, cp;
14 } *CP;
15
16 __attribute__((noinline)) CP
foo(CP h,EP x)17 foo (CP h, EP x)
18 {
19 EP pl = 0, *pa = &pl;
20 EP nl = 0, *na = &nl;
21 EP n;
22
23 while (x)
24 {
25 n = x->n;
26 if ((x->p & 1) == 1)
27 {
28 h->cp++;
29 *pa = x;
30 pa = &((*pa)->n);
31 }
32 else
33 {
34 h->cn++;
35 *na = x;
36 na = &((*na)->n);
37 }
38 x = n;
39 }
40 *pa = nl;
41 *na = 0;
42 h->x = pl;
43 return h;
44 }
45
46 int
main(void)47 main (void)
48 {
49 struct C c = { 0, 0, 0 };
50 struct E e[2] = { { 0, &e[1] }, { 1, 0 } };
51 EP p;
52
53 foo (&c, &e[0]);
54 if (c.cn != 1 || c.cp != 1)
55 __builtin_abort ();
56 if (c.x != &e[1])
57 __builtin_abort ();
58 if (e[1].n != &e[0])
59 __builtin_abort ();
60 if (e[0].n)
61 __builtin_abort ();
62 return 0;
63 }
64
65
66