diff options
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/tree-optimize.c | 51 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 10 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa.c | 18 |
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++) |