]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* cgraph.c (cgraph_release_function_body): New function.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Jan 2007 11:30:10 +0000 (11:30 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Jan 2007 11:30:10 +0000 (11:30 +0000)
(cgraph_remove_node): Use it.
* cgraph.h (cgraph_release_function_body): Declare.
* cgraphunit.c (cgraph_expand_function): Use it.
* ipa.c (cgraph_remove_unreahchable_nodes): Use it.
* tree-ssa.c (delete_tree_ssa): Allow to be called before aliasing
is initialized and while compilation of other function is running.
* tree-optimize.c (execute_free_cfg_annotations): Move code to clear
statement CFG annotations from here to ...
* tree-cfg.c (delete_tree_cfg_annotations): ... here.

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

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/cgraphunit.c
gcc/ipa.c
gcc/tree-cfg.c
gcc/tree-optimize.c
gcc/tree-ssa.c

index 73fd11fe98b892adabd611ffd8f150c6805dd0ed..602f2e7e328ac78bc3ab07415955fe3c1d21c99d 100644 (file)
@@ -1,3 +1,16 @@
+2007-01-04  Jan Hubicka  <jh@suse.cz>
+
+       * cgraph.c (cgraph_release_function_body): New function.
+       (cgraph_remove_node): Use it.
+       * cgraph.h (cgraph_release_function_body): Declare.
+       * cgraphunit.c (cgraph_expand_function): Use it.
+       * ipa.c (cgraph_remove_unreahchable_nodes): Use it.
+       * tree-ssa.c (delete_tree_ssa): Allow to be called before aliasing
+       is initialized and while compilation of other function is running.
+       * tree-optimize.c (execute_free_cfg_annotations): Move code to clear
+       statement CFG annotations from here to ...
+       * tree-cfg.c (delete_tree_cfg_annotations): ... here.
+
 2007-01-04  Zdenek Dvorak <dvorakz@suse.cz>
 
        * cfgloop.h (enum li_flags): Make the constants powers of two.
index 1baed252439195ce4917a1f32e91e08da53b7dd4..8914569b39511894f092349fa1835bb3cdae0330 100644 (file)
@@ -468,6 +468,27 @@ cgraph_node_remove_callers (struct cgraph_node *node)
   node->callers = NULL;
 }
 
+/* Release memory used to represent body of function NODE.  */
+
+void
+cgraph_release_function_body (struct cgraph_node *node)
+{
+  if (DECL_STRUCT_FUNCTION (node->decl)
+      && DECL_STRUCT_FUNCTION (node->decl)->gimple_df)
+    {
+      tree old_decl = current_function_decl;
+      push_cfun (DECL_STRUCT_FUNCTION (node->decl));
+      current_function_decl = node->decl;
+      delete_tree_ssa ();
+      delete_tree_cfg_annotations ();
+      current_function_decl = old_decl;
+      pop_cfun();
+    }
+  DECL_SAVED_TREE (node->decl) = NULL;
+  DECL_STRUCT_FUNCTION (node->decl) = NULL;
+  DECL_INITIAL (node->decl) = error_mark_node;
+}
+
 /* Remove the node from cgraph.  */
 
 void
@@ -541,11 +562,7 @@ cgraph_remove_node (struct cgraph_node *node)
     }
 
   if (kill_body && flag_unit_at_a_time)
-    {
-      DECL_SAVED_TREE (node->decl) = NULL;
-      DECL_STRUCT_FUNCTION (node->decl) = NULL;
-      DECL_INITIAL (node->decl) = error_mark_node;
-    }
+    cgraph_release_function_body (node);
   node->decl = NULL;
   if (node->call_site_hash)
     {
index 6f2d3be9a90c24c2d02ec0353e09e14321fc98ee..4a33d5d45cbbc5e94c6258ab31445aac06a1fc88 100644 (file)
@@ -281,6 +281,7 @@ void dump_cgraph_node (FILE *, struct cgraph_node *);
 void cgraph_insert_node_to_hashtable (struct cgraph_node *node);
 void cgraph_remove_edge (struct cgraph_edge *);
 void cgraph_remove_node (struct cgraph_node *);
+void cgraph_release_function_body (struct cgraph_node *);
 void cgraph_node_remove_callees (struct cgraph_node *node);
 struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
                                        struct cgraph_node *,
index 4cbb75f0c72a5a79d1b98d09f23cc046397cfb17..b1c5c8b461f18dd9120091d93f671842895516cc 100644 (file)
@@ -1179,9 +1179,7 @@ cgraph_expand_function (struct cgraph_node *node)
   current_function_decl = NULL;
   if (!cgraph_preserve_function_body_p (node->decl))
     {
-      DECL_SAVED_TREE (node->decl) = NULL;
-      DECL_STRUCT_FUNCTION (node->decl) = NULL;
-      DECL_INITIAL (node->decl) = error_mark_node;
+      cgraph_release_function_body (node);
       /* Eliminate all call edges.  This is important so the call_expr no longer
         points to the dead function body.  */
       cgraph_node_remove_callees (node);
index b78709bc1662fafdf617051af93b5842d1600efc..f45c0583876d33ea68e76115b4d293f97012e340 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -186,9 +186,7 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
                      break;
                  if (!clone)
                    {
-                     DECL_SAVED_TREE (node->decl) = NULL;
-                     DECL_STRUCT_FUNCTION (node->decl) = NULL;
-                     DECL_INITIAL (node->decl) = error_mark_node;
+                     cgraph_release_function_body (node);
                      node->analyzed = false;
                    }
                  cgraph_node_remove_callees (node);
index 4358c7e7b3e76b859bea9697f203f7f18c01e1e4..69b4b4bb0a597d8ec1b75940cfcfdb0f7de755ae 100644 (file)
@@ -2651,6 +2651,17 @@ disband_implicit_edges (void)
 void
 delete_tree_cfg_annotations (void)
 {
+  basic_block bb;
+  block_stmt_iterator bsi;
+
+  /* Remove annotations from every tree in the function.  */
+  FOR_EACH_BB (bb)
+    for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+      {
+       tree stmt = bsi_stmt (bsi);
+       ggc_free (stmt->base.ann);
+       stmt->base.ann = NULL;
+      }
   label_to_block_map = NULL;
 }
 
index 5be07cb07c545957657717bdb1164d34155b20f7..75df4cc54e6fe8281bc5ea11e6de8d060f053e18 100644 (file)
@@ -241,21 +241,9 @@ struct tree_opt_pass pass_free_datastructures =
 static unsigned int
 execute_free_cfg_annotations (void)
 {
-  basic_block bb;
-  block_stmt_iterator bsi;
-
   /* Emit gotos for implicit jumps.  */
   disband_implicit_edges ();
 
-  /* Remove annotations from every tree in the function.  */
-  FOR_EACH_BB (bb)
-    for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
-      {
-       tree stmt = bsi_stmt (bsi);
-       ggc_free (stmt->base.ann);
-       stmt->base.ann = NULL;
-      }
-
   /* And get rid of annotations we no longer need.  */
   delete_tree_cfg_annotations ();
 
index 644a7976402c80a7ef3e7e94b061a7829dc1e18e..a4231083d019ae7751ddb3943a4d3c34b3899a74 100644 (file)
@@ -846,10 +846,13 @@ delete_tree_ssa (void)
   cfun->gimple_df->call_clobbered_vars = NULL;
   cfun->gimple_df->addressable_vars = NULL;
   cfun->gimple_df->modified_noreturn_calls = NULL;
+  if (gimple_aliases_computed_p (cfun))
+    {
+      delete_alias_heapvars ();
+      gcc_assert (!need_ssa_update_p ());
+    }
   cfun->gimple_df->aliases_computed_p = false;
 
-  delete_alias_heapvars ();
-  gcc_assert (!need_ssa_update_p ());
   cfun->gimple_df = NULL;
 }