X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fopt%2Fopt_ldst.c;h=aba92eec2ca3cb313a9a3d3c2719a24b658fd8e4;hb=ef3f4288a57fc536e74087390be6d0f33771511d;hp=cf901f9e594541ecf455bef1188773476da540b6;hpb=d2fed46d6b13be9698818d78a5704521885a1bab;p=libfirm diff --git a/ir/opt/opt_ldst.c b/ir/opt/opt_ldst.c index cf901f9e5..aba92eec2 100644 --- a/ir/opt/opt_ldst.c +++ b/ir/opt/opt_ldst.c @@ -42,6 +42,7 @@ #include "raw_bitset.h" #include "debug.h" #include "error.h" +#include "irpass.h" /* maximum number of output Proj's */ #define MAX_PROJ (pn_Load_max > pn_Store_max ? pn_Load_max : pn_Store_max) @@ -196,8 +197,13 @@ static void dump_curr(block_t *bl, const char *s) { } /* dump_curr */ #else -#define dump_block_list() -#define dump_curr(bl, s) +static void dump_block_list(ldst_env *env) { + (void) env; +} +static void dump_curr(block_t *bl, const char *s) { + (void) bl; + (void) s; +} #endif /* DEBUG_libfirm */ /** Get the block entry for a block node */ @@ -300,7 +306,7 @@ restart: if (entry == NULL) { /* new address */ - entry = obstack_alloc(&env.obst, sizeof(*entry)); + entry = OALLOC(&env.obst, address_entry); entry->id = env.curr_adr_id++; ir_nodemap_insert(&env.adr_map, adr, entry); @@ -336,7 +342,7 @@ static void prepare_blocks(ir_node *irn, void *ctx) { (void)ctx; if (is_Block(irn)) { - block_t *entry = obstack_alloc(&env.obst, sizeof(*entry)); + block_t *entry = OALLOC(&env.obst, block_t); int n; entry->memop_forward = NULL; @@ -445,7 +451,7 @@ static void collect_backward(ir_node *block, void *ctx) { * @return the allocated memop */ static memop_t *alloc_memop(ir_node *irn) { - memop_t *m = obstack_alloc(&env.obst, sizeof(*m)); + memop_t *m = OALLOC(&env.obst, memop_t); m->value.address = NULL; m->value.value = NULL; @@ -471,7 +477,7 @@ static memop_t *alloc_memop(ir_node *irn) { * @param phi the Phi-node representing the new value */ static memop_t *clone_memop_phi(memop_t *op, ir_node *phi) { - memop_t *m = obstack_alloc(&env.obst, sizeof(*m)); + memop_t *m = OALLOC(&env.obst, memop_t); m->value = op->value; m->value.value = phi; @@ -1035,7 +1041,7 @@ static void update_Load_memop(memop_t *m) { env.changed = 1; } if (m->projs[pn_Load_X_regular]) { - exchange(m->projs[pn_Load_X_regular], new_r_Jmp(current_ir_graph, get_nodes_block(load))); + exchange(m->projs[pn_Load_X_regular], new_r_Jmp(get_nodes_block(load))); m->projs[pn_Load_X_regular] = NULL; env.changed = 1; } @@ -1161,7 +1167,7 @@ static void update_Call_memop(memop_t *m) { case pn_Call_X_except: m->flags |= FLAG_EXCEPTION; break; - case pn_Call_M_regular: + case pn_Call_M: m->mem = proj; break; } @@ -1188,7 +1194,7 @@ static void update_DivOp_memop(memop_t *m) { case pn_Generic_X_except: m->flags |= FLAG_EXCEPTION; break; - case pn_Generic_M_regular: + case pn_Generic_M: m->mem = proj; break; } @@ -1405,7 +1411,7 @@ static ir_node *conv_to(ir_node *irn, ir_mode *mode) { /* different modes: check if conversion is possible without changing the bits */ if (can_convert_to(other, mode)) { ir_node *block = get_nodes_block(irn); - return new_r_Conv(current_ir_graph, block, irn, mode); + return new_r_Conv(block, irn, mode); } /* otherwise not possible ... yet */ return NULL; @@ -1560,9 +1566,7 @@ static int backward_antic(block_t *bl) { if (bl->trans_results == NULL) { /* allocate the translate cache */ - unsigned size = env.curr_adr_id * sizeof(bl->trans_results[0]); - bl->trans_results = obstack_alloc(&env.obst, size); - memset(bl->trans_results, 0, size); + bl->trans_results = OALLOCNZ(&env.obst, memop_t*, env.curr_adr_id); } /* check for partly redundant values */ @@ -1607,7 +1611,7 @@ static int backward_antic(block_t *bl) { block_t *succ_bl = get_block_entry(succ); int i; - rbitset_cpy(env.curr_set, succ_bl->anticL_in, env.rbs_size); + rbitset_copy(env.curr_set, succ_bl->anticL_in, env.rbs_size); memcpy(env.curr_id_2_memop, succ_bl->id_2_memop_antic, env.rbs_size * sizeof(env.curr_id_2_memop[0])); /* Hmm: probably we want kill merges of Loads ans Stores here */ @@ -1653,7 +1657,7 @@ static int backward_antic(block_t *bl) { memcpy(bl->id_2_memop_antic, env.curr_id_2_memop, env.rbs_size * sizeof(env.curr_id_2_memop[0])); if (! rbitset_equal(bl->anticL_in, env.curr_set, env.rbs_size)) { /* changed */ - rbitset_cpy(bl->anticL_in, env.curr_set, env.rbs_size); + rbitset_copy(bl->anticL_in, env.curr_set, env.rbs_size); dump_curr(bl, "AnticL_in*"); return 1; } @@ -1694,7 +1698,7 @@ static void replace_load(memop_t *op) { /* a hidden cast */ dbg_info *db = get_irn_dbg_info(load); ir_node *block = get_nodes_block(proj); - def = new_rd_Conv(db, current_ir_graph, block, def, mode); + def = new_rd_Conv(db, block, def, mode); } exchange(proj, def); } @@ -1704,7 +1708,7 @@ static void replace_load(memop_t *op) { } proj = op->projs[pn_Load_X_regular]; if (proj != NULL) { - exchange(proj, new_r_Jmp(current_ir_graph, get_nodes_block(load))); + exchange(proj, new_r_Jmp(get_nodes_block(load))); } } /* replace_load */ @@ -1729,7 +1733,7 @@ static void remove_store(memop_t *op) { } proj = op->projs[pn_Store_X_regular]; if (proj != NULL) { - exchange(proj, new_r_Jmp(current_ir_graph, get_nodes_block(store))); + exchange(proj, new_r_Jmp(get_nodes_block(store))); } } /* remove_store */ @@ -1932,7 +1936,7 @@ static int insert_Load(block_t *bl) { block_t *pred_bl = get_block_entry(pred); int need_phi = 0; memop_t *first = NULL; - ir_mode *mode; + ir_mode *mode = NULL; for (i = 0; i < n; ++i) { memop_t *mop; @@ -1963,7 +1967,7 @@ static int insert_Load(block_t *bl) { } if (need_phi) { /* build a Phi */ - ir_node *phi = new_r_Phi(current_ir_graph, bl->block, n, ins, mode); + ir_node *phi = new_r_Phi(bl->block, n, ins, mode); memop_t *phiop = alloc_memop(phi); phiop->value = first->value; @@ -1982,7 +1986,7 @@ static int insert_Load(block_t *bl) { ir_node *pred = get_Block_cfgpred_block(bl->block, 0); block_t *pred_bl = get_block_entry(pred); - rbitset_cpy(env.curr_set, pred_bl->avail_out, env.rbs_size); + rbitset_copy(env.curr_set, pred_bl->avail_out, env.rbs_size); memcpy(env.curr_id_2_memop, pred_bl->id_2_memop_avail, env.rbs_size * sizeof(bl->id_2_memop_avail[0])); } @@ -2064,12 +2068,12 @@ static int insert_Load(block_t *bl) { assert(last_mem != NULL); adr = phi_translate(op->value.address, block, i); - load = new_rd_Load(db, current_ir_graph, pred, last_mem, adr, mode, cons_none); - def = new_r_Proj(current_ir_graph, pred, load, mode, pn_Load_res); + load = new_rd_Load(db, pred, last_mem, adr, mode, cons_none); + def = new_r_Proj(pred, load, mode, pn_Load_res); DB((dbg, LEVEL_1, "Created new %+F in %+F for party redundant %+F\n", load, pred, op->node)); new_op = alloc_memop(load); - new_op->mem = new_r_Proj(current_ir_graph, pred, load, mode_M, pn_Load_M); + new_op->mem = new_r_Proj(pred, load, mode_M, pn_Load_M); new_op->value.address = adr; new_op->value.id = op->value.id; new_op->value.mode = mode; @@ -2103,7 +2107,7 @@ static int insert_Load(block_t *bl) { } in[i] = conv_to(pred_bl->avail->value.value, mode); } - phi = new_r_Phi(current_ir_graph, block, n, in, mode); + phi = new_r_Phi(block, n, in, mode); DB((dbg, LEVEL_1, "Created new %+F in %+F for now redundant %+F\n", phi, block, op->node)); phi_op = clone_memop_phi(op, phi); @@ -2120,7 +2124,7 @@ static int insert_Load(block_t *bl) { if (!rbitset_equal(bl->avail_out, env.curr_set, env.rbs_size)) { /* the avail set has changed */ - rbitset_cpy(bl->avail_out, env.curr_set, env.rbs_size); + rbitset_copy(bl->avail_out, env.curr_set, env.rbs_size); dump_curr(bl, "Avail_out*"); return 1; } @@ -2367,6 +2371,7 @@ int opt_ldst(ir_graph *irg) { } // dump_block_list(&env); + (void) dump_block_list; calcAvail(); calcAntic(); @@ -2399,3 +2404,8 @@ end: current_ir_graph = rem; return env.changed != 0; } /* opt_ldst */ + +ir_graph_pass_t *opt_ldst_pass(const char *name) +{ + return def_graph_pass_ret(name ? name : "ldst_df", opt_ldst); +} /* opt_ldst_pass */