X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelower.c;h=7ea642952d09ba5bfebb6be8a49907cf68c0c14c;hb=04500cf2b3528e7d91685a4d41af7eb175950622;hp=1aae93a4256760293bdeb519036b5f6a3aeddc4c;hpb=ef1c86d10bb0a7c3284d81231d8e60473995e5f7;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index 1aae93a42..7ea642952 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -18,7 +18,7 @@ #include "besched.h" #include "irgmod.h" -#include "iredges.h" +#include "iredges_t.h" #include "irgwalk.h" #undef is_Perm @@ -49,6 +49,7 @@ typedef enum _perm_type_t { PERM_COPY } perm_type_t; +/* structure to represent cycles or chains in a perm */ typedef struct _perm_cycle_t { const arch_register_t **elems; /**< the registers in the cycle */ int n_elems; /**< number of elements in the cycle */ @@ -66,6 +67,7 @@ static int compare_reg_pair(const void *a, const void *b) { return -1; } +/* returns the number register pairs marked as checked */ static int get_n_checked_pairs(reg_pair_t *pairs, int n) { int i, n_checked = 0; @@ -205,7 +207,6 @@ static perm_cycle_t *get_perm_cycle(perm_cycle_t *cycle, reg_pair_t *pairs, int * @param walk_env The environment */ static void lower_perm_node(ir_node *irn, void *walk_env) { - const be_node_factory_t *fact; const arch_register_class_t *reg_class; const arch_env_t *arch_env; firm_dbg_module_t *mod; @@ -221,7 +222,6 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { if (is_Block(irn)) return; - fact = env->chord_env->main_env->node_factory; arch_env = env->chord_env->main_env->arch_env; do_copy = env->do_copy; mod = env->dbg_module; @@ -280,11 +280,10 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { set_Proj_proj(pairs[i].out_node, get_Proj_proj(pairs[i].in_node)); } - /* remove the proj from the schedule */ sched_remove(pairs[i].out_node); - /* exchange the proj with the argument */ + /* reroute the edges from the proj to the argument */ edges_reroute(pairs[i].out_node, pairs[i].in_node, env->chord_env->irg); pairs[i].checked = 1; @@ -313,7 +312,7 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { continue; } -//todo: - iff PERM_CYCLE && do_copy -> determine free temp reg and insert copy to/from it before/after +//TODO: - iff PERM_CYCLE && do_copy -> determine free temp reg and insert copy to/from it before/after // the copy cascade (this reduces the cycle into a chain) /* build copy/swap nodes from back to front */ @@ -341,7 +340,7 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { DBG((mod, LEVEL_1, "%+F (%+F, %s) and (%+F, %s)\n", irn, res1, cycle->elems[i]->name, res2, cycle->elems[i + 1]->name)); - cpyxchg = new_Perm(fact, reg_class, env->chord_env->irg, block, 2, in); + cpyxchg = be_new_Perm(reg_class, env->chord_env->irg, block, 2, in); sched_remove(res1); sched_remove(res2); @@ -361,7 +360,7 @@ static void lower_perm_node(ir_node *irn, void *walk_env) { DBG((mod, LEVEL_1, "%+F creating copy node (%+F, %s) -> (%+F, %s)\n", irn, arg1, cycle->elems[i]->name, res2, cycle->elems[i + 1]->name)); - cpyxchg = new_Copy(fact, reg_class, env->chord_env->irg, block, arg1); + cpyxchg = be_new_Copy(reg_class, env->chord_env->irg, block, arg1); arch_set_irn_register(arch_env, cpyxchg, cycle->elems[i + 1]); /* remove the proj from the schedule */