X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelower.c;h=344564cbefc822e894fcb1d6e317849c2d930d7a;hb=dbff21416969526aed95b103d3652cca3dcec08c;hp=3bb1119ab862739f688d20a4a11756c582e73d94;hpb=18814151f8c0ea17b2a7bf84c82ee3c2e66d6a6b;p=libfirm diff --git a/ir/be/belower.c b/ir/be/belower.c index 3bb1119ab..344564cbe 100644 --- a/ir/be/belower.c +++ b/ir/be/belower.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -52,7 +52,7 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg;) DEBUG_ONLY(static firm_dbg_module_t *dbg_constr;) DEBUG_ONLY(static firm_dbg_module_t *dbg_permmove;) -/** Associates an ir_node with it's copy and CopyKeep. */ +/** Associates an ir_node with its copy and CopyKeep. */ typedef struct { ir_nodeset_t copies; /**< all non-spillable copies of this irn */ const arch_register_class_t *cls; @@ -60,19 +60,19 @@ typedef struct { /** Environment for constraints. */ typedef struct { - be_irg_t *birg; + ir_graph *irg; ir_nodemap_t op_set; struct obstack obst; } constraint_env_t; /** Lowering walker environment. */ -typedef struct _lower_env_t { - be_irg_t *birg; - unsigned do_copy : 1; +typedef struct lower_env_t { + ir_graph *irg; + unsigned do_copy : 1; } lower_env_t; /** Holds a Perm register pair. */ -typedef struct _reg_pair_t { +typedef struct reg_pair_t { const arch_register_t *in_reg; /**< a perm IN register */ ir_node *in_node; /**< the in node to which the register belongs */ @@ -82,7 +82,7 @@ typedef struct _reg_pair_t { int checked; /**< indicates whether the pair was check for cycle or not */ } reg_pair_t; -typedef enum _perm_type_t { +typedef enum perm_type_t { PERM_CYCLE, PERM_CHAIN, PERM_SWAP, @@ -90,7 +90,7 @@ typedef enum _perm_type_t { } perm_type_t; /** Structure to represent cycles or chains in a Perm. */ -typedef struct _perm_cycle_t { +typedef struct perm_cycle_t { const arch_register_t **elems; /**< the registers in the cycle */ int n_elems; /**< number of elements in the cycle */ perm_type_t type; /**< type (CHAIN or CYCLE) */ @@ -502,7 +502,6 @@ static ir_node *find_copy(ir_node *irn, ir_node *op) static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, constraint_env_t *env) { - ir_graph *irg; ir_nodemap_t *op_set; ir_node *block; const arch_register_class_t *cls; @@ -515,7 +514,6 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, return; } - irg = be_get_birg_irg(env->birg); op_set = &env->op_set; block = get_nodes_block(irn); cls = arch_get_irn_reg_class_out(other_different); @@ -556,8 +554,8 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different, sched_add_before(skip_Proj(irn), cpy); sched_add_after(skip_Proj(irn), keep); - /* insert the other different and it's copies into the map */ - entry = ir_nodemap_get(op_set, other_different); + /* insert the other different and its copies into the map */ + entry = (op_copy_assoc_t*)ir_nodemap_get(op_set, other_different); if (! entry) { entry = OALLOC(&env->obst, op_copy_assoc_t); entry->cls = cls; @@ -624,6 +622,7 @@ static void assure_different_constraints(ir_node *irn, ir_node *skipped_irn, con static void assure_constraints_walker(ir_node *block, void *walk_env) { ir_node *irn; + constraint_env_t *env = (constraint_env_t*)walk_env; sched_foreach_reverse(block, irn) { ir_mode *mode = get_irn_mode(irn); @@ -636,10 +635,10 @@ static void assure_constraints_walker(ir_node *block, void *walk_env) mode = get_irn_mode(proj); if (mode_is_datab(mode)) - assure_different_constraints(proj, irn, walk_env); + assure_different_constraints(proj, irn, env); } } else if (mode_is_datab(mode)) { - assure_different_constraints(irn, irn, walk_env); + assure_different_constraints(irn, irn, env); } } } @@ -655,7 +654,7 @@ static void melt_copykeeps(constraint_env_t *cenv) /* for all */ foreach_ir_nodemap(&cenv->op_set, map_entry, map_iter) { - op_copy_assoc_t *entry = map_entry.data; + op_copy_assoc_t *entry = (op_copy_assoc_t*)map_entry.data; int idx, num_ck; ir_node *cp; struct obstack obst; @@ -765,21 +764,15 @@ static void melt_copykeeps(constraint_env_t *cenv) } } -/** - * Walks over all nodes to assure register constraints. - * - * @param birg The birg structure containing the irg - */ -void assure_constraints(be_irg_t *birg) +void assure_constraints(ir_graph *irg) { - ir_graph *irg = be_get_birg_irg(birg); constraint_env_t cenv; ir_nodemap_iterator_t map_iter; ir_nodemap_entry_t map_entry; FIRM_DBG_REGISTER(dbg_constr, "firm.be.lower.constr"); - cenv.birg = birg; + cenv.irg = irg; ir_nodemap_init(&cenv.op_set); obstack_init(&cenv.obst); @@ -792,8 +785,8 @@ void assure_constraints(be_irg_t *birg) /* for all */ foreach_ir_nodemap(&cenv.op_set, map_entry, map_iter) { - op_copy_assoc_t *entry = map_entry.data; - int n = ir_nodeset_size(&entry->copies); + op_copy_assoc_t *entry = (op_copy_assoc_t*)map_entry.data; + size_t n = ir_nodeset_size(&entry->copies); ir_node **nodes = ALLOCAN(ir_node*, n); ir_node *cp; ir_nodeset_iterator_t iter; @@ -811,7 +804,7 @@ void assure_constraints(be_irg_t *birg) DB((dbg_constr, LEVEL_1, "\n")); - /* introduce the copies for the operand and it's copies */ + /* introduce the copies for the operand and its copies */ be_ssa_construction_init(&senv, irg); be_ssa_construction_add_copy(&senv, map_entry.node); be_ssa_construction_add_copies(&senv, nodes, n); @@ -856,7 +849,7 @@ void assure_constraints(be_irg_t *birg) * @return 1, if there is something left to perm over. * 0, if removed the complete perm. */ -static int push_through_perm(ir_node *perm, lower_env_t *env) +static int push_through_perm(ir_node *perm) { ir_graph *irg = get_irn_irg(perm); ir_node *bl = get_nodes_block(perm); @@ -890,8 +883,9 @@ static int push_through_perm(ir_node *perm, lower_env_t *env) sched_foreach_reverse_from(sched_prev(perm), irn) { for (i = get_irn_arity(irn) - 1; i >= 0; --i) { ir_node *op = get_irn_n(irn, i); + be_lv_t *lv = be_get_irg_liveness(irg); if (arch_irn_consider_in_reg_alloc(cls, op) && - !be_values_interfere(env->birg->lv, op, one_proj)) { + !be_values_interfere(lv, op, one_proj)) { frontier = irn; goto found_front; } @@ -906,7 +900,7 @@ found_front: while (!sched_is_begin(node)) { const arch_register_req_t *req; int input = -1; - ir_node *proj; + ir_node *proj = NULL; /* search if node is a INPUT of Perm */ foreach_out_edge(perm, edge) { @@ -948,11 +942,7 @@ found_front: arch_set_irn_register(node, arch_get_irn_register(proj)); /* reroute all users of the proj to the moved node. */ - edges_reroute(proj, node, irg); - - /* and kill it */ - set_Proj_pred(proj, new_Bad()); - kill_node(proj); + exchange(proj, node); bitset_set(moved, input); n_moved++; @@ -1008,31 +998,22 @@ static void lower_nodes_after_ra_walker(ir_node *irn, void *walk_env) if (!be_is_Perm(irn)) return; - perm_stayed = push_through_perm(irn, walk_env); + perm_stayed = push_through_perm(irn); if (perm_stayed) - lower_perm_node(irn, walk_env); + lower_perm_node(irn, (lower_env_t*)walk_env); } -/** - * Walks over all blocks in an irg and performs lowering need to be - * done after register allocation (e.g. perm lowering). - * - * @param birg The birg object - * @param do_copy 1 == resolve cycles with a free reg if available - */ -void lower_nodes_after_ra(be_irg_t *birg, int do_copy) +void lower_nodes_after_ra(ir_graph *irg, int do_copy) { lower_env_t env; - ir_graph *irg; FIRM_DBG_REGISTER(dbg, "firm.be.lower"); FIRM_DBG_REGISTER(dbg_permmove, "firm.be.lower.permmove"); - env.birg = birg; + env.irg = irg; env.do_copy = do_copy; /* we will need interference */ - irg = be_get_birg_irg(birg); be_liveness_assure_chk(be_get_irg_liveness(irg)); irg_walk_graph(irg, NULL, lower_nodes_after_ra_walker, &env);