From: rguenth Date: Wed, 21 Apr 2010 09:37:22 +0000 (+0000) Subject: 2010-04-21 Richard Guenther X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=516743c940802ddefab364ef8394026f8b7ab899 2010-04-21 Richard Guenther * tree-ssa-structalias.c (do_ds_constraint): Avoid escaping to non-pointer objects. * gcc.dg/ipa/ipa-pta-11.c: Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158591 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7376b8bbc19..34eff7c6b93 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-04-21 Richard Guenther + + * tree-ssa-structalias.c (do_ds_constraint): Avoid escaping + to non-pointer objects. + 2010-04-21 Jakub Jelinek * dwarf2out.c (add_var_loc_to_decl): Add LABEL argument. Drop diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18bf9e1a965..f30277cf8ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-04-21 Richard Guenther + + * gcc.dg/ipa/ipa-pta-11.c: Adjust. + 2010-04-21 Kaveh R. Ghazi * gcc.dg/torture/builtin-cproj-3.c: New. diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c index 947ab816fc9..6ef7438dd6b 100644 --- a/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c +++ b/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c @@ -29,5 +29,5 @@ int main() /* It isn't clear if the escape if l is strictly necessary, if it were we should have i, r and s in ESCAPED as well. */ -/* { dg-final { scan-ipa-dump "ESCAPED = { ESCAPED NONLOCAL l k }" "pta" } } */ +/* { dg-final { scan-ipa-dump "ESCAPED = { l k }" "pta" } } */ /* { dg-final { cleanup-ipa-dump "pta" } } */ diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 492907e5805..207cb178115 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -1746,6 +1746,7 @@ do_ds_constraint (constraint_t c, bitmap delta) unsigned int j; bitmap_iterator bi; HOST_WIDE_INT loff = c->lhs.offset; + bool escaped_p = false; /* Our IL does not allow this. */ gcc_assert (c->rhs.offset == 0); @@ -1792,22 +1793,6 @@ do_ds_constraint (constraint_t c, bitmap delta) unsigned int t; HOST_WIDE_INT fieldoffset = v->offset + loff; - /* If v is a global variable then this is an escape point. */ - if (v->is_global_var) - { - 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; - if (v->is_full_var) fieldoffset = v->offset; else if (loff != 0) @@ -1820,6 +1805,25 @@ do_ds_constraint (constraint_t c, bitmap delta) { if (v->may_have_pointers) { + /* If v is a global variable then this is an escape point. */ + if (v->is_global_var + && !escaped_p) + { + 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++; + } + /* Enough to let rhs escape once. */ + escaped_p = true; + } + + if (v->is_special_var) + break; + t = find (v->id); if (add_graph_edge (graph, t, rhs) && bitmap_ior_into (get_varinfo (t)->solution, sol)