diff options
author | Richard Guenther <rguenther@suse.de> | 2009-06-16 12:31:49 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-06-16 12:31:49 +0000 |
commit | de70bb20ba3864deca9c9cba9edf646ae1d8a226 (patch) | |
tree | 5a544b381b9b4cb81b15ed5e414068721bdaae3c /gcc | |
parent | daa0eeb8ab04b67053944c8990643e1efe8c913b (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pta-escape-1.c | 37 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pta-escape-2.c | 38 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pta-escape-3.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-27.c | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 69 |
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)) |