tree-ssa-structalias.c (do_ds_constraint): Stores in global variables add them to...
authorRichard Guenther <rguenther@suse.de>
Tue, 16 Jun 2009 12:31:49 +0000 (12:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 16 Jun 2009 12:31:49 +0000 (12:31 +0000)
2009-06-16  Richard Guenther  <rguenther@suse.de>

* tree-ssa-structalias.c (do_ds_constraint): Stores in global
variables add them to ESCAPED.
(find_func_aliases): Do not make all indirectly stored values
escaped.

* gcc.dg/tree-ssa/pta-escape-1.c: New testcase.
* gcc.dg/tree-ssa/pta-escape-2.c: Likewise.
* gcc.dg/tree-ssa/pta-escape-3.c: Likewise.
* gcc.dg/tree-ssa/ssa-fre-27.c: Likewise.

From-SVN: r148525

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 32e2173..524f71e 100644 (file)
@@ -1,3 +1,10 @@
+2009-06-16  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-structalias.c (do_ds_constraint): Stores in global
+       variables add them to ESCAPED.
+       (find_func_aliases): Do not make all indirectly stored values
+       escaped.
+
 2009-06-16  Rafael Avila de Espindola  <espindola@google.com>
 
        * config/i386/winnt.c (i386_pe_encode_section_info): Update call to
index 02f87d0..fd2ca73 100644 (file)
@@ -1,3 +1,10 @@
+2009-06-16  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/pta-escape-1.c: New testcase.
+       * gcc.dg/tree-ssa/pta-escape-2.c: Likewise.
+       * gcc.dg/tree-ssa/pta-escape-3.c: Likewise.
+       * gcc.dg/tree-ssa/ssa-fre-27.c: Likewise.
+
 2009-06-16  Martin Jambor  <mjambor@suse.cz>
 
        * testsuite/gcc.c-torture/compile/pr40432.c: New file.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c
new file mode 100644 (file)
index 0000000..ee8a84b
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-options "-O -fdump-tree-alias-details" } */
+
+int *i;
+void __attribute__((noinline))
+foo (void)
+{
+  *i = 1;
+}
+int __attribute__((noinline))
+bar(int local_p)
+{
+  int x = 0;
+  int *j;
+  int **p;
+  if (local_p)
+    p = &j;
+  else
+    p = &i;
+  *p = &x;  /* This makes x escape.  */
+  foo ();
+  return x;
+}
+extern void abort (void);
+int main()
+{
+  int k = 2;
+  i = &k;
+  if (bar (1) != 0 || k != 1)
+    abort ();
+  if (bar (0) != 1)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "ESCAPED, points-to vars: { x }" "alias" } } */
+/* { dg-final { cleanup-tree-dump "alias" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c
new file mode 100644 (file)
index 0000000..ad5ed2e
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-options "-O -fdump-tree-alias-details" } */
+
+int *i;
+void __attribute__((noinline))
+foo (void)
+{
+  *i = 1;
+}
+int __attribute__((noinline))
+bar(int local_p, int **q)
+{
+  int x = 0;
+  int *j;
+  int **p;
+  if (local_p)
+    p = &j;
+  else
+    p = q;
+  *p = &x;  /* This makes x escape.  */
+  foo ();
+  return x;
+}
+extern void abort (void);
+int main()
+{
+  int k = 2;
+  int **q = &i;
+  i = &k;
+  if (bar (1, q) != 0 || k != 1)
+    abort ();
+  if (bar (0, q) != 1)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "ESCAPED, points-to vars: { x }" "alias" } } */
+/* { dg-final { cleanup-tree-dump "alias" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c
new file mode 100644 (file)
index 0000000..ea11c8a
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-options "-O -fdump-tree-alias-details" } */
+
+int *i;
+void __attribute__((noinline))
+foo (void)
+{
+  *i = 1;
+}
+int **__attribute__((noinline,const))
+foobar (void)
+{
+  return &i;
+}
+int __attribute__((noinline))
+bar(int local_p)
+{
+  int x = 0;
+  int *j;
+  int **p;
+  if (local_p)
+    p = &j;
+  else
+    p = foobar();
+  *p = &x;  /* This makes x escape.  */
+  foo ();
+  return x;
+}
+extern void abort (void);
+int main()
+{
+  int k = 2;
+  i = &k;
+  if (bar (1) != 0 || k != 1)
+    abort ();
+  if (bar (0) != 1)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "ESCAPED, points-to vars: { x }" "alias" } } */
+/* { dg-final { cleanup-tree-dump "alias" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c
new file mode 100644 (file)
index 0000000..3936870
--- /dev/null
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre-details" } */
+
+int *q;
+void __attribute__((noinline))
+bar (void)
+{
+  *q = 1;
+}
+int foo(int which_p)
+{
+  int x = 0;
+  int *i,*j;
+  int **p;
+  if (which_p)
+    p = &i;
+  else
+    p = &j;
+  *p = &x;
+  bar ();
+  return x;
+}
+
+/* { dg-final { scan-tree-dump "Replaced x with 0" "fre" } } */
+/* { dg-final { cleanup-tree-dump "fre" } } */
index 7c95de4..62a1e43 100644 (file)
@@ -1664,6 +1664,19 @@ do_ds_constraint (constraint_t c, bitmap delta)
       unsigned int t;
       HOST_WIDE_INT fieldoffset = v->offset + loff;
 
+      /* If v is a NONLOCAL then this is an escape point.  */
+      if (j == nonlocal_id)
+       {
+         t = find (escaped_id);
+         if (add_graph_edge (graph, t, rhs)
+             && bitmap_ior_into (get_varinfo (t)->solution, sol)
+             && !TEST_BIT (changed, t))
+           {
+             SET_BIT (changed, t);
+             changed_count++;
+           }
+       }
+
       if (v->is_special_var)
        continue;
 
@@ -1680,18 +1693,24 @@ do_ds_constraint (constraint_t c, bitmap delta)
          if (v->may_have_pointers)
            {
              t = find (v->id);
-             if (add_graph_edge (graph, t, rhs))
+             if (add_graph_edge (graph, t, rhs)
+                 && bitmap_ior_into (get_varinfo (t)->solution, sol)
+                 && !TEST_BIT (changed, t))
                {
-                 if (bitmap_ior_into (get_varinfo (t)->solution, sol))
-                   {
-                     if (t == rhs)
-                       sol = get_varinfo (rhs)->solution;
-                     if (!TEST_BIT (changed, t))
-                       {
-                         SET_BIT (changed, t);
-                         changed_count++;
-                       }
-                   }
+                 SET_BIT (changed, t);
+                 changed_count++;
+               }
+           }
+         /* If v is a global variable then this is an escape point.  */
+         if (is_global_var (v->decl))
+           {
+             t = find (escaped_id);
+             if (add_graph_edge (graph, t, rhs)
+                 && bitmap_ior_into (get_varinfo (t)->solution, sol)
+                 && !TEST_BIT (changed, t))
+               {
+                 SET_BIT (changed, t);
+                 changed_count++;
                }
            }
 
@@ -3734,31 +3753,15 @@ find_func_aliases (gimple origt)
                process_constraint (new_constraint (*c, *c2));
            }
        }
+      /* If there is a store to a global variable the rhs escapes.  */
+      if ((lhsop = get_base_address (lhsop)) != NULL_TREE
+         && DECL_P (lhsop)
+         && is_global_var (lhsop))
+       make_escape_constraint (rhsop);
     }
 
   stmt_escape_type = is_escape_site (t);
-  if (stmt_escape_type == ESCAPE_STORED_IN_GLOBAL)
-    {
-      gcc_assert (is_gimple_assign (t));
-      if (gimple_assign_rhs_code (t) == ADDR_EXPR)
-       {
-         tree rhs = gimple_assign_rhs1 (t);
-         tree base = get_base_address (TREE_OPERAND (rhs, 0));
-         if (base
-             && (!DECL_P (base)
-                 || !is_global_var (base)))
-           make_escape_constraint (rhs);
-       }
-      else if (get_gimple_rhs_class (gimple_assign_rhs_code (t))
-              == GIMPLE_SINGLE_RHS)
-       {
-         if (could_have_pointers (gimple_assign_rhs1 (t)))
-           make_escape_constraint (gimple_assign_rhs1 (t));
-       }
-      else
-       gcc_unreachable ();
-    }
-  else if (stmt_escape_type == ESCAPE_BAD_CAST)
+  if (stmt_escape_type == ESCAPE_BAD_CAST)
     {
       gcc_assert (is_gimple_assign (t));
       gcc_assert (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (t))