summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/tree-optimize.c51
-rw-r--r--gcc/tree-ssa-operands.c10
-rw-r--r--gcc/tree-ssa-operands.h1
-rw-r--r--gcc/tree-ssa.c18
5 files changed, 67 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 748d3e925ce..bdbbe42e418 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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 ...
diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c
index 4b46c9b7ec5..24db18684f3 100644
--- a/gcc/tree-optimize.c
+++ b/gcc/tree-optimize.c
@@ -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;
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index c064c845c7e..b2419e58cf2 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -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
diff --git a/gcc/tree-ssa-operands.h b/gcc/tree-ssa-operands.h
index 4ab74d2d58e..99233fced7a 100644
--- a/gcc/tree-ssa-operands.h
+++ b/gcc/tree-ssa-operands.h
@@ -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);
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index dc28e712804..1a09ef93acf 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -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++)