From: Daniel Berlin Date: Thu, 5 Feb 2009 07:09:44 +0000 (+0000) Subject: re PR tree-optimization/39100 (-fstrict-aliasing miscompilation) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=08e14b2a1ae412910176b09d6b90dadc1b16e0f1;p=gcc.git re PR tree-optimization/39100 (-fstrict-aliasing miscompilation) 2009-02-05 Daniel Berlin Richard Guenther PR tree-optimization/39100 * tree-ssa-structalias.c (do_ds_constraint): Actually do what the comment says and add edges. Co-Authored-By: Richard Guenther From-SVN: r143951 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 178c665a939..11b461ec83d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-02-05 Daniel Berlin + Richard Guenther + + PR tree-optimization/39100 + * tree-ssa-structalias.c (do_ds_constraint): Actually do what the + comment says and add edges. + 2009-02-05 Joseph Myers PR c/35435 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 74238e38a6e..33ba5fadec3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-02-05 Daniel Berlin + + * gcc.c-torture/execute/pr39100.c: New. + 2009-02-05 Joseph Myers PR c/35435 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39100.c b/gcc/testsuite/gcc.c-torture/execute/pr39100.c new file mode 100644 index 00000000000..5cb9e25d437 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr39100.c @@ -0,0 +1,65 @@ +/* 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; +} + + diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 3e8940e5166..03f7a4ade65 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -1657,15 +1657,17 @@ do_ds_constraint (constraint_t c, bitmap delta) t = find (v->id); tmp = get_varinfo (t)->solution; - if (set_union_with_increment (tmp, sol, 0)) + if (add_graph_edge (graph, t, rhs)) { - get_varinfo (t)->solution = tmp; - if (t == rhs) - sol = get_varinfo (rhs)->solution; - if (!TEST_BIT (changed, t)) + if (bitmap_ior_into (get_varinfo (t)->solution, sol)) { - SET_BIT (changed, t); - changed_count++; + if (t == rhs) + sol = get_varinfo (rhs)->solution; + if (!TEST_BIT (changed, t)) + { + SET_BIT (changed, t); + changed_count++; + } } } }