From 11152c95365532ec04eb12c3fd418b165a290a23 Mon Sep 17 00:00:00 2001
From: Richard Guenther <rguenther@suse.de>
Date: Wed, 21 Apr 2010 09:37:22 +0000
Subject: [PATCH] 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
---
 gcc/ChangeLog                         |  5 ++++
 gcc/testsuite/ChangeLog               |  4 +++
 gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c |  2 +-
 gcc/tree-ssa-structalias.c            | 36 +++++++++++++++------------
 4 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7376b8bbc199..34eff7c6b930 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 18bf9e1a965b..f30277cf8ad4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c
index 947ab816fc9e..6ef7438dd6ba 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 492907e58052..207cb1781156 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)
-- 
GitLab