]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* ipa-reference.c (is_proper_for_analysis): Exclude addressable and public
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Jun 2014 06:30:50 +0000 (06:30 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Jun 2014 06:30:50 +0000 (06:30 +0000)
vars.
(intersect_static_var_sets): Remove.
(propagate): Do not prune local statics.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211398 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-reference.c

index e277f229b1304d44ac4293ab2f80f2bc546534fe..4841582fb5e6374fc56f49117c844bd4dd9f3fb9 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-reference.c (is_proper_for_analysis): Exclude addressable and public
+       vars.
+       (intersect_static_var_sets): Remove.
+       (propagate): Do not prune local statics.
+
 2014-06-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/60928
index bc58cfa25ec8c84cb3df2e0e4957e898590550aa..e815454162bac80cf3e14815631a0065c8a7b0ec 100644 (file)
@@ -243,6 +243,17 @@ is_proper_for_analysis (tree t)
   if (TREE_READONLY (t))
     return false;
 
+  /* We can not track variables with address taken.  */
+  if (TREE_ADDRESSABLE (t))
+    return false;
+
+  /* TODO: We could track public variables that are not addressable, but currently
+     frontends don't give us those.  */
+  if (TREE_PUBLIC (t))
+    return false;
+
+  /* TODO: Check aliases.  */
+
   /* This is a variable we care about.  Check if we have seen it
      before, and if not add it the set of variables we care about.  */
   if (all_module_statics
@@ -312,26 +323,6 @@ union_static_var_sets (bitmap &x, bitmap y)
   return x == all_module_statics;
 }
 
-/* Compute X &= Y, taking into account the possibility that
-   X may become the maximum set.  */
-
-static bool
-intersect_static_var_sets (bitmap &x, bitmap y)
-{
-  if (x != all_module_statics)
-    {
-      bitmap_and_into (x, y);
-      /* As with union_static_var_sets, reducing to the maximum
-        set as early as possible is an overall win.  */
-      if (bitmap_equal_p (x, all_module_statics))
-       {
-         BITMAP_FREE (x);
-         x = all_module_statics;
-       }
-    }
-  return x == all_module_statics;
-}
-
 /* Return a copy of SET on the bitmap obstack containing SET.
    But if SET is NULL or the maximum set, return that instead.  */
 
@@ -669,7 +660,6 @@ static unsigned int
 propagate (void)
 {
   struct cgraph_node *node;
-  varpool_node *vnode;
   struct cgraph_node **order =
     XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
   int order_pos;
@@ -681,25 +671,6 @@ propagate (void)
   ipa_discover_readonly_nonaddressable_vars ();
   generate_summary ();
 
-  /* Now we know what vars are really statics; prune out those that aren't.  */
-  FOR_EACH_VARIABLE (vnode)
-    if (vnode->externally_visible
-       || TREE_ADDRESSABLE (vnode->decl)
-       || TREE_READONLY (vnode->decl)
-       || !is_proper_for_analysis (vnode->decl)
-       || !vnode->definition)
-      bitmap_clear_bit (all_module_statics, DECL_UID (vnode->decl));
-
-  /* Forget info we collected "just for fun" on variables that turned out to be
-     non-local.  */
-  FOR_EACH_DEFINED_FUNCTION (node)
-    {
-      ipa_reference_local_vars_info_t node_l;
-      node_l = &get_reference_vars_info (node)->local;
-      intersect_static_var_sets (node_l->statics_read, all_module_statics);
-      intersect_static_var_sets (node_l->statics_written, all_module_statics);
-    }
-
   /* Propagate the local information through the call graph to produce
      the global information.  All the nodes within a cycle will have
      the same info so we collapse cycles first.  Then we can do the