X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessaconstr.c;h=031493b6b247ff32ab1c982050164d407a65a17b;hb=0318dc1a48ce72b311592c28affc31fabc95f026;hp=96d110432ce4864ac452ffd40380df4cab3eda1c;hpb=b921571012bb3044bc7319057cbe73163842bb3c;p=libfirm diff --git a/ir/be/bessaconstr.c b/ir/be/bessaconstr.c index 96d110432..031493b6b 100644 --- a/ir/be/bessaconstr.c +++ b/ir/be/bessaconstr.c @@ -29,7 +29,7 @@ * 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. Then + * and its 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 do the same search for all @@ -83,7 +83,7 @@ static void mark_iterated_dominance_frontiers( stat_ev_tim_push(); while (!waitq_empty(env->worklist)) { int i; - ir_node *block = waitq_get(env->worklist); + ir_node *block = (ir_node*)waitq_get(env->worklist); ir_node **domfront = be_get_dominance_frontier(env->domfronts, block); int domfront_len = ARR_LEN(domfront); @@ -116,27 +116,26 @@ static ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block, int i, n_preds = get_Block_n_cfgpreds(block); ir_graph *irg = get_Block_irg(block); ir_node **ins = ALLOCAN(ir_node*, n_preds); + ir_node *dummy; ir_node *phi; assert(n_preds > 1); - for(i = 0; i < n_preds; ++i) { - ins[i] = new_r_Unknown(irg, env->mode); + dummy = new_r_Dummy(irg, env->mode); + for (i = 0; i < n_preds; ++i) { + ins[i] = dummy; } phi = be_new_Phi(block, n_preds, ins, env->mode, env->phi_cls); - if(env->new_phis != NULL) { + sched_add_after(block, phi); + if (env->new_phis != NULL) { ARR_APP1(ir_node*, env->new_phis, phi); } - if(env->mode != mode_M) { - sched_add_after(block, phi); - } - DBG((dbg, LEVEL_2, "\tcreating phi %+F in %+F\n", phi, block)); set_irn_link(link_with, phi); mark_irn_visited(block); - for(i = 0; i < n_preds; ++i) { + for (i = 0; i < n_preds; ++i) { ir_node *pred_block = get_Block_cfgpred_block(block, i); ir_node *pred_def = search_def_end_of_block(env, pred_block); @@ -156,10 +155,10 @@ static ir_node *get_def_at_idom(be_ssa_construction_env_t *env, ir_node *block) static ir_node *search_def_end_of_block(be_ssa_construction_env_t *env, ir_node *block) { - if(irn_visited(block)) { + if (irn_visited(block)) { assert(get_irn_link(block) != NULL); - return get_irn_link(block); - } else if(Block_block_visited(block)) { + return (ir_node*)get_irn_link(block); + } else if (Block_block_visited(block)) { return create_phi(env, block, block); } else { ir_node *def = get_def_at_idom(env, block); @@ -178,7 +177,7 @@ static ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) DBG((dbg, LEVEL_3, "\t...searching def at %+F\n", at)); /* no defs in the current block we can do the normal searching */ - if(!irn_visited(block) && !Block_block_visited(block)) { + if (!irn_visited(block) && !Block_block_visited(block)) { DBG((dbg, LEVEL_3, "\t...continue at idom\n")); return get_def_at_idom(env, block); } @@ -187,19 +186,19 @@ static ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) the one immediately dominating us */ node = block; - def = get_irn_link(node); - while(def != NULL) { - if(!value_dominates(at, def)) { + def = (ir_node*)get_irn_link(node); + while (def != NULL) { + if (!value_dominates(at, def)) { DBG((dbg, LEVEL_3, "\t...found dominating def %+F\n", def)); return def; } node = def; - def = get_irn_link(node); + def = (ir_node*)get_irn_link(node); } /* block in dominance frontier? create a phi then */ - if(Block_block_visited(block)) { + if (Block_block_visited(block)) { DBG((dbg, LEVEL_3, "\t...create phi at block %+F\n", block)); assert(!is_Phi(node)); return create_phi(env, block, node); @@ -220,15 +219,15 @@ static void introduce_def_at_block(ir_node *block, ir_node *def) ir_node *node = block; ir_node *current_def; - while(1) { - current_def = get_irn_link(node); - if(current_def == def) { + for (;;) { + current_def = (ir_node*)get_irn_link(node); + if (current_def == def) { /* already in block */ return; } - if(current_def == NULL) + if (current_def == NULL) break; - if(value_dominates(current_def, def)) + if (value_dominates(current_def, def)) break; node = current_def; } @@ -241,9 +240,8 @@ static void introduce_def_at_block(ir_node *block, ir_node *def) } } -void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg) +void be_ssa_construction_init(be_ssa_construction_env_t *env, ir_graph *irg) { - ir_graph *irg = be_get_birg_irg(birg); ir_node *sb = get_irg_start_block(irg); int n_blocks = get_Block_dom_max_subtree_pre_num(sb); @@ -254,10 +252,10 @@ void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg) stat_ev_dbl("bessaconstr_n_blocks", n_blocks); memset(env, 0, sizeof(env[0])); - be_assure_dom_front(birg); + be_assure_dom_front(irg); env->irg = irg; - env->domfronts = be_get_birg_dom_front(birg); + env->domfronts = be_get_irg_dom_front(irg); env->new_phis = NEW_ARR_F(ir_node*, 0); env->worklist = new_waitq(); @@ -292,7 +290,7 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env, assert(env->iterated_domfront_calculated == 0); - if(env->mode == NULL) { + if (env->mode == NULL) { env->mode = get_irn_mode(copy); env->phi_cls = arch_get_irn_reg_class_out(copy); } else { @@ -301,7 +299,7 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env, block = get_nodes_block(copy); - if(!irn_visited(block)) { + if (!irn_visited(block)) { waitq_put(env->worklist, block); } introduce_def_at_block(block, copy); @@ -314,17 +312,17 @@ void be_ssa_construction_add_copies(be_ssa_construction_env_t *env, assert(env->iterated_domfront_calculated == 0); - if(env->mode == NULL) { + if (env->mode == NULL) { env->mode = get_irn_mode(copies[0]); env->phi_cls = arch_get_irn_reg_class_out(copies[0]); } - for(i = 0; i < copies_len; ++i) { + for (i = 0; i < copies_len; ++i) { ir_node *copy = copies[i]; ir_node *block = get_nodes_block(copy); assert(env->mode == get_irn_mode(copy)); - if(!irn_visited(block)) { + if (!irn_visited(block)) { waitq_put(env->worklist, block); } introduce_def_at_block(block, copy); @@ -349,15 +347,15 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, size_t i; stat_ev_cnt_decl(uses); - BE_TIMER_PUSH(t_ssa_constr); + be_timer_push(T_SSA_CONSTR); - if(!env->iterated_domfront_calculated) { + if (!env->iterated_domfront_calculated) { mark_iterated_dominance_frontiers(env); env->iterated_domfront_calculated = 1; } stat_ev_tim_push(); - for(i = 0; i < nodes_len; ++i) { + for (i = 0; i < nodes_len; ++i) { ir_node *value = nodes[i]; /* @@ -369,13 +367,13 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, int pos = get_edge_src_pos(edge); ir_node *def; - if(env->ignore_uses != NULL && + if (env->ignore_uses != NULL && ir_nodeset_contains(env->ignore_uses, use)) continue; - if(is_Anchor(use) || is_End(use)) + if (is_Anchor(use) || is_End(use)) continue; - if(is_Phi(use)) { + if (is_Phi(use)) { ir_node *block = get_nodes_block(use); ir_node *predblock = get_Block_cfgpred_block(block, pos); at = sched_last(predblock); @@ -383,7 +381,7 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, def = search_def(env, at); - if(def == NULL) { + if (def == NULL) { panic("no definition found for %+F at position %d", use, pos); } @@ -392,7 +390,7 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env, stat_ev_cnt_inc(uses); } } - BE_TIMER_POP(t_ssa_constr); + be_timer_pop(T_SSA_CONSTR); stat_ev_tim_pop("bessaconstr_fix_time"); stat_ev_cnt_done(uses, "bessaconstr_uses"); @@ -409,20 +407,19 @@ void be_ssa_construction_update_liveness_phis(be_ssa_construction_env_t *env, { int i, n; - BE_TIMER_PUSH(t_ssa_constr); + be_timer_push(T_SSA_CONSTR); n = ARR_LEN(env->new_phis); - for(i = 0; i < n; ++i) { + for (i = 0; i < n; ++i) { ir_node *phi = env->new_phis[i]; be_liveness_introduce(lv, phi); } - BE_TIMER_POP(t_ssa_constr); + be_timer_pop(T_SSA_CONSTR); } +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ssaconstr); void be_init_ssaconstr(void) { FIRM_DBG_REGISTER(dbg, "firm.be.ssaconstr"); } - -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_ssaconstr);