tree-ssa-structalias.c (do_ds_constraint): Avoid escaping to non-pointer objects.

2010-04-21  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-structalias.c (do_ds_constraint): Avoid escaping
	to non-pointer objects.

	* gcc.dg/ipa/ipa-pta-11.c: Adjust.

From-SVN: r158591
This commit is contained in:
Richard Guenther 2010-04-21 09:37:22 +00:00 committed by Richard Biener
parent 0f2f44c007
commit 11152c9536
4 changed files with 30 additions and 17 deletions

View File

@ -1,3 +1,8 @@
2010-04-21 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (do_ds_constraint): Avoid escaping
to non-pointer objects.
2010-04-21 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (add_var_loc_to_decl): Add LABEL argument. Drop

View File

@ -1,3 +1,7 @@
2010-04-21 Richard Guenther <rguenther@suse.de>
* gcc.dg/ipa/ipa-pta-11.c: Adjust.
2010-04-21 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/torture/builtin-cproj-3.c: New.

View File

@ -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" } } */

View File

@ -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)