aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2009-02-05 07:09:44 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2009-02-05 07:09:44 +0000
commit08e14b2a1ae412910176b09d6b90dadc1b16e0f1 (patch)
treed1dd76fcc7b537a9e780a3c14fab8f100ff66dfe /gcc
parent37d5c6baac1e1222567a750163ba102d0cadab0b (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr39100.c65
-rw-r--r--gcc/tree-ssa-structalias.c16
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++;
+ }
}
}
}