X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessadestr.c;h=dc1180f158ce978a8a303379e87d52af04b0d703;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=4b2fef525cb7a2a5aaaac87cf2d901e75b99cd66;hpb=4ed766ac193746b7e38316f88bc16863a4d03af4;p=libfirm diff --git a/ir/be/bessadestr.c b/ir/be/bessadestr.c index 4b2fef525..dc1180f15 100644 --- a/ir/be/bessadestr.c +++ b/ir/be/bessadestr.c @@ -22,7 +22,6 @@ * @brief Performs SSA-Destruction. * @author Daniel Grund * @date 25.05.2005 - * @version $Id$ */ #include "config.h" @@ -66,7 +65,7 @@ static void clear_link(ir_node *irn, void *data) */ static void collect_phis_walker(ir_node *irn, void *data) { - be_chordal_env_t *env = data; + be_chordal_env_t *env = (be_chordal_env_t*)data; if (is_Phi(irn) && chordal_has_class(env, irn)) { ir_node *bl = get_nodes_block(irn); set_irn_link(irn, get_irn_link(bl)); @@ -89,8 +88,8 @@ typedef struct { static int cmp_perm_proj(const void *a, const void *b, size_t n) { - const perm_proj_t *p = a; - const perm_proj_t *q = b; + const perm_proj_t *p = (const perm_proj_t*)a; + const perm_proj_t *q = (const perm_proj_t*)b; (void) n; return !(p->arg == q->arg); @@ -106,7 +105,7 @@ typedef struct insert_all_perms_env_t { */ static void insert_all_perms_walker(ir_node *bl, void *data) { - insert_all_perms_env_t *env = data; + insert_all_perms_env_t *env = (insert_all_perms_env_t*)data; be_chordal_env_t *chordal_env = env->chordal_env; pmap *perm_map = env->perm_map; be_lv_t *lv = be_get_irg_liveness(chordal_env->irg); @@ -132,14 +131,15 @@ static void insert_all_perms_walker(ir_node *bl, void *data) * Note that all phis in the list are in the same * register class by construction. */ - for (phi = get_irn_link(bl); phi; phi = get_irn_link(phi)) { + for (phi = (ir_node*)get_irn_link(bl); phi != NULL; + phi = (ir_node*)get_irn_link(phi)) { ir_node *arg = get_irn_n(phi, i); unsigned hash; perm_proj_t templ; hash = hash_irn(arg); templ.arg = arg; - pp = set_find(arg_set, &templ, sizeof(templ), hash); + pp = (perm_proj_t*)set_find(arg_set, &templ, sizeof(templ), hash); /* * If a proj_perm_t entry has not been made in the argument set, @@ -161,13 +161,17 @@ static void insert_all_perms_walker(ir_node *bl, void *data) * above in the arg_set and insert it into the schedule. */ in = XMALLOCN(ir_node*, n_projs); - for (pp = set_first(arg_set); pp; pp = set_next(arg_set)) + foreach_set(arg_set, perm_proj_t*, pp) { in[pp->pos] = pp->arg; + } perm = be_new_Perm(chordal_env->cls, pred_bl, n_projs, in); be_stat_ev("phi_perm", n_projs); - insert_after = sched_skip(sched_last(pred_bl), 0, sched_skip_cf_predicator, NULL); + insert_after = pred_bl; + do { + insert_after = sched_prev(insert_after); + } while (is_cfop(insert_after)); sched_add_after(insert_after, perm); /* @@ -176,7 +180,7 @@ static void insert_all_perms_walker(ir_node *bl, void *data) * arguments to the projs (new phi arguments). */ insert_after = perm; - for (pp = set_first(arg_set); pp; pp = set_next(arg_set)) { + foreach_set(arg_set, perm_proj_t*, pp) { ir_node *proj = new_r_Proj(perm, get_irn_mode(pp->arg), pp->pos); pp->proj = proj; assert(arch_get_irn_register(pp->arg)); @@ -188,11 +192,12 @@ static void insert_all_perms_walker(ir_node *bl, void *data) /* * Set the phi nodes to their new arguments: The Projs of the Perm */ - for (phi = get_irn_link(bl); phi; phi = get_irn_link(phi)) { + for (phi = (ir_node*)get_irn_link(bl); phi != NULL; + phi = (ir_node*)get_irn_link(phi)) { perm_proj_t templ; templ.arg = get_irn_n(phi, i); - pp = set_find(arg_set, &templ, sizeof(templ), hash_irn(templ.arg)); + pp = (perm_proj_t*)set_find(arg_set, &templ, sizeof(templ), hash_irn(templ.arg)); /* If not found, it was an interfering argument */ if (pp) { @@ -225,17 +230,17 @@ static void insert_all_perms_walker(ir_node *bl, void *data) * Adjusts the register allocation for the (new) phi-operands * and insert duplicates iff necessary. */ -static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) +static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) { - be_chordal_env_t *chordal_env = data; + be_chordal_env_t *chordal_env = (be_chordal_env_t*)data; be_lv_t *lv = be_get_irg_liveness(chordal_env->irg); ir_node *phi; /* Consider all phis of this block */ - for (phi = get_irn_link(bl); phi; phi = get_irn_link(phi)) { + for (phi = (ir_node*)get_irn_link(bl); phi != NULL; + phi = (ir_node*)get_irn_link(phi)) { ir_node *phi_block = get_nodes_block(phi); const arch_register_t *phi_reg = arch_get_irn_register(phi); - const arch_register_class_t *cls = phi_reg->reg_class; int max; int i; @@ -264,6 +269,8 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) } if (be_values_interfere(lv, phi, arg)) { + ir_node *schedpoint; + /* Insert a duplicate in arguments block, make it the new phi arg, @@ -271,11 +278,15 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) insert it into schedule, pin it */ - ir_node *dupl = be_new_Copy(cls, arg_block, arg); + ir_node *dupl = be_new_Copy(arg_block, arg); set_irn_n(phi, i, dupl); arch_set_irn_register(dupl, phi_reg); - sched_add_after(sched_skip(sched_last(arg_block), 0, sched_skip_cf_predicator, NULL), dupl); + schedpoint = arg_block; + do { + schedpoint = sched_prev(schedpoint); + } while (is_cfop(schedpoint)); + sched_add_after(schedpoint, dupl); pin_irn(dupl, phi_block); be_liveness_introduce(lv, dupl); be_liveness_update(lv, arg); @@ -298,7 +309,9 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) DBG((dbg, LEVEL_1, " searching for phi with same arg having args register\n")); - for (other_phi = get_irn_link(phi_block); other_phi; other_phi = get_irn_link(other_phi)) { + for (other_phi = (ir_node*)get_irn_link(phi_block); + other_phi != NULL; + other_phi = (ir_node*)get_irn_link(other_phi)) { assert(is_Phi(other_phi) && get_nodes_block(phi) == get_nodes_block(other_phi) && @@ -321,7 +334,7 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) pin it */ ir_node *perm = get_Proj_pred(arg); - ir_node *dupl = be_new_Copy(cls, arg_block, arg); + ir_node *dupl = be_new_Copy(arg_block, arg); ir_node *ins; set_irn_n(phi, i, dupl); @@ -352,11 +365,10 @@ void be_ssa_destruction(be_chordal_env_t *chordal_env) insert_all_perms_env_t insert_perms_env; pmap *perm_map = pmap_create(); ir_graph *irg = chordal_env->irg; - be_lv_t *lv = be_assure_liveness(irg); FIRM_DBG_REGISTER(dbg, "ir.be.ssadestr"); - be_liveness_invalidate(lv); + be_invalidate_live_sets(irg); /* create a map for fast lookup of perms: block --> perm */ irg_walk_graph(irg, clear_link, collect_phis_walker, chordal_env); @@ -366,20 +378,16 @@ void be_ssa_destruction(be_chordal_env_t *chordal_env) insert_perms_env.perm_map = perm_map; irg_block_walk_graph(irg, insert_all_perms_walker, NULL, &insert_perms_env); - // Matze: really needed here? - // Sebastian: Yes. the walker function uses interference. - be_liveness_invalidate(lv); - if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR) dump_ir_graph(irg, "ssa_destr_perms_placed"); - be_liveness_assure_chk(lv); + be_assure_live_chk(irg); DBG((dbg, LEVEL_1, "Setting regs and placing dupls...\n")); irg_block_walk_graph(irg, set_regs_or_place_dupls_walker, NULL, chordal_env); - /* TODO: unfortunately updating doesn't work yet. */ - be_liveness_invalidate(lv); + /* unfortunately updating doesn't work yet. */ + be_invalidate_live_chk(irg); if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR) dump_ir_graph(irg, "ssa_destr_regs_set"); @@ -393,14 +401,15 @@ static void ssa_destruction_check_walker(ir_node *bl, void *data) int i, max; (void)data; - for (phi = get_irn_link(bl); phi; phi = get_irn_link(phi)) { + for (phi = (ir_node*)get_irn_link(bl); phi != NULL; + phi = (ir_node*)get_irn_link(phi)) { const arch_register_t *phi_reg, *arg_reg; phi_reg = arch_get_irn_register(phi); /* iterate over all args of phi */ for (i = 0, max = get_irn_arity(phi); i < max; ++i) { ir_node *arg = get_irn_n(phi, i); - const arch_register_req_t *req = arch_get_register_req_out(arg); + const arch_register_req_t *req = arch_get_irn_register_req(arg); if (req->type & arch_register_req_type_ignore) continue;