X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessaconstr.c;h=45a7c10d993b5c6d17a2c5d1e8cec26827cdfd8d;hb=5346758a7b02ed44d65cdd26cd49221fbaf2dd45;hp=ebe4f7fc6287f8070e2ca5af3d3619c5f966210d;hpb=0c2e168b002336b6273decb11d5e632594a5c13c;p=libfirm diff --git a/ir/be/bessaconstr.c b/ir/be/bessaconstr.c index ebe4f7fc6..45a7c10d9 100644 --- a/ir/be/bessaconstr.c +++ b/ir/be/bessaconstr.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -29,11 +29,11 @@ * to their closest copy while introducing phis as necessary. * * Algorithm: Mark all blocks in the iterated dominance frontiers of the value - * and it's copies. Link the copies ordered by dominance to the blocks. The - * we search for each use all all definitions in the current block, if none is + * and it's copies. Link the copies ordered by dominance to the blocks. Then + * we search for each use all definitions in the current block, if none is * found, then we search one in the immediate dominator. If we are in a block - * of the dominance frontier, create a phi and search do the same search for - * the phi arguments. + * of the dominance frontier, create a phi and do the same search for all + * phi arguments. * * A copy in this context means, that you want to introduce several new * abstract values (in Firm: nodes) for which you know, that they @@ -55,6 +55,7 @@ #include "besched_t.h" #include "beintlive_t.h" #include "beirg_t.h" +#include "be_t.h" #include "debug.h" #include "error.h" @@ -67,11 +68,6 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) -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 @@ -83,7 +79,7 @@ void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env) stat_ev_cnt_decl(blocks); DBG((dbg, LEVEL_3, "Dominance Frontier:")); stat_ev_tim_push(); - while (!pdeq_empty(env->worklist)) { + while (!waitq_empty(env->worklist)) { int i; ir_node *block = waitq_get(env->worklist); ir_node **domfront = be_get_dominance_frontier(env->domfronts, block); @@ -94,16 +90,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); @@ -225,16 +211,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 @@ -288,10 +264,8 @@ 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_visited(irg); + set_using_irn_visited(irg); set_using_block_visited(irg); set_using_irn_link(irg); @@ -309,7 +283,7 @@ void be_ssa_construction_destroy(be_ssa_construction_env_t *env) del_waitq(env->worklist); DEL_ARR_F(env->new_phis); - clear_using_visited(env->irg); + clear_using_irn_visited(env->irg); clear_using_block_visited(env->irg); clear_using_irn_link(env->irg); @@ -336,7 +310,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, @@ -359,7 +332,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,12 +353,13 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, const ir_edge_t *edge, *next; size_t i; + BE_TIMER_PUSH(t_ssa_constr); + if(!env->iterated_domfront_calculated) { mark_iterated_dominance_frontiers(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]; @@ -423,6 +396,8 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, stat_ev_cnt_inc(uses); } } + BE_TIMER_POP(t_ssa_constr); + stat_ev_tim_pop("bessaconstr_fix_time"); stat_ev_cnt_done(uses, "bessaconstr_uses"); } @@ -438,11 +413,15 @@ void be_ssa_construction_update_liveness_phis(be_ssa_construction_env_t *env, { int i, n; + BE_TIMER_PUSH(t_ssa_constr); + n = ARR_LEN(env->new_phis); for(i = 0; i < n; ++i) { ir_node *phi = env->new_phis[i]; be_liveness_introduce(lv, phi); } + + BE_TIMER_POP(t_ssa_constr); } void be_init_ssaconstr(void)