X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessaconstr.c;h=fd964c20dea3e9a1244b3ef8f75b0e1c968ff02b;hb=d4047948864818d91471e727bb973bd6f02f2ff7;hp=18d00c809603b78463eb4ea11da0f3cc1626c09c;hpb=c5da7537af71fee3204251dfbc9b3047eaf6d343;p=libfirm diff --git a/ir/be/bessaconstr.c b/ir/be/bessaconstr.c index 18d00c809..fd964c20d 100644 --- a/ir/be/bessaconstr.c +++ b/ir/be/bessaconstr.c @@ -46,16 +46,18 @@ * 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" -#include "besched_t.h" +#include "besched.h" #include "beintlive_t.h" -#include "beirg_t.h" +#include "beirg.h" #include "be_t.h" +#include "benode.h" #include "debug.h" #include "error.h" @@ -73,8 +75,8 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) * blocks as visited. Sets the link fields of the blocks in the dominance * frontier to the block itself. */ -static -void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env) +static void mark_iterated_dominance_frontiers( + const be_ssa_construction_env_t *env) { stat_ev_cnt_decl(blocks); DBG((dbg, LEVEL_3, "Dominance Frontier:")); @@ -105,25 +107,23 @@ void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env) DBG((dbg, LEVEL_3, "\n")); } -static -ir_node *search_def_end_of_block(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); -static -ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block, - ir_node *link_with) +static ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block, + ir_node *link_with) { int i, n_preds = get_Block_n_cfgpreds(block); - ir_graph *irg = get_irn_irg(block); - ir_node *phi; - ir_node **ins = alloca(n_preds * sizeof(ins[0])); + ir_graph *irg = get_Block_irg(block); + ir_node **ins = ALLOCAN(ir_node*, n_preds); + ir_node *phi; assert(n_preds > 1); for(i = 0; i < n_preds; ++i) { ins[i] = new_r_Unknown(irg, env->mode); } - phi = new_r_Phi(irg, block, n_preds, ins, env->mode); + phi = be_new_Phi(block, n_preds, ins, env->mode, env->phi_cls); if(env->new_phis != NULL) { ARR_APP1(ir_node*, env->new_phis, phi); } @@ -146,16 +146,15 @@ ir_node *create_phi(be_ssa_construction_env_t *env, ir_node *block, return phi; } -static -ir_node *get_def_at_idom(be_ssa_construction_env_t *env, ir_node *block) +static ir_node *get_def_at_idom(be_ssa_construction_env_t *env, ir_node *block) { ir_node *dom = get_Block_idom(block); assert(dom != NULL); return search_def_end_of_block(env, dom); } -static -ir_node *search_def_end_of_block(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)) { assert(get_irn_link(block) != NULL); @@ -170,8 +169,7 @@ ir_node *search_def_end_of_block(be_ssa_construction_env_t *env, ir_node *block) } } -static -ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) +static ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) { ir_node *block = get_nodes_block(at); ir_node *node; @@ -216,10 +214,9 @@ ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at) * sorted by dominance. A non-visited block means no definition has been * inserted yet. */ -static -void introduce_def_at_block(ir_node *block, ir_node *def) +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; @@ -241,7 +238,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); } } @@ -265,9 +261,8 @@ void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg) env->new_phis = NEW_ARR_F(ir_node*, 0); env->worklist = new_waitq(); - 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 */ @@ -283,9 +278,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"); @@ -299,7 +293,8 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env, assert(env->iterated_domfront_calculated == 0); if(env->mode == NULL) { - env->mode = get_irn_mode(copy); + env->mode = get_irn_mode(copy); + env->phi_cls = arch_get_irn_reg_class_out(copy); } else { assert(env->mode == get_irn_mode(copy)); } @@ -320,11 +315,12 @@ void be_ssa_construction_add_copies(be_ssa_construction_env_t *env, assert(env->iterated_domfront_calculated == 0); if(env->mode == NULL) { - env->mode = get_irn_mode(copies[0]); + 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) { - ir_node *copy = copies[i]; + ir_node *copy = copies[i]; ir_node *block = get_nodes_block(copy); assert(env->mode == get_irn_mode(copy)); @@ -349,9 +345,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); @@ -360,7 +356,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]; @@ -389,7 +384,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));