tree-optimize.c (exercute_free_datastructures): Do not disband implicit edges...
authorJan Hubicka <jh@suse.cz>
Mon, 27 Jun 2005 23:33:02 +0000 (01:33 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 27 Jun 2005 23:33:02 +0000 (23:33 +0000)
* tree-optimize.c (exercute_free_datastructures):
Do not disband implicit edges; do not attempt to build insn list;
do not free cfg annotations.
(execute_free_cfg_annotations); Disband implicit edges here;
free cfg annotations here too.
(pass_free_cfg_annotations); New pass.
(init_tree_optimization_passes); Add pass_free_cfg_annotations.
* tree-ssa-operands.c (free_ssa_operands); Recover; export.
* tree-ssa-operands.h (free_ssa_operands); declare.
* tree-ssa.c (delete_tree_ssa); Free SSA operand; mark stmt modified;
kill PHI nodes.
* tree-ssanames.c (release_defs): Kill addresses_taken.

From-SVN: r101360

gcc/ChangeLog
gcc/tree-optimize.c
gcc/tree-ssa-operands.c
gcc/tree-ssa-operands.h
gcc/tree-ssa.c

index 748d3e9..bdbbe42 100644 (file)
@@ -1,5 +1,18 @@
 2005-06-28  Jan Hubicka  <jh@suse.cz>
 
+       * tree-optimize.c (exercute_free_datastructures):
+       Do not disband implicit edges; do not attempt to build insn list;
+       do not free cfg annotations.
+       (execute_free_cfg_annotations); Disband implicit edges here;
+       free cfg annotations here too.
+       (pass_free_cfg_annotations); New pass.
+       (init_tree_optimization_passes); Add pass_free_cfg_annotations.
+       * tree-ssa-operands.c (free_ssa_operands); Recover; export.
+       * tree-ssa-operands.h (free_ssa_operands); declare.
+       * tree-ssa.c (delete_tree_ssa); Free SSA operand; mark stmt modified;
+       kill PHI nodes.
+       * tree-ssanames.c (release_defs): Kill addresses_taken.
+
        * basic-block.h (basic_block_def): Kill rbi.
        (reorder_block_def): Kill; Remove next field (replaced by aux);
        move other fields to ...
index 4b46c9b..24db186 100644 (file)
@@ -120,32 +120,61 @@ static struct tree_opt_pass pass_cleanup_cfg_post_optimizing =
 static void
 execute_free_datastructures (void)
 {
-  tree *chain;
-
   /* ??? This isn't the right place for this.  Worse, it got computed
      more or less at random in various passes.  */
   free_dominance_info (CDI_DOMINATORS);
-
-  /* Emit gotos for implicit jumps.  */
-  disband_implicit_edges ();
+  free_dominance_info (CDI_POST_DOMINATORS);
 
   /* Remove the ssa structures.  Do it here since this includes statement
      annotations that need to be intact during disband_implicit_edges.  */
   delete_tree_ssa ();
+}
+
+static struct tree_opt_pass pass_free_datastructures =
+{
+  NULL,                                        /* name */
+  NULL,                                        /* gate */
+  execute_free_datastructures,                 /* execute */
+  NULL,                                        /* sub */
+  NULL,                                        /* next */
+  0,                                   /* static_pass_number */
+  0,                                   /* tv_id */
+  PROP_cfg,                            /* properties_required */
+  0,                                   /* properties_provided */
+  0,                                   /* properties_destroyed */
+  0,                                   /* todo_flags_start */
+  0,                                   /* todo_flags_finish */
+  0                                    /* letter */
+};
+/* Pass: free cfg annotations.  */
+
+static void
+execute_free_cfg_annotations (void)
+{
+  basic_block bb;
+  block_stmt_iterator bsi;
 
-  /* Re-chain the statements from the blocks.  */
-  chain = &DECL_SAVED_TREE (current_function_decl);
-  *chain = alloc_stmt_list ();
+  /* 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->common.ann);
+       stmt->common.ann = NULL;
+      }
 
   /* And get rid of annotations we no longer need.  */
   delete_tree_cfg_annotations ();
 }
 
-static struct tree_opt_pass pass_free_datastructures =
+static struct tree_opt_pass pass_free_cfg_annotations =
 {
   NULL,                                        /* name */
   NULL,                                        /* gate */
-  execute_free_datastructures,                 /* execute */
+  execute_free_cfg_annotations,                /* execute */
   NULL,                                        /* sub */
   NULL,                                        /* next */
   0,                                   /* static_pass_number */
@@ -157,7 +186,6 @@ static struct tree_opt_pass pass_free_datastructures =
   0,                                   /* todo_flags_finish */
   0                                    /* letter */
 };
-
 /* Pass: fixup_cfg - IPA passes or compilation of earlier functions might've
    changed some properties - such as marked functions nothrow.  Remove now
    redundant edges and basic blocks.  */
@@ -387,6 +415,7 @@ init_tree_optimization_passes (void)
   NEXT_PASS (pass_warn_function_noreturn);
   NEXT_PASS (pass_mudflap_2);
   NEXT_PASS (pass_free_datastructures);
+  NEXT_PASS (pass_free_cfg_annotations);
   NEXT_PASS (pass_expand);
   NEXT_PASS (pass_rest_of_compilation);
   *p = NULL;
index c064c84..b2419e5 100644 (file)
@@ -998,8 +998,7 @@ build_ssa_operands (tree stmt)
 
 
 /* Free any operands vectors in OPS.  */
-#if 0
-static void 
+void 
 free_ssa_operands (stmt_operands_p ops)
 {
   ops->def_ops = NULL;
@@ -1007,14 +1006,7 @@ free_ssa_operands (stmt_operands_p ops)
   ops->maydef_ops = NULL;
   ops->mustdef_ops = NULL;
   ops->vuse_ops = NULL;
-  while (ops->memory.next != NULL)
-    {
-      operand_memory_p tmp = ops->memory.next;
-      ops->memory.next = tmp->next;
-      ggc_free (tmp);
-    }
 }
-#endif
 
 
 /* Get the operands of statement STMT.  Note that repeated calls to
index 4ab74d2..99233fc 100644 (file)
@@ -153,6 +153,7 @@ typedef struct stmt_operands_d *stmt_operands_p;
 
 extern void init_ssa_operands (void);
 extern void fini_ssa_operands (void);
+extern void free_ssa_operands (stmt_operands_p);
 extern void update_stmt_operands (tree);
 extern bool verify_imm_links (FILE *f, tree var);
 
index dc28e71..1a09ef9 100644 (file)
@@ -819,12 +819,18 @@ delete_tree_ssa (void)
 
   /* 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->common.ann);
-       stmt->common.ann = NULL;
-      }
+    {
+      for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+       {
+         tree stmt = bsi_stmt (bsi);
+         stmt_ann_t ann = get_stmt_ann (stmt);
+
+         free_ssa_operands (&ann->operands);
+         ann->addresses_taken = 0;
+         mark_stmt_modified (stmt);
+       }
+      set_phi_nodes (bb, NULL);
+    }
 
   /* Remove annotations from every referenced variable.  */
   for (i = 0; i < num_referenced_vars; i++)