Commit d47cc544 by Steven Bosscher

backport: et-forest.h (et_forest_create, [...]): Declarations removed.

	Backport from tree-ssa (relevant changes only):
	2003-12-18  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>

	* et-forest.h (et_forest_create, et_forest_delete,
	et_forest_add_node, et_forest_add_edge, et_forest_remove_node,
	et_forest_remove_edge, et_forest_parent,
	et_forest_common_ancestor, et_forest_node_value,
	et_forest_enumerate_sons): Declarations removed.
	(struct et_node): New.
	(et_new_tree, et_free_tree, et_set_father, et_split, et_nca,
	et_below): Declare.
	* et-forest.c (struct et_forest_occurrence, struct et_forest,
	struct et_forest_node): Removed.
	(et_forest_create, et_forest_delete,
	et_forest_add_node, et_forest_add_edge, et_forest_remove_node,
	et_forest_remove_edge, et_forest_parent,
	et_forest_common_ancestor, et_forest_node_value,
	et_forest_enumerate_sons, splay, remove_all_occurrences,
	find_leftmost_node, find_rightmost_node, calculate_value): Removed.
	(struct et_occ): New.
	(et_nodes, et_occurences): New.
	(set_depth, set_depth_add, set_prev, set_next, et_recomp_min,
	et_check_occ_sanity, et_check_sanity, et_check_tree_sanity,
	record_path_before_1, record_path_before, check_path_after_1,
	check_path_after, et_splay, et_new_occ, et_new_tree,
	et_free_tree, et_set_father, et_split, et_nca, et_below): New.
	* basic-block.h (struct basic_block_def): New field dom.
	(struct dominance_info): Type removed.
	(calculate_dominance_info, free_dominance_info,
	nearest_common_dominator, set_immediate_dominator,
	get_immediate_dominator, dominated_by_p, get_dominated_by,
	add_to_dominance_info, delete_from_dominance_info,
	recount_dominator, redirect_immediate_dominators,
	iterate_fix_dominators, verify_dominators): Declarations
	changed.
	(enum dom_state): New.
	(dom_computed): New variable.
	(first_dom_son, next_dom_son): Declare.
	* dominance.c (struct dominance_info): Removed.
	(BB_NODE, SET_BB_NODE): Removed.
	(calculate_dominance_info, free_dominance_info,
	nearest_common_dominator, set_immediate_dominator,
	get_immediate_dominator, dominated_by_p, get_dominated_by,
	add_to_dominance_info, delete_from_dominance_info,
	recount_dominator, redirect_immediate_dominators,
	iterate_fix_dominators, verify_dominators,
	debug_dominance_info): Work over new datastructure.  Access
	dominance datastructures through CFG.
	(assign_dfs_numbers, compute_dom_fast_query, first_dom_son,
	next_dom_son): New.
	* bt-load.c (dom): Variable removed.
	(augment_live_range, combine_btr_defs, migrate_btr_def,
	migrate_btr_defs, branch_target_load_optimize): Updated for the
	new interface for dominance information.
	* cfg.c {exit_entry_blocks): Update initializer.
	* cfglayout.c (copy_bbs): Removed loops argument. Updated for
	the new interface for dominance information.
	* cfglayout.h (copy_bbs): Declaration changed.
	* cfgloop.c (flow_loop_pre_header_find, flow_loops_cfg_dump,
	flow_loop_scan, canonicalize_loop_headers, flow_loops_find): Updated
	for the new interface for dominance information.
	(flow_loop_scan): Loops argument removed.
	(flow_loops_free): Don't release dominators.
	* cfgloop.h (struct cfg): Dom field removed.
	(flow_loop_scan, loop_split_edge_with, simple_loop_p,
	just_once_each_iteration_p, split_loop_bb): Declaration changed.
	* cfgloopanal.c (simple_loop_exit_p, simple_increment,
	just_once_each_iteration_p, simple_loop_p): Remove loops argument.
	Updated for the new interface for dominance information.
	* cfgloopmanip.c (remove_bbs, find_path, create_preheader,
	split_loop_bb, loopify, duplicate_loop_to_header_edge,
	force_single_succ_latches, loop_split_edge_with): Ditto.
	* gcse.c (dominators): Variable removed.
	(free_code_hoist_mem, compute_code_hoist_data, hoist_code):
	Updated for the new interface for dominance information.
	* ifcvt.c (post_dominators): Variable removed.
	(mark_loop_exit_edges, merge_if_block, find_if_header,
	find_cond_trap, find_if_case_1, find_if_case_2, if_convert):
	Updated for the new interface for dominance information.
	* loop-init.c (rtl_loop_optimizer_init,
	rtl_loop_optimizer_finalize): Ditto.
	* loop-unroll.c (decide_peel_simple, decide_peel_once_rolling,
	decide_peel_completely, decide_unroll_stupid,
	decide_unroll_constant_iterations,
	decide_unroll_runtime_iterations): Loops argument removed.
	Updated for the new interface for dominance information.
	(unroll_and_peel_loops, peel_loops_completely,
	unroll_loop_runtime_iterations): Updated for the new interface for
	dominance information.
	* loop-unswitch.c (may_unswitch_on_p, unswitch_loops,
	unswitch_single_loop, unswitch_loop): Updated for the new
	interface for dominance information.
	* predict.c (process_note_predictions, process_note_prediction,
	estimate_probability, note_prediction_to_br_prob): Ditto.
	* sched-rgn.c (find_rgns, init_regions): Ditto.
	* toplev.c (rest_of_handle_branch_prob): Free the dominators.

From-SVN: r75226
parent 58496de1
2003-12-30 Steven Bosscher <steven@gcc.gnu.org>
Backport from tree-ssa (relevant changes only):
2003-12-18 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* et-forest.h (et_forest_create, et_forest_delete,
et_forest_add_node, et_forest_add_edge, et_forest_remove_node,
et_forest_remove_edge, et_forest_parent,
et_forest_common_ancestor, et_forest_node_value,
et_forest_enumerate_sons): Declarations removed.
(struct et_node): New.
(et_new_tree, et_free_tree, et_set_father, et_split, et_nca,
et_below): Declare.
* et-forest.c (struct et_forest_occurrence, struct et_forest,
struct et_forest_node): Removed.
(et_forest_create, et_forest_delete,
et_forest_add_node, et_forest_add_edge, et_forest_remove_node,
et_forest_remove_edge, et_forest_parent,
et_forest_common_ancestor, et_forest_node_value,
et_forest_enumerate_sons, splay, remove_all_occurrences,
find_leftmost_node, find_rightmost_node, calculate_value): Removed.
(struct et_occ): New.
(et_nodes, et_occurences): New.
(set_depth, set_depth_add, set_prev, set_next, et_recomp_min,
et_check_occ_sanity, et_check_sanity, et_check_tree_sanity,
record_path_before_1, record_path_before, check_path_after_1,
check_path_after, et_splay, et_new_occ, et_new_tree,
et_free_tree, et_set_father, et_split, et_nca, et_below): New.
* basic-block.h (struct basic_block_def): New field dom.
(struct dominance_info): Type removed.
(calculate_dominance_info, free_dominance_info,
nearest_common_dominator, set_immediate_dominator,
get_immediate_dominator, dominated_by_p, get_dominated_by,
add_to_dominance_info, delete_from_dominance_info,
recount_dominator, redirect_immediate_dominators,
iterate_fix_dominators, verify_dominators): Declarations
changed.
(enum dom_state): New.
(dom_computed): New variable.
(first_dom_son, next_dom_son): Declare.
* dominance.c (struct dominance_info): Removed.
(BB_NODE, SET_BB_NODE): Removed.
(calculate_dominance_info, free_dominance_info,
nearest_common_dominator, set_immediate_dominator,
get_immediate_dominator, dominated_by_p, get_dominated_by,
add_to_dominance_info, delete_from_dominance_info,
recount_dominator, redirect_immediate_dominators,
iterate_fix_dominators, verify_dominators,
debug_dominance_info): Work over new datastructure. Access
dominance datastructures through CFG.
(assign_dfs_numbers, compute_dom_fast_query, first_dom_son,
next_dom_son): New.
* bt-load.c (dom): Variable removed.
(augment_live_range, combine_btr_defs, migrate_btr_def,
migrate_btr_defs, branch_target_load_optimize): Updated for the
new interface for dominance information.
* cfg.c {exit_entry_blocks): Update initializer.
* cfglayout.c (copy_bbs): Removed loops argument. Updated for
the new interface for dominance information.
* cfglayout.h (copy_bbs): Declaration changed.
* cfgloop.c (flow_loop_pre_header_find, flow_loops_cfg_dump,
flow_loop_scan, canonicalize_loop_headers, flow_loops_find): Updated
for the new interface for dominance information.
(flow_loop_scan): Loops argument removed.
(flow_loops_free): Don't release dominators.
* cfgloop.h (struct cfg): Dom field removed.
(flow_loop_scan, loop_split_edge_with, simple_loop_p,
just_once_each_iteration_p, split_loop_bb): Declaration changed.
* cfgloopanal.c (simple_loop_exit_p, simple_increment,
just_once_each_iteration_p, simple_loop_p): Remove loops argument.
Updated for the new interface for dominance information.
* cfgloopmanip.c (remove_bbs, find_path, create_preheader,
split_loop_bb, loopify, duplicate_loop_to_header_edge,
force_single_succ_latches, loop_split_edge_with): Ditto.
* gcse.c (dominators): Variable removed.
(free_code_hoist_mem, compute_code_hoist_data, hoist_code):
Updated for the new interface for dominance information.
* ifcvt.c (post_dominators): Variable removed.
(mark_loop_exit_edges, merge_if_block, find_if_header,
find_cond_trap, find_if_case_1, find_if_case_2, if_convert):
Updated for the new interface for dominance information.
* loop-init.c (rtl_loop_optimizer_init,
rtl_loop_optimizer_finalize): Ditto.
* loop-unroll.c (decide_peel_simple, decide_peel_once_rolling,
decide_peel_completely, decide_unroll_stupid,
decide_unroll_constant_iterations,
decide_unroll_runtime_iterations): Loops argument removed.
Updated for the new interface for dominance information.
(unroll_and_peel_loops, peel_loops_completely,
unroll_loop_runtime_iterations): Updated for the new interface for
dominance information.
* loop-unswitch.c (may_unswitch_on_p, unswitch_loops,
unswitch_single_loop, unswitch_loop): Updated for the new
interface for dominance information.
* predict.c (process_note_predictions, process_note_prediction,
estimate_probability, note_prediction_to_br_prob): Ditto.
* sched-rgn.c (find_rgns, init_regions): Ditto.
* toplev.c (rest_of_handle_branch_prob): Free the dominators.
2003-12-30 Jan Hubicka <jh@suse.cz> 2003-12-30 Jan Hubicka <jh@suse.cz>
PR target/13456 PR target/13456
......
...@@ -1322,7 +1322,7 @@ c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) ...@@ -1322,7 +1322,7 @@ c-convert.o : c-convert.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H)
c-pragma.o: c-pragma.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \ c-pragma.o: c-pragma.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
function.h c-pragma.h toplev.h output.h $(GGC_H) $(TM_P_H) $(C_COMMON_H) gt-c-pragma.h function.h c-pragma.h toplev.h output.h $(GGC_H) $(TM_P_H) $(C_COMMON_H) gt-c-pragma.h
graph.o: graph.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h flags.h output.h \ graph.o: graph.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h flags.h output.h \
$(RTL_H) function.h hard-reg-set.h $(BASIC_BLOCK_H) graph.h $(RTL_H) function.h langhooks.h hard-reg-set.h $(BASIC_BLOCK_H) graph.h $(TREE_H)
sbitmap.o: sbitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \ sbitmap.o: sbitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) flags.h \
hard-reg-set.h $(BASIC_BLOCK_H) hard-reg-set.h $(BASIC_BLOCK_H)
...@@ -1651,7 +1651,7 @@ web.o : web.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \ ...@@ -1651,7 +1651,7 @@ web.o : web.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
hard-reg-set.h flags.h $(BASIC_BLOCK_H) function.h output.h toplev.h df.h hard-reg-set.h flags.h $(BASIC_BLOCK_H) function.h output.h toplev.h df.h
gcse.o : gcse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \ gcse.o : gcse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
hard-reg-set.h flags.h real.h insn-config.h $(GGC_H) $(RECOG_H) $(EXPR_H) \ hard-reg-set.h flags.h real.h insn-config.h $(GGC_H) $(RECOG_H) $(EXPR_H) \
$(BASIC_BLOCK_H) function.h output.h toplev.h $(TM_P_H) $(PARAMS_H) \ $(BASIC_BLOCK_H) function.h langhooks.h output.h toplev.h $(TM_P_H) $(PARAMS_H) \
except.h gt-gcse.h $(TREE_H) except.h gt-gcse.h $(TREE_H)
sibcall.o : sibcall.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \ sibcall.o : sibcall.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
function.h hard-reg-set.h flags.h insn-config.h $(RECOG_H) $(BASIC_BLOCK_H) function.h hard-reg-set.h flags.h insn-config.h $(RECOG_H) $(BASIC_BLOCK_H)
......
...@@ -234,6 +234,9 @@ typedef struct basic_block_def { ...@@ -234,6 +234,9 @@ typedef struct basic_block_def {
/* Outermost loop containing the block. */ /* Outermost loop containing the block. */
struct loop *loop_father; struct loop *loop_father;
/* The dominance and postdominance information node. */
struct et_node *dom[2];
/* Expected number of executions: calculated in profile.c. */ /* Expected number of executions: calculated in profile.c. */
gcov_type count; gcov_type count;
...@@ -373,10 +376,6 @@ extern void clear_edges (void); ...@@ -373,10 +376,6 @@ extern void clear_edges (void);
extern void mark_critical_edges (void); extern void mark_critical_edges (void);
extern rtx first_insn_after_basic_block_note (basic_block); extern rtx first_insn_after_basic_block_note (basic_block);
/* Dominator information for basic blocks. */
typedef struct dominance_info *dominance_info;
/* Structure to group all of the information to process IF-THEN and /* Structure to group all of the information to process IF-THEN and
IF-THEN-ELSE blocks for the conditional execution support. This IF-THEN-ELSE blocks for the conditional execution support. This
needs to be in a public file in case the IFCVT macros call needs to be in a public file in case the IFCVT macros call
...@@ -612,22 +611,35 @@ enum cdi_direction ...@@ -612,22 +611,35 @@ enum cdi_direction
CDI_POST_DOMINATORS CDI_POST_DOMINATORS
}; };
extern dominance_info calculate_dominance_info (enum cdi_direction); enum dom_state
extern void free_dominance_info (dominance_info); {
extern basic_block nearest_common_dominator (dominance_info, DOM_NONE, /* Not computed at all. */
DOM_CONS_OK, /* The data is conservatively OK, i.e. if it says you that A dominates B,
it indeed does. */
DOM_NO_FAST_QUERY, /* The data is OK, but the fast query data are not usable. */
DOM_OK /* Everything is ok. */
};
extern enum dom_state dom_computed[2];
extern void calculate_dominance_info (enum cdi_direction);
extern void free_dominance_info (enum cdi_direction);
extern basic_block nearest_common_dominator (enum cdi_direction,
basic_block, basic_block); basic_block, basic_block);
extern void set_immediate_dominator (dominance_info, basic_block, extern void set_immediate_dominator (enum cdi_direction, basic_block,
basic_block); basic_block);
extern basic_block get_immediate_dominator (dominance_info, basic_block); extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
extern bool dominated_by_p (dominance_info, basic_block, basic_block); extern bool dominated_by_p (enum cdi_direction, basic_block, basic_block);
extern int get_dominated_by (dominance_info, basic_block, basic_block **); extern int get_dominated_by (enum cdi_direction, basic_block, basic_block **);
extern void add_to_dominance_info (dominance_info, basic_block); extern void add_to_dominance_info (enum cdi_direction, basic_block);
extern void delete_from_dominance_info (dominance_info, basic_block); extern void delete_from_dominance_info (enum cdi_direction, basic_block);
basic_block recount_dominator (dominance_info, basic_block); basic_block recount_dominator (enum cdi_direction, basic_block);
extern void redirect_immediate_dominators (dominance_info, basic_block, extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
basic_block); basic_block);
void iterate_fix_dominators (dominance_info, basic_block *, int); extern void iterate_fix_dominators (enum cdi_direction, basic_block *, int);
extern void verify_dominators (dominance_info); extern void verify_dominators (enum cdi_direction);
extern basic_block first_dom_son (enum cdi_direction, basic_block);
extern basic_block next_dom_son (enum cdi_direction, basic_block);
#include "cfghooks.h" #include "cfghooks.h"
......
...@@ -155,9 +155,6 @@ static void note_btr_set (rtx, rtx, void *); ...@@ -155,9 +155,6 @@ static void note_btr_set (rtx, rtx, void *);
migrating branch target load instructions. */ migrating branch target load instructions. */
static struct obstack migrate_btrl_obstack; static struct obstack migrate_btrl_obstack;
/* Basic block dominator information used when migrating PT instructions. */
static dominance_info dom;
/* Array indexed by basic block number, giving the set of registers /* Array indexed by basic block number, giving the set of registers
live in that block. */ live in that block. */
static HARD_REG_SET *btrs_live; static HARD_REG_SET *btrs_live;
...@@ -840,9 +837,9 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range, ...@@ -840,9 +837,9 @@ augment_live_range (bitmap live_range, HARD_REG_SET *btrs_live_in_range,
tos = worklist = xmalloc (sizeof (basic_block) * (n_basic_blocks + 1)); tos = worklist = xmalloc (sizeof (basic_block) * (n_basic_blocks + 1));
if (dominated_by_p (dom, new_bb, head_bb)) if (dominated_by_p (CDI_DOMINATORS, new_bb, head_bb))
*tos++ = new_bb; *tos++ = new_bb;
else if (dominated_by_p (dom, head_bb, new_bb)) else if (dominated_by_p (CDI_DOMINATORS, head_bb, new_bb))
{ {
edge e; edge e;
int new_block = new_bb->index; int new_block = new_bb->index;
...@@ -974,7 +971,7 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range) ...@@ -974,7 +971,7 @@ combine_btr_defs (btr_def def, HARD_REG_SET *btrs_live_in_range)
if (other_def != def if (other_def != def
&& other_def->uses != NULL && other_def->uses != NULL
&& ! other_def->has_ambiguous_use && ! other_def->has_ambiguous_use
&& dominated_by_p (dom, other_def->bb, def->bb)) && dominated_by_p (CDI_DOMINATORS, other_def->bb, def->bb))
{ {
/* def->bb dominates the other def, so def and other_def could /* def->bb dominates the other def, so def and other_def could
be combined. */ be combined. */
...@@ -1226,9 +1223,9 @@ migrate_btr_def (btr_def def, int min_cost) ...@@ -1226,9 +1223,9 @@ migrate_btr_def (btr_def def, int min_cost)
def_basic_block_freq = basic_block_freq (def->bb); def_basic_block_freq = basic_block_freq (def->bb);
for (try = get_immediate_dominator (dom, def->bb); for (try = get_immediate_dominator (CDI_DOMINATORS, def->bb);
!give_up && try && try != ENTRY_BLOCK_PTR && def->cost >= min_cost; !give_up && try && try != ENTRY_BLOCK_PTR && def->cost >= min_cost;
try = get_immediate_dominator (dom, try)) try = get_immediate_dominator (CDI_DOMINATORS, try))
{ {
/* Try to move the instruction that sets the target register into /* Try to move the instruction that sets the target register into
basic block TRY. */ basic block TRY. */
...@@ -1299,7 +1296,7 @@ migrate_btr_defs (enum reg_class btr_class, int allow_callee_save) ...@@ -1299,7 +1296,7 @@ migrate_btr_defs (enum reg_class btr_class, int allow_callee_save)
"Basic block %d: count = " HOST_WIDEST_INT_PRINT_DEC "Basic block %d: count = " HOST_WIDEST_INT_PRINT_DEC
" loop-depth = %d idom = %d\n", " loop-depth = %d idom = %d\n",
i, (HOST_WIDEST_INT) bb->count, bb->loop_depth, i, (HOST_WIDEST_INT) bb->count, bb->loop_depth,
get_immediate_dominator (dom, bb)->index); get_immediate_dominator (CDI_DOMINATORS, bb)->index);
} }
} }
...@@ -1367,12 +1364,12 @@ branch_target_load_optimize (rtx insns, bool after_prologue_epilogue_gen) ...@@ -1367,12 +1364,12 @@ branch_target_load_optimize (rtx insns, bool after_prologue_epilogue_gen)
life_analysis (insns, NULL, 0); life_analysis (insns, NULL, 0);
/* Dominator info is also needed for migrate_btr_def. */ /* Dominator info is also needed for migrate_btr_def. */
dom = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
migrate_btr_defs (class, migrate_btr_defs (class,
((*targetm.branch_target_register_callee_saved) ((*targetm.branch_target_register_callee_saved)
(after_prologue_epilogue_gen))); (after_prologue_epilogue_gen)));
free_dominance_info (dom); free_dominance_info (CDI_DOMINATORS);
update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES, update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
PROP_DEATH_NOTES | PROP_REG_INFO); PROP_DEATH_NOTES | PROP_REG_INFO);
......
...@@ -111,6 +111,7 @@ struct basic_block_def entry_exit_blocks[2] ...@@ -111,6 +111,7 @@ struct basic_block_def entry_exit_blocks[2]
EXIT_BLOCK_PTR, /* next_bb */ EXIT_BLOCK_PTR, /* next_bb */
0, /* loop_depth */ 0, /* loop_depth */
NULL, /* loop_father */ NULL, /* loop_father */
{ NULL, NULL }, /* dom */
0, /* count */ 0, /* count */
0, /* frequency */ 0, /* frequency */
0, /* flags */ 0, /* flags */
...@@ -133,6 +134,7 @@ struct basic_block_def entry_exit_blocks[2] ...@@ -133,6 +134,7 @@ struct basic_block_def entry_exit_blocks[2]
NULL, /* next_bb */ NULL, /* next_bb */
0, /* loop_depth */ 0, /* loop_depth */
NULL, /* loop_father */ NULL, /* loop_father */
{ NULL, NULL }, /* dom */
0, /* count */ 0, /* count */
0, /* frequency */ 0, /* frequency */
0, /* flags */ 0, /* flags */
......
...@@ -1253,7 +1253,7 @@ end: ...@@ -1253,7 +1253,7 @@ end:
void void
copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
edge *edges, unsigned n_edges, edge *new_edges, edge *edges, unsigned n_edges, edge *new_edges,
struct loop *base, struct loops *loops) struct loop *base)
{ {
unsigned i, j; unsigned i, j;
basic_block bb, new_bb, dom_bb; basic_block bb, new_bb, dom_bb;
...@@ -1268,7 +1268,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, ...@@ -1268,7 +1268,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
bb->rbi->duplicated = 1; bb->rbi->duplicated = 1;
/* Add to loop. */ /* Add to loop. */
add_bb_to_loop (new_bb, bb->loop_father->copy); add_bb_to_loop (new_bb, bb->loop_father->copy);
add_to_dominance_info (loops->cfg.dom, new_bb); add_to_dominance_info (CDI_DOMINATORS, new_bb);
/* Possibly set header. */ /* Possibly set header. */
if (bb->loop_father->header == bb && bb->loop_father != base) if (bb->loop_father->header == bb && bb->loop_father != base)
new_bb->loop_father->header = new_bb; new_bb->loop_father->header = new_bb;
...@@ -1283,11 +1283,11 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, ...@@ -1283,11 +1283,11 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
bb = bbs[i]; bb = bbs[i];
new_bb = new_bbs[i]; new_bb = new_bbs[i];
dom_bb = get_immediate_dominator (loops->cfg.dom, bb); dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
if (dom_bb->rbi->duplicated) if (dom_bb->rbi->duplicated)
{ {
dom_bb = dom_bb->rbi->copy; dom_bb = dom_bb->rbi->copy;
set_immediate_dominator (loops->cfg.dom, new_bb, dom_bb); set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
} }
} }
......
...@@ -43,5 +43,5 @@ extern void insn_locators_initialize (void); ...@@ -43,5 +43,5 @@ extern void insn_locators_initialize (void);
extern void reemit_insn_block_notes (void); extern void reemit_insn_block_notes (void);
extern bool can_copy_bbs_p (basic_block *, unsigned); extern bool can_copy_bbs_p (basic_block *, unsigned);
extern void copy_bbs (basic_block *, unsigned, basic_block *, extern void copy_bbs (basic_block *, unsigned, basic_block *,
edge *, unsigned, edge *, struct loop *, struct loops *); edge *, unsigned, edge *, struct loop *);
extern void cfg_layout_initialize_rbi (basic_block); extern void cfg_layout_initialize_rbi (basic_block);
...@@ -38,7 +38,7 @@ static void flow_loop_entry_edges_find (struct loop *); ...@@ -38,7 +38,7 @@ static void flow_loop_entry_edges_find (struct loop *);
static void flow_loop_exit_edges_find (struct loop *); static void flow_loop_exit_edges_find (struct loop *);
static int flow_loop_nodes_find (basic_block, struct loop *); static int flow_loop_nodes_find (basic_block, struct loop *);
static void flow_loop_pre_header_scan (struct loop *); static void flow_loop_pre_header_scan (struct loop *);
static basic_block flow_loop_pre_header_find (basic_block, dominance_info); static basic_block flow_loop_pre_header_find (basic_block);
static int flow_loop_level_compute (struct loop *); static int flow_loop_level_compute (struct loop *);
static int flow_loops_level_compute (struct loops *); static int flow_loops_level_compute (struct loops *);
static void establish_preds (struct loop *); static void establish_preds (struct loop *);
...@@ -55,7 +55,7 @@ flow_loops_cfg_dump (const struct loops *loops, FILE *file) ...@@ -55,7 +55,7 @@ flow_loops_cfg_dump (const struct loops *loops, FILE *file)
int i; int i;
basic_block bb; basic_block bb;
if (! loops->num || ! file || ! loops->cfg.dom) if (! loops->num || ! file)
return; return;
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
...@@ -212,9 +212,6 @@ flow_loops_free (struct loops *loops) ...@@ -212,9 +212,6 @@ flow_loops_free (struct loops *loops)
free (loops->parray); free (loops->parray);
loops->parray = NULL; loops->parray = NULL;
if (loops->cfg.dom)
free_dominance_info (loops->cfg.dom);
if (loops->cfg.dfs_order) if (loops->cfg.dfs_order)
free (loops->cfg.dfs_order); free (loops->cfg.dfs_order);
if (loops->cfg.rc_order) if (loops->cfg.rc_order)
...@@ -391,11 +388,10 @@ flow_loop_pre_header_scan (struct loop *loop) ...@@ -391,11 +388,10 @@ flow_loop_pre_header_scan (struct loop *loop)
} }
/* Return the block for the pre-header of the loop with header /* Return the block for the pre-header of the loop with header
HEADER where DOM specifies the dominator information. Return NULL if HEADER. Return NULL if there is no pre-header. */
there is no pre-header. */
static basic_block static basic_block
flow_loop_pre_header_find (basic_block header, dominance_info dom) flow_loop_pre_header_find (basic_block header)
{ {
basic_block pre_header; basic_block pre_header;
edge e; edge e;
...@@ -408,7 +404,7 @@ flow_loop_pre_header_find (basic_block header, dominance_info dom) ...@@ -408,7 +404,7 @@ flow_loop_pre_header_find (basic_block header, dominance_info dom)
basic_block node = e->src; basic_block node = e->src;
if (node != ENTRY_BLOCK_PTR if (node != ENTRY_BLOCK_PTR
&& ! dominated_by_p (dom, node, header)) && ! dominated_by_p (CDI_DOMINATORS, node, header))
{ {
if (pre_header == NULL) if (pre_header == NULL)
pre_header = node; pre_header = node;
...@@ -522,7 +518,7 @@ flow_loops_level_compute (struct loops *loops) ...@@ -522,7 +518,7 @@ flow_loops_level_compute (struct loops *loops)
about it specified by FLAGS. */ about it specified by FLAGS. */
int int
flow_loop_scan (struct loops *loops, struct loop *loop, int flags) flow_loop_scan (struct loop *loop, int flags)
{ {
if (flags & LOOP_ENTRY_EDGES) if (flags & LOOP_ENTRY_EDGES)
{ {
...@@ -541,8 +537,7 @@ flow_loop_scan (struct loops *loops, struct loop *loop, int flags) ...@@ -541,8 +537,7 @@ flow_loop_scan (struct loops *loops, struct loop *loop, int flags)
if (flags & LOOP_PRE_HEADER) if (flags & LOOP_PRE_HEADER)
{ {
/* Look to see if the loop has a pre-header node. */ /* Look to see if the loop has a pre-header node. */
loop->pre_header loop->pre_header = flow_loop_pre_header_find (loop->header);
= flow_loop_pre_header_find (loop->header, loops->cfg.dom);
/* Find the blocks within the extended basic block of /* Find the blocks within the extended basic block of
the loop pre-header. */ the loop pre-header. */
...@@ -627,12 +622,11 @@ make_forwarder_block (basic_block bb, int redirect_latch, int redirect_nonlatch, ...@@ -627,12 +622,11 @@ make_forwarder_block (basic_block bb, int redirect_latch, int redirect_nonlatch,
static void static void
canonicalize_loop_headers (void) canonicalize_loop_headers (void)
{ {
dominance_info dom;
basic_block header; basic_block header;
edge e; edge e;
/* Compute the dominators. */ /* Compute the dominators. */
dom = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
alloc_aux_for_blocks (sizeof (int)); alloc_aux_for_blocks (sizeof (int));
alloc_aux_for_edges (sizeof (int)); alloc_aux_for_edges (sizeof (int));
...@@ -651,7 +645,7 @@ canonicalize_loop_headers (void) ...@@ -651,7 +645,7 @@ canonicalize_loop_headers (void)
have_abnormal_edge = 1; have_abnormal_edge = 1;
if (latch != ENTRY_BLOCK_PTR if (latch != ENTRY_BLOCK_PTR
&& dominated_by_p (dom, latch, header)) && dominated_by_p (CDI_DOMINATORS, latch, header))
{ {
num_latches++; num_latches++;
LATCH_EDGE (e) = 1; LATCH_EDGE (e) = 1;
...@@ -663,6 +657,8 @@ canonicalize_loop_headers (void) ...@@ -663,6 +657,8 @@ canonicalize_loop_headers (void)
HEADER_BLOCK (header) = num_latches; HEADER_BLOCK (header) = num_latches;
} }
free_dominance_info (CDI_DOMINATORS);
if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest)) if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
{ {
basic_block bb; basic_block bb;
...@@ -728,7 +724,6 @@ canonicalize_loop_headers (void) ...@@ -728,7 +724,6 @@ canonicalize_loop_headers (void)
free_aux_for_blocks (); free_aux_for_blocks ();
free_aux_for_edges (); free_aux_for_edges ();
free_dominance_info (dom);
} }
/* Find all the natural loops in the function and save in LOOPS structure and /* Find all the natural loops in the function and save in LOOPS structure and
...@@ -744,7 +739,6 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -744,7 +739,6 @@ flow_loops_find (struct loops *loops, int flags)
int num_loops; int num_loops;
edge e; edge e;
sbitmap headers; sbitmap headers;
dominance_info dom;
int *dfs_order; int *dfs_order;
int *rc_order; int *rc_order;
basic_block header; basic_block header;
...@@ -770,7 +764,7 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -770,7 +764,7 @@ flow_loops_find (struct loops *loops, int flags)
canonicalize_loop_headers (); canonicalize_loop_headers ();
/* Compute the dominators. */ /* Compute the dominators. */
dom = loops->cfg.dom = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
/* Count the number of loop headers. This should be the /* Count the number of loop headers. This should be the
same as the number of natural loops. */ same as the number of natural loops. */
...@@ -804,7 +798,8 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -804,7 +798,8 @@ flow_loops_find (struct loops *loops, int flags)
node (header) that dominates all the nodes in the node (header) that dominates all the nodes in the
loop. It also has single back edge to the header loop. It also has single back edge to the header
from a latch node. */ from a latch node. */
if (latch != ENTRY_BLOCK_PTR && dominated_by_p (dom, latch, header)) if (latch != ENTRY_BLOCK_PTR
&& dominated_by_p (CDI_DOMINATORS, latch, header))
{ {
/* Shared headers should be eliminated by now. */ /* Shared headers should be eliminated by now. */
if (more_latches) if (more_latches)
...@@ -849,7 +844,6 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -849,7 +844,6 @@ flow_loops_find (struct loops *loops, int flags)
flow_depth_first_order_compute (dfs_order, rc_order); flow_depth_first_order_compute (dfs_order, rc_order);
/* Save CFG derived information to avoid recomputing it. */ /* Save CFG derived information to avoid recomputing it. */
loops->cfg.dom = dom;
loops->cfg.dfs_order = dfs_order; loops->cfg.dfs_order = dfs_order;
loops->cfg.rc_order = rc_order; loops->cfg.rc_order = rc_order;
...@@ -878,7 +872,7 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -878,7 +872,7 @@ flow_loops_find (struct loops *loops, int flags)
basic_block latch = e->src; basic_block latch = e->src;
if (latch != ENTRY_BLOCK_PTR if (latch != ENTRY_BLOCK_PTR
&& dominated_by_p (dom, latch, header)) && dominated_by_p (CDI_DOMINATORS, latch, header))
{ {
loop->latch = latch; loop->latch = latch;
break; break;
...@@ -897,14 +891,13 @@ flow_loops_find (struct loops *loops, int flags) ...@@ -897,14 +891,13 @@ flow_loops_find (struct loops *loops, int flags)
/* Scan the loops. */ /* Scan the loops. */
for (i = 1; i < num_loops; i++) for (i = 1; i < num_loops; i++)
flow_loop_scan (loops, loops->parray[i], flags); flow_loop_scan (loops->parray[i], flags);
loops->num = num_loops; loops->num = num_loops;
} }
else else
{ {
loops->cfg.dom = NULL; free_dominance_info (CDI_DOMINATORS);
free_dominance_info (dom);
} }
loops->state = 0; loops->state = 0;
......
...@@ -230,9 +230,6 @@ struct loops ...@@ -230,9 +230,6 @@ struct loops
/* Information derived from the CFG. */ /* Information derived from the CFG. */
struct cfg struct cfg
{ {
/* The bitmap vector of dominators or NULL if not computed. */
dominance_info dom;
/* The ordering of the basic blocks in a depth first search. */ /* The ordering of the basic blocks in a depth first search. */
int *dfs_order; int *dfs_order;
...@@ -265,7 +262,7 @@ extern void flow_loops_dump (const struct loops *, FILE *, ...@@ -265,7 +262,7 @@ extern void flow_loops_dump (const struct loops *, FILE *,
void (*)(const struct loop *, FILE *, int), int); void (*)(const struct loop *, FILE *, int), int);
extern void flow_loop_dump (const struct loop *, FILE *, extern void flow_loop_dump (const struct loop *, FILE *,
void (*)(const struct loop *, FILE *, int), int); void (*)(const struct loop *, FILE *, int), int);
extern int flow_loop_scan (struct loops *, struct loop *, int); extern int flow_loop_scan (struct loop *, int);
extern void flow_loop_free (struct loop *); extern void flow_loop_free (struct loop *);
void mark_irreducible_loops (struct loops *); void mark_irreducible_loops (struct loops *);
...@@ -292,7 +289,7 @@ extern void remove_bb_from_loops (basic_block); ...@@ -292,7 +289,7 @@ extern void remove_bb_from_loops (basic_block);
extern void cancel_loop (struct loops *, struct loop *); extern void cancel_loop (struct loops *, struct loop *);
extern void cancel_loop_tree (struct loops *, struct loop *); extern void cancel_loop_tree (struct loops *, struct loop *);
extern basic_block loop_split_edge_with (edge, rtx, struct loops *); extern basic_block loop_split_edge_with (edge, rtx);
extern int fix_loop_placement (struct loop *); extern int fix_loop_placement (struct loop *);
enum enum
...@@ -306,10 +303,9 @@ extern void force_single_succ_latches (struct loops *); ...@@ -306,10 +303,9 @@ extern void force_single_succ_latches (struct loops *);
extern void verify_loop_structure (struct loops *); extern void verify_loop_structure (struct loops *);
/* Loop analysis. */ /* Loop analysis. */
extern bool simple_loop_p (struct loops *, struct loop *, struct loop_desc *); extern bool simple_loop_p (struct loop *, struct loop_desc *);
extern rtx count_loop_iterations (struct loop_desc *, rtx, rtx); extern rtx count_loop_iterations (struct loop_desc *, rtx, rtx);
extern bool just_once_each_iteration_p (struct loops *,struct loop *, extern bool just_once_each_iteration_p (struct loop *, basic_block);
basic_block);
extern unsigned expected_loop_iterations (const struct loop *); extern unsigned expected_loop_iterations (const struct loop *);
/* Loop manipulation. */ /* Loop manipulation. */
...@@ -324,7 +320,7 @@ extern int duplicate_loop_to_header_edge (struct loop *, edge, struct loops *, ...@@ -324,7 +320,7 @@ extern int duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
extern struct loop *loopify (struct loops *, edge, edge, basic_block); extern struct loop *loopify (struct loops *, edge, edge, basic_block);
extern void unloop (struct loops *, struct loop *); extern void unloop (struct loops *, struct loop *);
extern bool remove_path (struct loops *, edge); extern bool remove_path (struct loops *, edge);
extern edge split_loop_bb (struct loops *, basic_block, rtx); extern edge split_loop_bb (basic_block, rtx);
/* Loop optimizer initialization. */ /* Loop optimizer initialization. */
extern struct loops *loop_optimizer_init (FILE *); extern struct loops *loop_optimizer_init (FILE *);
......
...@@ -39,14 +39,13 @@ static bool invariant_rtx_wrto_regs_p (rtx, regset); ...@@ -39,14 +39,13 @@ static bool invariant_rtx_wrto_regs_p (rtx, regset);
static rtx test_for_iteration (struct loop_desc *desc, unsigned HOST_WIDE_INT); static rtx test_for_iteration (struct loop_desc *desc, unsigned HOST_WIDE_INT);
static bool constant_iterations (struct loop_desc *, unsigned HOST_WIDE_INT *, static bool constant_iterations (struct loop_desc *, unsigned HOST_WIDE_INT *,
bool *); bool *);
static bool simple_loop_exit_p (struct loops *, struct loop *, edge, regset, static bool simple_loop_exit_p (struct loop *, edge, regset,
rtx *, struct loop_desc *); rtx *, struct loop_desc *);
static rtx variable_initial_value (rtx, regset, rtx, rtx *, enum machine_mode); static rtx variable_initial_value (rtx, regset, rtx, rtx *, enum machine_mode);
static rtx variable_initial_values (edge, rtx, enum machine_mode); static rtx variable_initial_values (edge, rtx, enum machine_mode);
static bool simple_condition_p (struct loop *, rtx, regset, static bool simple_condition_p (struct loop *, rtx, regset,
struct loop_desc *); struct loop_desc *);
static basic_block simple_increment (struct loops *, struct loop *, rtx *, static basic_block simple_increment (struct loop *, rtx *, struct loop_desc *);
struct loop_desc *);
static rtx count_strange_loop_iterations (rtx, rtx, enum rtx_code, static rtx count_strange_loop_iterations (rtx, rtx, enum rtx_code,
int, rtx, enum machine_mode, int, rtx, enum machine_mode,
enum machine_mode); enum machine_mode);
...@@ -73,10 +72,10 @@ inverse (unsigned HOST_WIDEST_INT x, int mod) ...@@ -73,10 +72,10 @@ inverse (unsigned HOST_WIDEST_INT x, int mod)
/* Checks whether BB is executed exactly once in each LOOP iteration. */ /* Checks whether BB is executed exactly once in each LOOP iteration. */
bool bool
just_once_each_iteration_p (struct loops *loops, struct loop *loop, basic_block bb) just_once_each_iteration_p (struct loop *loop, basic_block bb)
{ {
/* It must be executed at least once each iteration. */ /* It must be executed at least once each iteration. */
if (!dominated_by_p (loops->cfg.dom, loop->latch, bb)) if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb))
return false; return false;
/* And just once. */ /* And just once. */
...@@ -295,8 +294,8 @@ simple_condition_p (struct loop *loop ATTRIBUTE_UNUSED, rtx condition, ...@@ -295,8 +294,8 @@ simple_condition_p (struct loop *loop ATTRIBUTE_UNUSED, rtx condition,
iteration. Fills in DESC->stride and returns block in that DESC->var is iteration. Fills in DESC->stride and returns block in that DESC->var is
modified. */ modified. */
static basic_block static basic_block
simple_increment (struct loops *loops, struct loop *loop, simple_increment (struct loop *loop, rtx *simple_increment_regs,
rtx *simple_increment_regs, struct loop_desc *desc) struct loop_desc *desc)
{ {
rtx mod_insn, mod_insn1, set, set_src, set_add; rtx mod_insn, mod_insn1, set, set_src, set_add;
basic_block mod_bb, mod_bb1; basic_block mod_bb, mod_bb1;
...@@ -308,7 +307,7 @@ simple_increment (struct loops *loops, struct loop *loop, ...@@ -308,7 +307,7 @@ simple_increment (struct loops *loops, struct loop *loop,
mod_bb = BLOCK_FOR_INSN (mod_insn); mod_bb = BLOCK_FOR_INSN (mod_insn);
/* Check that it is executed exactly once each iteration. */ /* Check that it is executed exactly once each iteration. */
if (!just_once_each_iteration_p (loops, loop, mod_bb)) if (!just_once_each_iteration_p (loop, mod_bb))
return NULL; return NULL;
/* mod_insn must be a simple increment/decrement. */ /* mod_insn must be a simple increment/decrement. */
...@@ -355,7 +354,7 @@ simple_increment (struct loops *loops, struct loop *loop, ...@@ -355,7 +354,7 @@ simple_increment (struct loops *loops, struct loop *loop,
return NULL; return NULL;
mod_bb1 = BLOCK_FOR_INSN (mod_insn1); mod_bb1 = BLOCK_FOR_INSN (mod_insn1);
if (!dominated_by_p (loops->cfg.dom, mod_bb, mod_bb1)) if (!dominated_by_p (CDI_DOMINATORS, mod_bb, mod_bb1))
return NULL; return NULL;
if (mod_bb1 == mod_bb) if (mod_bb1 == mod_bb)
{ {
...@@ -962,7 +961,7 @@ test_for_iteration (struct loop_desc *desc, unsigned HOST_WIDE_INT iter) ...@@ -962,7 +961,7 @@ test_for_iteration (struct loop_desc *desc, unsigned HOST_WIDE_INT iter)
description joined to it in in DESC. INVARIANT_REGS and SINGLE_SET_REGS description joined to it in in DESC. INVARIANT_REGS and SINGLE_SET_REGS
are results of blocks_{invariant,single_set}_regs over BODY. */ are results of blocks_{invariant,single_set}_regs over BODY. */
static bool static bool
simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge, simple_loop_exit_p (struct loop *loop, edge exit_edge,
regset invariant_regs, rtx *single_set_regs, regset invariant_regs, rtx *single_set_regs,
struct loop_desc *desc) struct loop_desc *desc)
{ {
...@@ -979,7 +978,7 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge, ...@@ -979,7 +978,7 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge,
return false; return false;
/* It must be tested (at least) once during any iteration. */ /* It must be tested (at least) once during any iteration. */
if (!dominated_by_p (loops->cfg.dom, loop->latch, exit_bb)) if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit_bb))
return false; return false;
/* It must end in a simple conditional jump. */ /* It must end in a simple conditional jump. */
...@@ -1003,11 +1002,11 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge, ...@@ -1003,11 +1002,11 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge,
/* Var must be simply incremented or decremented in exactly one insn that /* Var must be simply incremented or decremented in exactly one insn that
is executed just once every iteration. */ is executed just once every iteration. */
if (!(mod_bb = simple_increment (loops, loop, single_set_regs, desc))) if (!(mod_bb = simple_increment (loop, single_set_regs, desc)))
return false; return false;
/* OK, it is simple loop. Now just fill in remaining info. */ /* OK, it is simple loop. Now just fill in remaining info. */
desc->postincr = !dominated_by_p (loops->cfg.dom, exit_bb, mod_bb); desc->postincr = !dominated_by_p (CDI_DOMINATORS, exit_bb, mod_bb);
desc->neg = !fallthru_out; desc->neg = !fallthru_out;
/* Find initial value of var and alternative values for lim. */ /* Find initial value of var and alternative values for lim. */
...@@ -1026,7 +1025,7 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge, ...@@ -1026,7 +1025,7 @@ simple_loop_exit_p (struct loops *loops, struct loop *loop, edge exit_edge,
/* Tests whether LOOP is simple for loop. Returns simple loop description /* Tests whether LOOP is simple for loop. Returns simple loop description
in DESC. */ in DESC. */
bool bool
simple_loop_p (struct loops *loops, struct loop *loop, struct loop_desc *desc) simple_loop_p (struct loop *loop, struct loop_desc *desc)
{ {
unsigned i; unsigned i;
basic_block *body; basic_block *body;
...@@ -1051,7 +1050,7 @@ simple_loop_p (struct loops *loops, struct loop *loop, struct loop_desc *desc) ...@@ -1051,7 +1050,7 @@ simple_loop_p (struct loops *loops, struct loop *loop, struct loop_desc *desc)
{ {
for (e = body[i]->succ; e; e = e->succ_next) for (e = body[i]->succ; e; e = e->succ_next)
if (!flow_bb_inside_loop_p (loop, e->dest) if (!flow_bb_inside_loop_p (loop, e->dest)
&& simple_loop_exit_p (loops, loop, e, && simple_loop_exit_p (loop, e,
invariant_regs, single_set_regs, &act)) invariant_regs, single_set_regs, &act))
{ {
/* Prefer constant iterations; the less the better. */ /* Prefer constant iterations; the less the better. */
......
...@@ -55,26 +55,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ...@@ -55,26 +55,28 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
typedef struct et_forest *et_forest_t; /* The node representing the node in an et tree. */
typedef struct et_forest_node *et_forest_node_t; struct et_node
{
extern et_forest_t et_forest_create (void); void *data; /* The data represented by the node. */
extern void et_forest_delete (et_forest_t); int dfs_num_in, dfs_num_out; /* Number of the node in the dfs ordering. */
extern et_forest_node_t et_forest_add_node (et_forest_t, void *); struct et_node *father; /* Father of the node. */
extern int et_forest_add_edge (et_forest_t, et_forest_node_t, struct et_node *son; /* The first of the sons of the node. */
et_forest_node_t); struct et_node *left;
extern void et_forest_remove_node (et_forest_t, et_forest_node_t); struct et_node *right; /* The brothers of the node. */
extern int et_forest_remove_edge (et_forest_t, et_forest_node_t,
et_forest_node_t); struct et_occ *rightmost_occ; /* The rightmost occurence. */
extern et_forest_node_t et_forest_parent (et_forest_t, et_forest_node_t); struct et_occ *parent_occ; /* The occurence of the parent node. */
extern et_forest_node_t et_forest_common_ancestor (et_forest_t, };
et_forest_node_t,
et_forest_node_t); struct et_node *et_new_tree (void *data);
extern void * et_forest_node_value (et_forest_t, et_forest_node_t); void et_free_tree (struct et_node *);
extern int et_forest_enumerate_sons (et_forest_t, et_forest_node_t, void et_set_father (struct et_node *, struct et_node *);
et_forest_node_t *); void et_split (struct et_node *);
struct et_node *et_nca (struct et_node *, struct et_node *);
bool et_below (struct et_node *, struct et_node *);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -6408,8 +6408,6 @@ allocate_struct_function (tree fndecl) ...@@ -6408,8 +6408,6 @@ allocate_struct_function (tree fndecl)
DECL_SAVED_INSNS (fndecl) = cfun; DECL_SAVED_INSNS (fndecl) = cfun;
cfun->decl = fndecl; cfun->decl = fndecl;
current_function_name = (*lang_hooks.decl_printable_name) (fndecl, 2);
result = DECL_RESULT (fndecl); result = DECL_RESULT (fndecl);
if (aggregate_value_p (result, fndecl)) if (aggregate_value_p (result, fndecl))
{ {
......
...@@ -183,9 +183,6 @@ struct function GTY(()) ...@@ -183,9 +183,6 @@ struct function GTY(())
/* For function.c. */ /* For function.c. */
/* Name of this function. */
const char *name;
/* Points to the FUNCTION_DECL of this function. */ /* Points to the FUNCTION_DECL of this function. */
tree decl; tree decl;
...@@ -534,7 +531,6 @@ extern int virtuals_instantiated; ...@@ -534,7 +531,6 @@ extern int virtuals_instantiated;
extern int trampolines_created; extern int trampolines_created;
/* For backward compatibility... eventually these should all go away. */ /* For backward compatibility... eventually these should all go away. */
#define current_function_name (cfun->name)
#define current_function_pops_args (cfun->pops_args) #define current_function_pops_args (cfun->pops_args)
#define current_function_returns_struct (cfun->returns_struct) #define current_function_returns_struct (cfun->returns_struct)
#define current_function_returns_pcc_struct (cfun->returns_pcc_struct) #define current_function_returns_pcc_struct (cfun->returns_pcc_struct)
......
...@@ -161,6 +161,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -161,6 +161,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "basic-block.h" #include "basic-block.h"
#include "output.h" #include "output.h"
#include "function.h" #include "function.h"
#include "langhooks.h"
#include "expr.h" #include "expr.h"
#include "except.h" #include "except.h"
#include "ggc.h" #include "ggc.h"
...@@ -855,7 +856,8 @@ gcse_main (rtx f, FILE *file) ...@@ -855,7 +856,8 @@ gcse_main (rtx f, FILE *file)
if (file) if (file)
{ {
fprintf (file, "GCSE of %s: %d basic blocks, ", fprintf (file, "GCSE of %s: %d basic blocks, ",
current_function_name, n_basic_blocks); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
n_basic_blocks);
fprintf (file, "%d pass%s, %d bytes\n\n", fprintf (file, "%d pass%s, %d bytes\n\n",
pass, pass > 1 ? "es" : "", max_pass_bytes); pass, pass > 1 ? "es" : "", max_pass_bytes);
} }
...@@ -3614,7 +3616,8 @@ one_classic_gcse_pass (int pass) ...@@ -3614,7 +3616,8 @@ one_classic_gcse_pass (int pass)
{ {
fprintf (gcse_file, "\n"); fprintf (gcse_file, "\n");
fprintf (gcse_file, "GCSE of %s, pass %d: %d bytes needed, %d substs,", fprintf (gcse_file, "GCSE of %s, pass %d: %d bytes needed, %d substs,",
current_function_name, pass, bytes_used, gcse_subst_count); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
pass, bytes_used, gcse_subst_count);
fprintf (gcse_file, "%d insns created\n", gcse_create_count); fprintf (gcse_file, "%d insns created\n", gcse_create_count);
} }
...@@ -4686,7 +4689,8 @@ one_cprop_pass (int pass, int cprop_jumps, int bypass_jumps) ...@@ -4686,7 +4689,8 @@ one_cprop_pass (int pass, int cprop_jumps, int bypass_jumps)
if (gcse_file) if (gcse_file)
{ {
fprintf (gcse_file, "CPROP of %s, pass %d: %d bytes needed, ", fprintf (gcse_file, "CPROP of %s, pass %d: %d bytes needed, ",
current_function_name, pass, bytes_used); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
pass, bytes_used);
fprintf (gcse_file, "%d const props, %d copy props\n\n", fprintf (gcse_file, "%d const props, %d copy props\n\n",
const_prop_count, copy_prop_count); const_prop_count, copy_prop_count);
} }
...@@ -5788,7 +5792,8 @@ one_pre_gcse_pass (int pass) ...@@ -5788,7 +5792,8 @@ one_pre_gcse_pass (int pass)
if (gcse_file) if (gcse_file)
{ {
fprintf (gcse_file, "\nPRE GCSE of %s, pass %d: %d bytes needed, ", fprintf (gcse_file, "\nPRE GCSE of %s, pass %d: %d bytes needed, ",
current_function_name, pass, bytes_used); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
pass, bytes_used);
fprintf (gcse_file, "%d substs, %d insns created\n", fprintf (gcse_file, "%d substs, %d insns created\n",
gcse_subst_count, gcse_create_count); gcse_subst_count, gcse_create_count);
} }
...@@ -6182,9 +6187,6 @@ static sbitmap *hoist_vbeout; ...@@ -6182,9 +6187,6 @@ static sbitmap *hoist_vbeout;
/* Hoistable expressions. */ /* Hoistable expressions. */
static sbitmap *hoist_exprs; static sbitmap *hoist_exprs;
/* Dominator bitmaps. */
dominance_info dominators;
/* ??? We could compute post dominators and run this algorithm in /* ??? We could compute post dominators and run this algorithm in
reverse to perform tail merging, doing so would probably be reverse to perform tail merging, doing so would probably be
more effective than the tail merging code in jump.c. more effective than the tail merging code in jump.c.
...@@ -6221,7 +6223,7 @@ free_code_hoist_mem (void) ...@@ -6221,7 +6223,7 @@ free_code_hoist_mem (void)
sbitmap_vector_free (hoist_exprs); sbitmap_vector_free (hoist_exprs);
sbitmap_vector_free (transpout); sbitmap_vector_free (transpout);
free_dominance_info (dominators); free_dominance_info (CDI_DOMINATORS);
} }
/* Compute the very busy expressions at entry/exit from each block. /* Compute the very busy expressions at entry/exit from each block.
...@@ -6270,7 +6272,7 @@ compute_code_hoist_data (void) ...@@ -6270,7 +6272,7 @@ compute_code_hoist_data (void)
compute_local_properties (transp, comp, antloc, &expr_hash_table); compute_local_properties (transp, comp, antloc, &expr_hash_table);
compute_transpout (); compute_transpout ();
compute_code_hoist_vbeinout (); compute_code_hoist_vbeinout ();
dominators = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
if (gcse_file) if (gcse_file)
fprintf (gcse_file, "\n"); fprintf (gcse_file, "\n");
} }
...@@ -6362,7 +6364,7 @@ hoist_code (void) ...@@ -6362,7 +6364,7 @@ hoist_code (void)
int found = 0; int found = 0;
int insn_inserted_p; int insn_inserted_p;
domby_len = get_dominated_by (dominators, bb, &domby); domby_len = get_dominated_by (CDI_DOMINATORS, bb, &domby);
/* Examine each expression that is very busy at the exit of this /* Examine each expression that is very busy at the exit of this
block. These are the potentially hoistable expressions. */ block. These are the potentially hoistable expressions. */
for (i = 0; i < hoist_vbeout[bb->index]->n_bits; i++) for (i = 0; i < hoist_vbeout[bb->index]->n_bits; i++)
...@@ -8020,7 +8022,8 @@ bypass_jumps (FILE *file) ...@@ -8020,7 +8022,8 @@ bypass_jumps (FILE *file)
if (file) if (file)
{ {
fprintf (file, "BYPASS of %s: %d basic blocks, ", fprintf (file, "BYPASS of %s: %d basic blocks, ",
current_function_name, n_basic_blocks); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
n_basic_blocks);
fprintf (file, "%d bytes\n\n", bytes_used); fprintf (file, "%d bytes\n\n", bytes_used);
} }
......
...@@ -25,9 +25,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -25,9 +25,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h" #include "tm.h"
#include "rtl.h" #include "rtl.h"
#include "tree.h"
#include "flags.h" #include "flags.h"
#include "output.h" #include "output.h"
#include "function.h" #include "function.h"
#include "langhooks.h"
#include "hard-reg-set.h" #include "hard-reg-set.h"
#include "basic-block.h" #include "basic-block.h"
#include "toplev.h" #include "toplev.h"
...@@ -55,7 +57,8 @@ start_fct (FILE *fp) ...@@ -55,7 +57,8 @@ start_fct (FILE *fp)
case vcg: case vcg:
fprintf (fp, "\ fprintf (fp, "\
graph: { title: \"%s\"\nfolding: 1\nhidden: 2\nnode: { title: \"%s.0\" }\n", graph: { title: \"%s\"\nfolding: 1\nhidden: 2\nnode: { title: \"%s.0\" }\n",
current_function_name, current_function_name); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
(*lang_hooks.decl_printable_name) (current_function_decl, 2));
break; break;
case no_graph: case no_graph:
break; break;
...@@ -71,7 +74,8 @@ start_bb (FILE *fp, int bb) ...@@ -71,7 +74,8 @@ start_bb (FILE *fp, int bb)
fprintf (fp, "\ fprintf (fp, "\
graph: {\ntitle: \"%s.BB%d\"\nfolding: 1\ncolor: lightblue\n\ graph: {\ntitle: \"%s.BB%d\"\nfolding: 1\ncolor: lightblue\n\
label: \"basic block %d", label: \"basic block %d",
current_function_name, bb, bb); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
bb, bb);
break; break;
case no_graph: case no_graph:
break; break;
...@@ -113,8 +117,9 @@ node_data (FILE *fp, rtx tmp_rtx) ...@@ -113,8 +117,9 @@ node_data (FILE *fp, rtx tmp_rtx)
case vcg: case vcg:
fprintf (fp, "\ fprintf (fp, "\
edge: { sourcename: \"%s.0\" targetname: \"%s.%d\" }\n", edge: { sourcename: \"%s.0\" targetname: \"%s.%d\" }\n",
current_function_name, (*lang_hooks.decl_printable_name) (current_function_decl, 2),
current_function_name, XINT (tmp_rtx, 0)); (*lang_hooks.decl_printable_name) (current_function_decl, 2),
XINT (tmp_rtx, 0));
break; break;
case no_graph: case no_graph:
break; break;
...@@ -126,7 +131,8 @@ edge: { sourcename: \"%s.0\" targetname: \"%s.%d\" }\n", ...@@ -126,7 +131,8 @@ edge: { sourcename: \"%s.0\" targetname: \"%s.%d\" }\n",
case vcg: case vcg:
fprintf (fp, "node: {\n title: \"%s.%d\"\n color: %s\n \ fprintf (fp, "node: {\n title: \"%s.%d\"\n color: %s\n \
label: \"%s %d\n", label: \"%s %d\n",
current_function_name, XINT (tmp_rtx, 0), (*lang_hooks.decl_printable_name) (current_function_decl, 2),
XINT (tmp_rtx, 0),
GET_CODE (tmp_rtx) == NOTE ? "lightgrey" GET_CODE (tmp_rtx) == NOTE ? "lightgrey"
: GET_CODE (tmp_rtx) == INSN ? "green" : GET_CODE (tmp_rtx) == INSN ? "green"
: GET_CODE (tmp_rtx) == JUMP_INSN ? "darkgreen" : GET_CODE (tmp_rtx) == JUMP_INSN ? "darkgreen"
...@@ -178,8 +184,11 @@ draw_edge (FILE *fp, int from, int to, int bb_edge, int class) ...@@ -178,8 +184,11 @@ draw_edge (FILE *fp, int from, int to, int bb_edge, int class)
color = "color: green "; color = "color: green ";
fprintf (fp, fprintf (fp,
"edge: { sourcename: \"%s.%d\" targetname: \"%s.%d\" %s", "edge: { sourcename: \"%s.%d\" targetname: \"%s.%d\" %s",
current_function_name, from, (*lang_hooks.decl_printable_name) (current_function_decl, 2),
current_function_name, to, color); from,
(*lang_hooks.decl_printable_name) (current_function_decl, 2),
to,
color);
if (class) if (class)
fprintf (fp, "class: %d ", class); fprintf (fp, "class: %d ", class);
fputs ("}\n", fp); fputs ("}\n", fp);
...@@ -209,7 +218,7 @@ end_fct (FILE *fp) ...@@ -209,7 +218,7 @@ end_fct (FILE *fp)
{ {
case vcg: case vcg:
fprintf (fp, "node: { title: \"%s.999999\" label: \"END\" }\n}\n", fprintf (fp, "node: { title: \"%s.999999\" label: \"END\" }\n}\n",
current_function_name); (*lang_hooks.decl_printable_name) (current_function_decl, 2));
break; break;
case no_graph: case no_graph:
break; break;
......
...@@ -84,9 +84,6 @@ static int cond_exec_changed_p; ...@@ -84,9 +84,6 @@ static int cond_exec_changed_p;
/* True if life data ok at present. */ /* True if life data ok at present. */
static bool life_data_ok; static bool life_data_ok;
/* The post-dominator relation on the original block numbers. */
static dominance_info post_dominators;
/* Forward references. */ /* Forward references. */
static int count_bb_insns (basic_block); static int count_bb_insns (basic_block);
static rtx first_active_insn (basic_block); static rtx first_active_insn (basic_block);
...@@ -123,6 +120,7 @@ mark_loop_exit_edges (void) ...@@ -123,6 +120,7 @@ mark_loop_exit_edges (void)
edge e; edge e;
flow_loops_find (&loops, LOOP_TREE); flow_loops_find (&loops, LOOP_TREE);
free_dominance_info (CDI_DOMINATORS);
if (loops.num > 1) if (loops.num > 1)
{ {
...@@ -2105,8 +2103,8 @@ merge_if_block (struct ce_if_block * ce_info) ...@@ -2105,8 +2103,8 @@ merge_if_block (struct ce_if_block * ce_info)
{ {
bb = fallthru; bb = fallthru;
fallthru = block_fallthru (bb); fallthru = block_fallthru (bb);
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, bb); delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
merge_blocks (combo_bb, bb); merge_blocks (combo_bb, bb);
num_true_changes++; num_true_changes++;
} }
...@@ -2122,8 +2120,8 @@ merge_if_block (struct ce_if_block * ce_info) ...@@ -2122,8 +2120,8 @@ merge_if_block (struct ce_if_block * ce_info)
if (combo_bb->global_live_at_end) if (combo_bb->global_live_at_end)
COPY_REG_SET (combo_bb->global_live_at_end, COPY_REG_SET (combo_bb->global_live_at_end,
then_bb->global_live_at_end); then_bb->global_live_at_end);
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, then_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, then_bb);
merge_blocks (combo_bb, then_bb); merge_blocks (combo_bb, then_bb);
num_true_changes++; num_true_changes++;
} }
...@@ -2133,8 +2131,8 @@ merge_if_block (struct ce_if_block * ce_info) ...@@ -2133,8 +2131,8 @@ merge_if_block (struct ce_if_block * ce_info)
get their addresses taken. */ get their addresses taken. */
if (else_bb) if (else_bb)
{ {
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, else_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, else_bb);
merge_blocks (combo_bb, else_bb); merge_blocks (combo_bb, else_bb);
num_true_changes++; num_true_changes++;
} }
...@@ -2190,8 +2188,8 @@ merge_if_block (struct ce_if_block * ce_info) ...@@ -2190,8 +2188,8 @@ merge_if_block (struct ce_if_block * ce_info)
COPY_REG_SET (combo_bb->global_live_at_end, COPY_REG_SET (combo_bb->global_live_at_end,
join_bb->global_live_at_end); join_bb->global_live_at_end);
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, join_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, join_bb);
merge_blocks (combo_bb, join_bb); merge_blocks (combo_bb, join_bb);
num_true_changes++; num_true_changes++;
} }
...@@ -2271,7 +2269,7 @@ find_if_header (basic_block test_bb, int pass) ...@@ -2271,7 +2269,7 @@ find_if_header (basic_block test_bb, int pass)
&& find_cond_trap (test_bb, then_edge, else_edge)) && find_cond_trap (test_bb, then_edge, else_edge))
goto success; goto success;
if (post_dominators if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY
&& (! HAVE_conditional_execution || reload_completed)) && (! HAVE_conditional_execution || reload_completed))
{ {
if (find_if_case_1 (test_bb, then_edge, else_edge)) if (find_if_case_1 (test_bb, then_edge, else_edge))
...@@ -2646,8 +2644,8 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -2646,8 +2644,8 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
remove_edge (trap_bb == then_bb ? then_edge : else_edge); remove_edge (trap_bb == then_bb ? then_edge : else_edge);
if (trap_bb->pred == NULL) if (trap_bb->pred == NULL)
{ {
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, trap_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, trap_bb);
delete_block (trap_bb); delete_block (trap_bb);
} }
...@@ -2831,8 +2829,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -2831,8 +2829,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
new_bb = redirect_edge_and_branch_force (FALLTHRU_EDGE (test_bb), else_bb); new_bb = redirect_edge_and_branch_force (FALLTHRU_EDGE (test_bb), else_bb);
then_bb_index = then_bb->index; then_bb_index = then_bb->index;
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, then_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, then_bb);
delete_block (then_bb); delete_block (then_bb);
/* Make rest of code believe that the newly created block is the THEN_BB /* Make rest of code believe that the newly created block is the THEN_BB
...@@ -2841,8 +2839,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -2841,8 +2839,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
{ {
new_bb->index = then_bb_index; new_bb->index = then_bb_index;
BASIC_BLOCK (then_bb_index) = new_bb; BASIC_BLOCK (then_bb_index) = new_bb;
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
add_to_dominance_info (post_dominators, new_bb); add_to_dominance_info (CDI_POST_DOMINATORS, new_bb);
} }
/* We've possibly created jump to next insn, cleanup_cfg will solve that /* We've possibly created jump to next insn, cleanup_cfg will solve that
later. */ later. */
...@@ -2884,7 +2882,7 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -2884,7 +2882,7 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2)
; ;
else if (else_succ->dest->index < 0 else if (else_succ->dest->index < 0
|| dominated_by_p (post_dominators, then_bb, || dominated_by_p (CDI_POST_DOMINATORS, then_bb,
else_succ->dest)) else_succ->dest))
; ;
else else
...@@ -2911,8 +2909,8 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) ...@@ -2911,8 +2909,8 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
then_bb->global_live_at_start, then_bb->global_live_at_start,
else_bb->global_live_at_end, BITMAP_IOR); else_bb->global_live_at_end, BITMAP_IOR);
if (post_dominators) if (dom_computed[CDI_POST_DOMINATORS] >= DOM_NO_FAST_QUERY)
delete_from_dominance_info (post_dominators, else_bb); delete_from_dominance_info (CDI_POST_DOMINATORS, else_bb);
delete_block (else_bb); delete_block (else_bb);
num_true_changes++; num_true_changes++;
...@@ -3217,11 +3215,9 @@ if_convert (int x_life_data_ok) ...@@ -3217,11 +3215,9 @@ if_convert (int x_life_data_ok)
free_basic_block_vars (1); free_basic_block_vars (1);
/* Compute postdominators if we think we'll use them. */ /* Compute postdominators if we think we'll use them. */
post_dominators = NULL;
if (HAVE_conditional_execution || life_data_ok) if (HAVE_conditional_execution || life_data_ok)
{ calculate_dominance_info (CDI_POST_DOMINATORS);
post_dominators = calculate_dominance_info (CDI_POST_DOMINATORS);
}
if (life_data_ok) if (life_data_ok)
clear_bb_flags (); clear_bb_flags ();
...@@ -3258,8 +3254,7 @@ if_convert (int x_life_data_ok) ...@@ -3258,8 +3254,7 @@ if_convert (int x_life_data_ok)
fprintf (rtl_dump_file, "\n\n========== no more changes\n"); fprintf (rtl_dump_file, "\n\n========== no more changes\n");
#endif #endif
if (post_dominators) free_dominance_info (CDI_POST_DOMINATORS);
free_dominance_info (post_dominators);
if (rtl_dump_file) if (rtl_dump_file)
fflush (rtl_dump_file); fflush (rtl_dump_file);
......
...@@ -53,7 +53,9 @@ loop_optimizer_init (FILE *dumpfile) ...@@ -53,7 +53,9 @@ loop_optimizer_init (FILE *dumpfile)
/* No loops. */ /* No loops. */
flow_loops_free (loops); flow_loops_free (loops);
free_dominance_info (CDI_DOMINATORS);
free (loops); free (loops);
/* Make chain. */ /* Make chain. */
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
if (bb->next_bb != EXIT_BLOCK_PTR) if (bb->next_bb != EXIT_BLOCK_PTR)
...@@ -81,7 +83,7 @@ loop_optimizer_init (FILE *dumpfile) ...@@ -81,7 +83,7 @@ loop_optimizer_init (FILE *dumpfile)
flow_loops_dump (loops, dumpfile, NULL, 1); flow_loops_dump (loops, dumpfile, NULL, 1);
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
verify_dominators (loops->cfg.dom); verify_dominators (CDI_DOMINATORS);
verify_loop_structure (loops); verify_loop_structure (loops);
#endif #endif
...@@ -105,6 +107,7 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile) ...@@ -105,6 +107,7 @@ loop_optimizer_finalize (struct loops *loops, FILE *dumpfile)
/* Clean up. */ /* Clean up. */
flow_loops_free (loops); flow_loops_free (loops);
free_dominance_info (CDI_DOMINATORS);
free (loops); free (loops);
/* Finalize changes. */ /* Finalize changes. */
......
...@@ -81,7 +81,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -81,7 +81,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
static struct loop *unswitch_loop (struct loops *, struct loop *, static struct loop *unswitch_loop (struct loops *, struct loop *,
basic_block); basic_block);
static void unswitch_single_loop (struct loops *, struct loop *, rtx, int); static void unswitch_single_loop (struct loops *, struct loop *, rtx, int);
static bool may_unswitch_on_p (struct loops *, basic_block, struct loop *, static bool may_unswitch_on_p (basic_block, struct loop *,
basic_block *); basic_block *);
static rtx reversed_condition (rtx); static rtx reversed_condition (rtx);
...@@ -107,7 +107,7 @@ unswitch_loops (struct loops *loops) ...@@ -107,7 +107,7 @@ unswitch_loops (struct loops *loops)
unswitch_single_loop (loops, loop, NULL_RTX, 0); unswitch_single_loop (loops, loop, NULL_RTX, 0);
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
verify_dominators (loops->cfg.dom); verify_dominators (CDI_DOMINATORS);
verify_loop_structure (loops); verify_loop_structure (loops);
#endif #endif
} }
...@@ -117,8 +117,7 @@ unswitch_loops (struct loops *loops) ...@@ -117,8 +117,7 @@ unswitch_loops (struct loops *loops)
basic blocks (for what it means see comments below). List of basic blocks basic blocks (for what it means see comments below). List of basic blocks
inside LOOP is provided in BODY to save time. */ inside LOOP is provided in BODY to save time. */
static bool static bool
may_unswitch_on_p (struct loops *loops, basic_block bb, struct loop *loop, may_unswitch_on_p (basic_block bb, struct loop *loop, basic_block *body)
basic_block *body)
{ {
rtx test; rtx test;
unsigned i; unsigned i;
...@@ -136,7 +135,7 @@ may_unswitch_on_p (struct loops *loops, basic_block bb, struct loop *loop, ...@@ -136,7 +135,7 @@ may_unswitch_on_p (struct loops *loops, basic_block bb, struct loop *loop,
/* It must be executed just once each iteration (because otherwise we /* It must be executed just once each iteration (because otherwise we
are unable to update dominator/irreducible loop information correctly). */ are unable to update dominator/irreducible loop information correctly). */
if (!just_once_each_iteration_p (loops, loop, bb)) if (!just_once_each_iteration_p (loop, bb))
return false; return false;
/* Condition must be invariant. We use just a stupid test of invariantness /* Condition must be invariant. We use just a stupid test of invariantness
...@@ -239,7 +238,7 @@ unswitch_single_loop (struct loops *loops, struct loop *loop, ...@@ -239,7 +238,7 @@ unswitch_single_loop (struct loops *loops, struct loop *loop,
/* Find a bb to unswitch on. */ /* Find a bb to unswitch on. */
bbs = get_loop_body (loop); bbs = get_loop_body (loop);
for (i = 0; i < loop->num_nodes; i++) for (i = 0; i < loop->num_nodes; i++)
if (may_unswitch_on_p (loops, bbs[i], loop, bbs)) if (may_unswitch_on_p (bbs[i], loop, bbs))
break; break;
if (i == loop->num_nodes) if (i == loop->num_nodes)
...@@ -295,7 +294,7 @@ unswitch_single_loop (struct loops *loops, struct loop *loop, ...@@ -295,7 +294,7 @@ unswitch_single_loop (struct loops *loops, struct loop *loop,
rconds = cond_checked; rconds = cond_checked;
/* Separate condition in a single basic block. */ /* Separate condition in a single basic block. */
bb = split_loop_bb (loops, bbs[i], PREV_INSN (split_before))->dest; bb = split_loop_bb (bbs[i], PREV_INSN (split_before))->dest;
free (bbs); free (bbs);
true_first = !(bb->succ->flags & EDGE_FALLTHRU); true_first = !(bb->succ->flags & EDGE_FALLTHRU);
if (rtl_dump_file) if (rtl_dump_file)
...@@ -335,7 +334,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on) ...@@ -335,7 +334,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on)
if (!unswitch_on->succ || !unswitch_on->succ->succ_next || if (!unswitch_on->succ || !unswitch_on->succ->succ_next ||
unswitch_on->succ->succ_next->succ_next) unswitch_on->succ->succ_next->succ_next)
abort (); abort ();
if (!just_once_each_iteration_p (loops, loop, unswitch_on)) if (!just_once_each_iteration_p (loop, unswitch_on))
abort (); abort ();
if (loop->inner) if (loop->inner)
abort (); abort ();
...@@ -382,7 +381,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on) ...@@ -382,7 +381,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on)
switch_bb->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP; switch_bb->succ->flags &= ~EDGE_IRREDUCIBLE_LOOP;
switch_bb->succ->succ_next->flags &= ~EDGE_IRREDUCIBLE_LOOP; switch_bb->succ->succ_next->flags &= ~EDGE_IRREDUCIBLE_LOOP;
} }
add_to_dominance_info (loops->cfg.dom, switch_bb); add_to_dominance_info (CDI_DOMINATORS, switch_bb);
unswitch_on->rbi->copy = unswitch_on_alt; unswitch_on->rbi->copy = unswitch_on_alt;
/* Loopify from the copy of LOOP body, constructing the new loop. */ /* Loopify from the copy of LOOP body, constructing the new loop. */
...@@ -403,8 +402,8 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on) ...@@ -403,8 +402,8 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on)
fix_loop_placement (nloop); fix_loop_placement (nloop);
/* Preserve the simple loop preheaders. */ /* Preserve the simple loop preheaders. */
loop_split_edge_with (loop_preheader_edge (loop), NULL_RTX, loops); loop_split_edge_with (loop_preheader_edge (loop), NULL_RTX);
loop_split_edge_with (loop_preheader_edge (nloop), NULL_RTX, loops); loop_split_edge_with (loop_preheader_edge (nloop), NULL_RTX);
return nloop; return nloop;
} }
...@@ -72,10 +72,8 @@ static void estimate_loops_at_level (struct loop *loop); ...@@ -72,10 +72,8 @@ static void estimate_loops_at_level (struct loop *loop);
static void propagate_freq (struct loop *); static void propagate_freq (struct loop *);
static void estimate_bb_frequencies (struct loops *); static void estimate_bb_frequencies (struct loops *);
static void counts_to_freqs (void); static void counts_to_freqs (void);
static void process_note_predictions (basic_block, int *, dominance_info, static void process_note_predictions (basic_block, int *);
dominance_info); static void process_note_prediction (basic_block, int *, int, int);
static void process_note_prediction (basic_block, int *, dominance_info,
dominance_info, int, int);
static bool last_basic_block_p (basic_block); static bool last_basic_block_p (basic_block);
static void compute_function_frequency (void); static void compute_function_frequency (void);
static void choose_function_section (void); static void choose_function_section (void);
...@@ -393,13 +391,12 @@ combine_predictions_for_insn (rtx insn, basic_block bb) ...@@ -393,13 +391,12 @@ combine_predictions_for_insn (rtx insn, basic_block bb)
void void
estimate_probability (struct loops *loops_info) estimate_probability (struct loops *loops_info)
{ {
dominance_info dominators, post_dominators;
basic_block bb; basic_block bb;
unsigned i; unsigned i;
connect_infinite_loops_to_exit (); connect_infinite_loops_to_exit ();
dominators = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
post_dominators = calculate_dominance_info (CDI_POST_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS);
/* Try to predict out blocks in a loop that are not part of a /* Try to predict out blocks in a loop that are not part of a
natural loop. */ natural loop. */
...@@ -412,11 +409,10 @@ estimate_probability (struct loops *loops_info) ...@@ -412,11 +409,10 @@ estimate_probability (struct loops *loops_info)
struct loop_desc desc; struct loop_desc desc;
unsigned HOST_WIDE_INT niter; unsigned HOST_WIDE_INT niter;
flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES); flow_loop_scan (loop, LOOP_EXIT_EDGES);
exits = loop->num_exits; exits = loop->num_exits;
if (simple_loop_p (loops_info, loop, &desc) if (simple_loop_p (loop, &desc) && desc.const_iter)
&& desc.const_iter)
{ {
int prob; int prob;
niter = desc.niter + 1; niter = desc.niter + 1;
...@@ -500,8 +496,8 @@ estimate_probability (struct loops *loops_info) ...@@ -500,8 +496,8 @@ estimate_probability (struct loops *loops_info)
/* Look for block we are guarding (ie we dominate it, /* Look for block we are guarding (ie we dominate it,
but it doesn't postdominate us). */ but it doesn't postdominate us). */
if (e->dest != EXIT_BLOCK_PTR && e->dest != bb if (e->dest != EXIT_BLOCK_PTR && e->dest != bb
&& dominated_by_p (dominators, e->dest, e->src) && dominated_by_p (CDI_DOMINATORS, e->dest, e->src)
&& !dominated_by_p (post_dominators, e->src, e->dest)) && !dominated_by_p (CDI_POST_DOMINATORS, e->src, e->dest))
{ {
rtx insn; rtx insn;
...@@ -618,8 +614,7 @@ estimate_probability (struct loops *loops_info) ...@@ -618,8 +614,7 @@ estimate_probability (struct loops *loops_info)
&& bb->succ->succ_next != NULL) && bb->succ->succ_next != NULL)
combine_predictions_for_insn (BB_END (bb), bb); combine_predictions_for_insn (BB_END (bb), bb);
free_dominance_info (post_dominators); free_dominance_info (CDI_POST_DOMINATORS);
free_dominance_info (dominators);
remove_fake_edges (); remove_fake_edges ();
estimate_bb_frequencies (loops_info); estimate_bb_frequencies (loops_info);
...@@ -719,10 +714,7 @@ last_basic_block_p (basic_block bb) ...@@ -719,10 +714,7 @@ last_basic_block_p (basic_block bb)
on demand, so -1 may be there in case this was not needed yet). */ on demand, so -1 may be there in case this was not needed yet). */
static void static void
process_note_prediction (basic_block bb, int *heads, process_note_prediction (basic_block bb, int *heads, int pred, int flags)
dominance_info dominators,
dominance_info post_dominators, int pred,
int flags)
{ {
edge e; edge e;
int y; int y;
...@@ -736,18 +728,18 @@ process_note_prediction (basic_block bb, int *heads, ...@@ -736,18 +728,18 @@ process_note_prediction (basic_block bb, int *heads,
find first dominator that we do not post-dominate (we are find first dominator that we do not post-dominate (we are
using already known members of heads array). */ using already known members of heads array). */
basic_block ai = bb; basic_block ai = bb;
basic_block next_ai = get_immediate_dominator (dominators, bb); basic_block next_ai = get_immediate_dominator (CDI_DOMINATORS, bb);
int head; int head;
while (heads[next_ai->index] < 0) while (heads[next_ai->index] < 0)
{ {
if (!dominated_by_p (post_dominators, next_ai, bb)) if (!dominated_by_p (CDI_POST_DOMINATORS, next_ai, bb))
break; break;
heads[next_ai->index] = ai->index; heads[next_ai->index] = ai->index;
ai = next_ai; ai = next_ai;
next_ai = get_immediate_dominator (dominators, next_ai); next_ai = get_immediate_dominator (CDI_DOMINATORS, next_ai);
} }
if (!dominated_by_p (post_dominators, next_ai, bb)) if (!dominated_by_p (CDI_POST_DOMINATORS, next_ai, bb))
head = next_ai->index; head = next_ai->index;
else else
head = heads[next_ai->index]; head = heads[next_ai->index];
...@@ -769,7 +761,7 @@ process_note_prediction (basic_block bb, int *heads, ...@@ -769,7 +761,7 @@ process_note_prediction (basic_block bb, int *heads,
return; return;
for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next) for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
if (e->dest->index >= 0 if (e->dest->index >= 0
&& dominated_by_p (post_dominators, e->dest, bb)) && dominated_by_p (CDI_POST_DOMINATORS, e->dest, bb))
predict_edge_def (e, pred, taken); predict_edge_def (e, pred, taken);
} }
...@@ -778,9 +770,7 @@ process_note_prediction (basic_block bb, int *heads, ...@@ -778,9 +770,7 @@ process_note_prediction (basic_block bb, int *heads,
process_note_prediction. */ process_note_prediction. */
static void static void
process_note_predictions (basic_block bb, int *heads, process_note_predictions (basic_block bb, int *heads)
dominance_info dominators,
dominance_info post_dominators)
{ {
rtx insn; rtx insn;
edge e; edge e;
...@@ -813,8 +803,6 @@ process_note_predictions (basic_block bb, int *heads, ...@@ -813,8 +803,6 @@ process_note_predictions (basic_block bb, int *heads,
/* Process single prediction note. */ /* Process single prediction note. */
process_note_prediction (bb, process_note_prediction (bb,
heads, heads,
dominators,
post_dominators,
alg, (int) NOTE_PREDICTION_FLAGS (insn)); alg, (int) NOTE_PREDICTION_FLAGS (insn));
delete_insn (insn); delete_insn (insn);
} }
...@@ -827,10 +815,7 @@ process_note_predictions (basic_block bb, int *heads, ...@@ -827,10 +815,7 @@ process_note_predictions (basic_block bb, int *heads,
/* This block ended from other reasons than because of return. /* This block ended from other reasons than because of return.
If it is because of noreturn call, this should certainly not If it is because of noreturn call, this should certainly not
be taken. Otherwise it is probably some error recovery. */ be taken. Otherwise it is probably some error recovery. */
process_note_prediction (bb, process_note_prediction (bb, heads, PRED_NORETURN, NOT_TAKEN);
heads,
dominators,
post_dominators, PRED_NORETURN, NOT_TAKEN);
} }
} }
...@@ -841,15 +826,14 @@ void ...@@ -841,15 +826,14 @@ void
note_prediction_to_br_prob (void) note_prediction_to_br_prob (void)
{ {
basic_block bb; basic_block bb;
dominance_info post_dominators, dominators;
int *heads; int *heads;
/* To enable handling of noreturn blocks. */ /* To enable handling of noreturn blocks. */
add_noreturn_fake_exit_edges (); add_noreturn_fake_exit_edges ();
connect_infinite_loops_to_exit (); connect_infinite_loops_to_exit ();
post_dominators = calculate_dominance_info (CDI_POST_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS);
dominators = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
heads = xmalloc (sizeof (int) * last_basic_block); heads = xmalloc (sizeof (int) * last_basic_block);
memset (heads, -1, sizeof (int) * last_basic_block); memset (heads, -1, sizeof (int) * last_basic_block);
...@@ -858,10 +842,10 @@ note_prediction_to_br_prob (void) ...@@ -858,10 +842,10 @@ note_prediction_to_br_prob (void)
/* Process all prediction notes. */ /* Process all prediction notes. */
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
process_note_predictions (bb, heads, dominators, post_dominators); process_note_predictions (bb, heads);
free_dominance_info (post_dominators); free_dominance_info (CDI_POST_DOMINATORS);
free_dominance_info (dominators); free_dominance_info (CDI_DOMINATORS);
free (heads); free (heads);
remove_fake_edges (); remove_fake_edges ();
......
...@@ -155,7 +155,7 @@ static int *containing_rgn; ...@@ -155,7 +155,7 @@ static int *containing_rgn;
void debug_regions (void); void debug_regions (void);
static void find_single_block_region (void); static void find_single_block_region (void);
static void find_rgns (struct edge_list *, dominance_info); static void find_rgns (struct edge_list *);
static int too_large (int, int *, int *); static int too_large (int, int *, int *);
extern void debug_live (int, int); extern void debug_live (int, int);
...@@ -613,7 +613,7 @@ too_large (int block, int *num_bbs, int *num_insns) ...@@ -613,7 +613,7 @@ too_large (int block, int *num_bbs, int *num_insns)
of edge tables. That would simplify it somewhat. */ of edge tables. That would simplify it somewhat. */
static void static void
find_rgns (struct edge_list *edge_list, dominance_info dom) find_rgns (struct edge_list *edge_list)
{ {
int *max_hdr, *dfs_nr, *stack, *degree; int *max_hdr, *dfs_nr, *stack, *degree;
char no_loops = 1; char no_loops = 1;
...@@ -827,7 +827,7 @@ find_rgns (struct edge_list *edge_list, dominance_info dom) ...@@ -827,7 +827,7 @@ find_rgns (struct edge_list *edge_list, dominance_info dom)
{ {
/* Now verify that the block is dominated by the loop /* Now verify that the block is dominated by the loop
header. */ header. */
if (!dominated_by_p (dom, jbb, bb)) if (!dominated_by_p (CDI_DOMINATORS, jbb, bb))
break; break;
} }
} }
...@@ -2597,7 +2597,6 @@ init_regions (void) ...@@ -2597,7 +2597,6 @@ init_regions (void)
} }
else else
{ {
dominance_info dom;
struct edge_list *edge_list; struct edge_list *edge_list;
/* The scheduler runs after estimate_probabilities; therefore, we /* The scheduler runs after estimate_probabilities; therefore, we
...@@ -2607,7 +2606,7 @@ init_regions (void) ...@@ -2607,7 +2606,7 @@ init_regions (void)
edge_list = create_edge_list (); edge_list = create_edge_list ();
/* Compute the dominators and post dominators. */ /* Compute the dominators and post dominators. */
dom = calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
/* build_control_flow will return nonzero if it detects unreachable /* build_control_flow will return nonzero if it detects unreachable
blocks or any other irregularity with the cfg which prevents blocks or any other irregularity with the cfg which prevents
...@@ -2615,7 +2614,7 @@ init_regions (void) ...@@ -2615,7 +2614,7 @@ init_regions (void)
if (build_control_flow (edge_list) != 0) if (build_control_flow (edge_list) != 0)
find_single_block_region (); find_single_block_region ();
else else
find_rgns (edge_list, dom); find_rgns (edge_list);
if (sched_verbose >= 3) if (sched_verbose >= 3)
debug_regions (); debug_regions ();
...@@ -2625,7 +2624,7 @@ init_regions (void) ...@@ -2625,7 +2624,7 @@ init_regions (void)
/* For now. This will move as more and more of haifa is converted /* For now. This will move as more and more of haifa is converted
to using the cfg code in flow.c. */ to using the cfg code in flow.c. */
free_dominance_info (dom); free_dominance_info (CDI_DOMINATORS);
} }
} }
......
...@@ -2477,6 +2477,7 @@ rest_of_handle_branch_prob (tree decl, rtx insns) ...@@ -2477,6 +2477,7 @@ rest_of_handle_branch_prob (tree decl, rtx insns)
estimate_probability (&loops); estimate_probability (&loops);
flow_loops_free (&loops); flow_loops_free (&loops);
free_dominance_info (CDI_DOMINATORS);
close_dump_file (DFI_bp, print_rtl_with_bb, insns); close_dump_file (DFI_bp, print_rtl_with_bb, insns);
timevar_pop (TV_BRANCH_PROB); timevar_pop (TV_BRANCH_PROB);
} }
...@@ -3014,8 +3015,9 @@ rest_of_handle_loop_optimize (tree decl, rtx insns) ...@@ -3014,8 +3015,9 @@ rest_of_handle_loop_optimize (tree decl, rtx insns)
sooner, but we want the profile feedback to work more sooner, but we want the profile feedback to work more
efficiently. */ efficiently. */
static void static void
rest_of_handle_loop2 (tree decl, rtx insns) rest_of_handle_loop2 (tree decl ATTRIBUTE_UNUSED, rtx insns ATTRIBUTE_UNUSED)
{ {
#if 0
struct loops *loops; struct loops *loops;
timevar_push (TV_LOOP); timevar_push (TV_LOOP);
open_dump_file (DFI_loop2, decl); open_dump_file (DFI_loop2, decl);
...@@ -3047,6 +3049,7 @@ rest_of_handle_loop2 (tree decl, rtx insns) ...@@ -3047,6 +3049,7 @@ rest_of_handle_loop2 (tree decl, rtx insns)
close_dump_file (DFI_loop2, print_rtl_with_bb, get_insns ()); close_dump_file (DFI_loop2, print_rtl_with_bb, get_insns ());
timevar_pop (TV_LOOP); timevar_pop (TV_LOOP);
ggc_collect (); ggc_collect ();
#endif
} }
/* This is called from finish_function (within langhooks.parse_file) /* This is called from finish_function (within langhooks.parse_file)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment