re PR tree-optimization/39100 (-fstrict-aliasing miscompilation)
authorDaniel Berlin <dberlin@dberlin.org>
Thu, 5 Feb 2009 07:09:44 +0000 (07:09 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Thu, 5 Feb 2009 07:09:44 +0000 (07:09 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr39100.c [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 178c665a93929e3bfc5b1f4548b111d77c08c754..11b461ec83de84a9c34647776390662114a0ea95 100644 (file)
@@ -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
index 74238e38a6ee7a2782e8255497f801d568138e12..33ba5fadec368a7da76496a8cc75587a1ae3e3dc 100644 (file)
@@ -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 (file)
index 0000000..5cb9e25
--- /dev/null
@@ -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 3e8940e516648d616de06176ecdfe0aa322bcba6..03f7a4ade65a0dcb96878d757b723ba371356c3f 100644 (file)
@@ -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++;
+                      }
                }
            }
        }