aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-06-16 12:31:49 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-06-16 12:31:49 +0000
commitde70bb20ba3864deca9c9cba9edf646ae1d8a226 (patch)
tree5a544b381b9b4cb81b15ed5e414068721bdaae3c /gcc
parentdaa0eeb8ab04b67053944c8990643e1efe8c913b (diff)
downloadgcc-de70bb20ba3864deca9c9cba9edf646ae1d8a226.zip
gcc-de70bb20ba3864deca9c9cba9edf646ae1d8a226.tar.gz
gcc-de70bb20ba3864deca9c9cba9edf646ae1d8a226.tar.bz2
tree-ssa-structalias.c (do_ds_constraint): Stores in global variables add them to ESCAPED.
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c37
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c38
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c42
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c25
-rw-r--r--gcc/tree-ssa-structalias.c69
7 files changed, 192 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 32e2173..524f71e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 02f87d0..fd2ca73 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ee8a84b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c
@@ -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
index 0000000..ad5ed2e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c
@@ -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
index 0000000..ea11c8a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c
@@ -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
index 0000000..3936870
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c
@@ -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" } } */
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 7c95de4..62a1e43 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -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))