X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeirgmod.c;h=a2b2c1f6e9b9f80834b33502565e8465ba656c56;hb=8535fe8732b0acf822be252812a7158ce5b8134a;hp=db686fb4727f75317d1a0195c21fccba4107ad4a;hpb=eaef4d4c3f2de6be097fef861180be6b3cd290ca;p=libfirm diff --git a/ir/be/beirgmod.c b/ir/be/beirgmod.c index db686fb47..a2b2c1f6e 100644 --- a/ir/be/beirgmod.c +++ b/ir/be/beirgmod.c @@ -13,7 +13,7 @@ * CVS-Id: $Id$ */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif #include @@ -54,8 +54,8 @@ #include "beirgmod.h" -#define DBG_MODULE "firm.be.irgmod" #define DBG_LEVEL SET_LEVEL_0 +DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) /* ____ _ @@ -172,7 +172,6 @@ static void determine_phi_blocks(pset *copies, pset *copy_blocks, pset *phi_bloc { ir_node *bl; waitq *worklist = new_waitq(); - FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE); /* * Fill the worklist queue and the rest of the orig blocks array. @@ -253,7 +252,6 @@ static ir_node *search_def(ir_node *usage, int pos, pset *copies, pset *copy_blo { ir_node *curr_bl; ir_node *start_irn; - FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE); curr_bl = get_nodes_block(usage); @@ -364,8 +362,6 @@ static void fix_usages(pset *copies, pset *copy_blocks, pset *phi_blocks, pset * int pos; } *outs; - FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE); - obstack_init(&obst); /* @@ -376,9 +372,11 @@ static void fix_usages(pset *copies, pset *copy_blocks, pset *phi_blocks, pset * for (irn = pset_first(copies); irn; irn = pset_next(copies)) { const ir_edge_t *edge; foreach_out_edge(irn, edge) { - if (!pset_find_ptr(ignore_uses, get_edge_src_irn(edge))) { + ir_node *src = get_edge_src_irn(edge); + /* ignore all users from ignore_uses or keep-alives (user is End node) */ + if (! pset_find_ptr(ignore_uses, src) && ! is_End(src)) { struct out tmp; - tmp.irn = get_edge_src_irn(edge); + tmp.irn = src; tmp.pos = get_edge_src_pos(edge); obstack_grow(&obst, &tmp, sizeof(tmp)); n_outs++; @@ -452,7 +450,7 @@ static void remove_odd_phis(pset *copies, pset *unused_copies) sched_remove(irn); } } -#endif +#endif /* if 0 */ void be_ssa_constr_phis_ignore(be_dom_front_info_t *info, be_lv_t *lv, int n, ir_node *nodes[], pset *phis, pset *ignore_uses) { @@ -484,7 +482,6 @@ void be_ssa_constr_set_phis_ignore(be_dom_front_info_t *df, be_lv_t *lv, pset *n int save_optimize = get_optimize(); int save_normalize = get_opt_normalize(); int phis_set_created = 0; - FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, DBG_MODULE); ir_node *irn; @@ -577,7 +574,6 @@ ir_node *insert_Perm_after(const arch_env_t *arch_env, ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos); ir_graph *irg = get_irn_irg(bl); pset *live = pset_new_ptr_default(); - FIRM_DBG_REGISTER(firm_dbg_module_t *dbg, "be.node"); ir_node *curr, *irn, *perm, **nodes; int i, n; @@ -721,63 +717,9 @@ int be_remove_empty_blocks(ir_graph *irg) { return changed; } -typedef struct _be_dead_out_env_t { - ir_graph *irg; - bitset_t *reachable; - DEBUG_ONLY(firm_dbg_module_t *dbg); -} be_dead_out_env_t; - -/** - * Check if @p node has dead users, i.e. they are reachable only via outedges from @p node. - * Set all ins of those users to BAD. - */ -static void kill_dead_out(ir_node *node, be_dead_out_env_t *env) { - ir_graph *irg = env->irg; - const ir_edge_t *edge, *tmp_edge; - - if (irn_visited(node)) - return; - mark_irn_visited(node); - - /* check all out edges */ - foreach_out_edge_safe(node, edge, tmp_edge) { - ir_node *src = get_edge_src_irn(edge); - - if (! bitset_is_set(env->reachable, get_irn_idx(src))) { - /* BEWARE: do not kill anchors or TLS */ - if (src != get_irg_globals(irg) && src != get_irg_tls(irg)) { - DBG((env->dbg, LEVEL_1, "killing %+F, only reachable from %+F\n", src, node)); - be_kill_node(src); - } - continue; - } - - /* descent */ - if (! is_Block(src)) { - kill_dead_out(src, env); - } - } -} - -static void set_reachable(ir_node *node, void *data) { - bitset_t *reachable = data; - bitset_set(reachable, get_irn_idx(node)); +void be_init_irgmod(void) +{ + FIRM_DBG_REGISTER(dbg, "firm.be.irgmod"); } -/** - * Set input of all nodes only reachable via out edges to BAD. - */ -void be_kill_dead_nodes(ir_graph *irg) { - be_dead_out_env_t env; - - env.irg = irg; - env.reachable = bitset_alloca(get_irg_last_idx(irg)); - FIRM_DBG_REGISTER(env.dbg, "firm.be.killdead"); - - /* collect all reachable nodes */ - irg_walk_in_or_dep_graph(irg, set_reachable, NULL, env.reachable); - - /* this is a forward walk (start -> end) */ - inc_irg_visited(irg); - kill_dead_out(get_irg_start(irg), &env); -} +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_irgmod);