This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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++;
+                      }
 		}
 	    }
 	}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]