X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessaconstr.c;h=eaf3a51ef9b3acf56a31c07ae5ffffea5b2d1a41;hb=04906225f6fe1bc22f73b5d6a98eb9c0992a9b54;hp=257ea7238aaf1a010d6fb85f52d15610bf5fad99;hpb=b9e024a7134d3f7483b792027dbf7392b928b4da;p=libfirm diff --git a/ir/be/bessaconstr.c b/ir/be/bessaconstr.c index 257ea7238..eaf3a51ef 100644 --- a/ir/be/bessaconstr.c +++ b/ir/be/bessaconstr.c @@ -46,9 +46,10 @@ * This function reroutes all uses of the original value to the copies in the * corresponding dominance subtrees and creates Phi functions where necessary. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif + +/* statev in this file is extensive, so only enable if needed */ +#define DISABLE_STATEV #include "bessaconstr.h" #include "bemodule.h" @@ -68,14 +69,6 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) -/** - * Checks that low <= what < hi. - */ -static INLINE int is_inside(unsigned what, unsigned low, unsigned hi) -{ - return what - low < hi; -} - /** * Calculates the iterated dominance frontier of a set of blocks. Marks the * blocks as visited. Sets the link fields of the blocks in the dominance @@ -98,16 +91,6 @@ void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env) if (Block_block_visited(y)) continue; - /* - * It makes no sense to add phi-functions to blocks - * that are not dominated by any definition; - * all uses are dominated, hence the paths reaching the uses - * have to stay in the dominance subtrees of the given definitions. - */ - - if (!is_inside(get_Block_dom_tree_pre_num(y), env->min_dom, env->max_dom)) - continue; - if (!irn_visited(y)) { set_irn_link(y, NULL); waitq_put(env->worklist, y); @@ -229,16 +212,6 @@ ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) return get_def_at_idom(env, block); } -static -void update_domzone(be_ssa_construction_env_t *env, const ir_node *bl) -{ - int start = get_Block_dom_tree_pre_num(bl); - int end = get_Block_dom_max_subtree_pre_num(bl) + 1; - - env->min_dom = MIN(env->min_dom, start); - env->max_dom = MAX(env->max_dom, end); -} - /** * Adds a definition into the link field of the block. The definitions are * sorted by dominance. A non-visited block means no definition has been @@ -247,7 +220,7 @@ void update_domzone(be_ssa_construction_env_t *env, const ir_node *bl) static void introduce_def_at_block(ir_node *block, ir_node *def) { - if(irn_visited(block)) { + if (irn_visited_else_mark(block)) { ir_node *node = block; ir_node *current_def; @@ -269,7 +242,6 @@ void introduce_def_at_block(ir_node *block, ir_node *def) } else { set_irn_link(block, def); set_irn_link(def, NULL); - mark_irn_visited(block); } } @@ -292,12 +264,9 @@ void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg) env->domfronts = be_get_birg_dom_front(birg); env->new_phis = NEW_ARR_F(ir_node*, 0); env->worklist = new_waitq(); - env->min_dom = INT_MAX; - env->max_dom = 0; - set_using_irn_visited(irg); - set_using_block_visited(irg); - set_using_irn_link(irg); + ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED + | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK); /* we use the visited flag to indicate blocks in the dominance frontier * and blocks that already have the relevant value at the end calculated */ @@ -313,9 +282,8 @@ void be_ssa_construction_destroy(be_ssa_construction_env_t *env) del_waitq(env->worklist); DEL_ARR_F(env->new_phis); - clear_using_irn_visited(env->irg); - clear_using_block_visited(env->irg); - clear_using_irn_link(env->irg); + ir_free_resources(env->irg, IR_RESOURCE_IRN_VISITED + | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK); stat_ev_tim_pop("bessaconstr_total_time"); stat_ev_ctx_pop("bessaconstr"); @@ -340,7 +308,6 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env, waitq_put(env->worklist, block); } introduce_def_at_block(block, copy); - update_domzone(env, block); } void be_ssa_construction_add_copies(be_ssa_construction_env_t *env, @@ -363,7 +330,6 @@ void be_ssa_construction_add_copies(be_ssa_construction_env_t *env, waitq_put(env->worklist, block); } introduce_def_at_block(block, copy); - update_domzone(env, block); } } @@ -381,9 +347,9 @@ ir_node **be_ssa_construction_get_new_phis(be_ssa_construction_env_t *env) void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, ir_node **nodes, size_t nodes_len) { - stat_ev_cnt_decl(uses); const ir_edge_t *edge, *next; size_t i; + stat_ev_cnt_decl(uses); BE_TIMER_PUSH(t_ssa_constr); @@ -392,7 +358,6 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, env->iterated_domfront_calculated = 1; } - stat_ev_int("bessaconstr_domzone", env->max_dom - env->min_dom); stat_ev_tim_push(); for(i = 0; i < nodes_len; ++i) { ir_node *value = nodes[i]; @@ -421,7 +386,7 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, def = search_def(env, at); if(def == NULL) { - panic("no definition found for %+F at position %d\n", use, pos); + panic("no definition found for %+F at position %d", use, pos); } DBG((dbg, LEVEL_2, "\t%+F(%d) -> %+F\n", use, pos, def));