This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix PR tree-optimization/39100
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 5 Feb 2009 02:06:19 -0500
- Subject: Fix PR tree-optimization/39100
(and probably others).
This is a bug found by Jakub, and tracked down by Richard Guenther and
I, but has actually been around since 4.2.
It's somewhat embarassing.
The comment says exactly what we should be doing (add graph edge and
union solution), but the code isn't actually doing that due to a
likely cut and paste oversight (it was just adding the solution).
Fixed.
I would not be surprised if this was the cause of a bunch of weird
multi-level pointer bugs (It was only not noticed before because
multi-level indirection is rare, relatively speaking, and most of the
multi-level indirects pointed to anything anyway).
Fixed by doing what the comment said to do.
Bootstrapped and regtested on x86_64-linux.
Committed to mainline.
2009-02-05 Daniel Berlin <dberlin@dberlin.org>
Richard Guenther <rguenther@suse.de>
PR tree-optimization/39100
* tree-ssa-structalias.c (do_ds_constraint): Add graph edges.
in testsuite/
2009-02-05 Daniel Berlin <dberlin@dberlin.org>
* gcc.c-torture/execute/pr39100.c: New.
Index: testsuite/gcc.c-torture/execute/pr39100.c
===================================================================
--- testsuite/gcc.c-torture/execute/pr39100.c (revision 0)
+++ testsuite/gcc.c-torture/execute/pr39100.c (revision 0)
@@ -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;
+}
+
+
Index: tree-ssa-structalias.c
===================================================================
--- tree-ssa-structalias.c (revision 143942)
+++ tree-ssa-structalias.c (working copy)
@@ -1657,15 +1657,17 @@ do_ds_constraint (constraint_t c, bitmap
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++;
+ }
}
}
}