diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2009-02-05 07:09:44 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2009-02-05 07:09:44 +0000 |
commit | 08e14b2a1ae412910176b09d6b90dadc1b16e0f1 (patch) | |
tree | d1dd76fcc7b537a9e780a3c14fab8f100ff66dfe /gcc | |
parent | 37d5c6baac1e1222567a750163ba102d0cadab0b (diff) | |
download | gcc-08e14b2a1ae412910176b09d6b90dadc1b16e0f1.zip gcc-08e14b2a1ae412910176b09d6b90dadc1b16e0f1.tar.gz gcc-08e14b2a1ae412910176b09d6b90dadc1b16e0f1.tar.bz2 |
re PR tree-optimization/39100 (-fstrict-aliasing miscompilation)
2009-02-05 Daniel Berlin <dberlin@dberlin.org>
Richard Guenther <rguenther@suse.de>
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 <rguenther@suse.de>
From-SVN: r143951
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr39100.c | 65 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 16 |
4 files changed, 85 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 178c665..11b461e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-02-05 Daniel Berlin <dberlin@dberlin.org> + Richard Guenther <rguenther@suse.de> + + 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 <joseph@codesourcery.com> PR c/35435 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 74238e3..33ba5fa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-02-05 Daniel Berlin <dberlin@dberlin.org> + + * gcc.c-torture/execute/pr39100.c: New. + 2009-02-05 Joseph Myers <joseph@codesourcery.com> 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 0000000..5cb9e25 --- /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 3e8940e..03f7a4a 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++; + } } } } |