OSDN Git Service

2010-04-21 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Apr 2010 09:37:22 +0000 (09:37 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 01:08:03 +0000 (10:08 +0900)
* 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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/ipa-pta-11.c
gcc/tree-ssa-structalias.c

index 7376b8b..34eff7c 100644 (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
index 18bf9e1..f30277c 100644 (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.
index 947ab81..6ef7438 100644 (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" } } */
index 492907e..207cb17 100644 (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)