X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fgvn_pre.c;h=9be72d72fd2b7d9c1c3ec49840571acd26ad35e7;hb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;hp=e8123abfb380b1b744dbac964aae0d876a6e3ac4;hpb=01ddc5c06877693df7d5f286d43e433fedd87103;p=libfirm diff --git a/ir/opt/gvn_pre.c b/ir/opt/gvn_pre.c index e8123abfb..9be72d72f 100644 --- a/ir/opt/gvn_pre.c +++ b/ir/opt/gvn_pre.c @@ -83,7 +83,6 @@ typedef struct pre_env { char first_iter; /**< non-zero for first iteration */ } pre_env; -static pset *value_table; static ir_nodemap_t value_map; /** The debug module handle. */ @@ -117,14 +116,14 @@ static ir_node *add(ir_node *e, ir_node *v) { if (is_Proj(v)) { ir_node *pred = get_Proj_pred(v); - ir_node *v_pred = identify_remember(value_table, pred); + ir_node *v_pred = identify_remember(pred); if (v_pred != pred) { /* must create a new value here */ v = new_r_Proj(v_pred, get_irn_mode(v), get_Proj_proj(v)); } } - v = identify_remember(value_table, v); + v = identify_remember(v); ir_nodemap_insert(&value_map, e, v); return v; } /* add */ @@ -139,11 +138,11 @@ static ir_node *add(ir_node *e, ir_node *v) */ static ir_node *lookup(ir_node *e) { - ir_node *value = ir_nodemap_get(&value_map, e); + ir_node *value = (ir_node*)ir_nodemap_get(&value_map, e); if (value != NULL) - return identify_remember(value_table, value); + return identify_remember(value); return NULL; -} /* lookup */ +} /** * Return the block info of a block. @@ -152,8 +151,8 @@ static ir_node *lookup(ir_node *e) */ static block_info *get_block_info(ir_node *block) { - return get_irn_link(block); -} /* get_block_info */ + return (block_info*)get_irn_link(block); +} /** * Allocate a block info for a block. @@ -208,7 +207,7 @@ static int is_nice_value(ir_node *n) * @param txt a text to describe the set * @param block the owner block of the set */ -static void dump_value_set(ir_valueset_t *set, char *txt, ir_node *block) +static void dump_value_set(ir_valueset_t *set, const char *txt, ir_node *block) { ir_valueset_iterator_t iter; ir_node *value, *expr; @@ -233,12 +232,12 @@ static void dump_value_set(ir_valueset_t *set, char *txt, ir_node *block) #endif /* DEBUG_libfirm */ /** - * Topological walker. Allocates block info for every block and place nodes in topological - * order into the nodes set. + * Topological walker. Allocates block info for every block and place nodes in + * topological order into the nodes set. */ static void topo_walker(ir_node *irn, void *ctx) { - pre_env *env = ctx; + pre_env *env = (pre_env*)ctx; ir_node *block; block_info *info; ir_node *value; @@ -265,7 +264,7 @@ static void topo_walker(ir_node *irn, void *ctx) info = get_block_info(block); ir_valueset_insert(info->exp_gen, value, irn); -} /* topo_walker */ +} /** * Computes Avail_out(block): @@ -282,7 +281,7 @@ static void topo_walker(ir_node *irn, void *ctx) */ static void compute_avail_top_down(ir_node *block, void *ctx) { - pre_env *env = ctx; + pre_env *env = (pre_env*)ctx; block_info *dom_info; block_info *info = get_block_info(block); ir_node *dom_blk; @@ -308,7 +307,7 @@ static void compute_avail_top_down(ir_node *block, void *ctx) value_union(info->avail_out, info->exp_gen); dump_value_set(info->avail_out, "Avail_out", block); -} /* compute_avail_top_down */ +} /** * check if a node n is clean in block block. @@ -382,7 +381,7 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese ir_node *trans; leader = leader != NULL ? leader : pred; - trans = ir_valueset_lookup(translated, leader); + trans = (ir_node*)ir_valueset_lookup(translated, leader); if ((trans != NULL && trans != leader) || (is_Phi(leader) && get_nodes_block(leader) == block)) break; @@ -395,7 +394,7 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese nn = new_ir_node( get_irn_dbg_info(node), current_ir_graph, - NULL, + get_nodes_block(node), get_irn_op(node), get_irn_mode(node), arity, @@ -404,14 +403,13 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese node might depend on that. */ copy_node_attr(current_ir_graph, node, nn); - set_nodes_block(nn, get_nodes_block(node)); for (i = 0; i < arity; ++i) { ir_node *pred = get_irn_n(node, i); ir_node *leader = lookup(pred); ir_node *trans; leader = leader != NULL ? leader : pred; - trans = ir_valueset_lookup(translated, leader); + trans = (ir_node*)ir_valueset_lookup(translated, leader); if (trans == NULL) trans = leader; @@ -432,7 +430,7 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, ir_valuese */ static void compute_antic(ir_node *block, void *ctx) { - pre_env *env = ctx; + pre_env *env = (pre_env*)ctx; block_info *succ_info; block_info *info = get_block_info(block); ir_node *succ, *value, *expr; @@ -538,7 +536,7 @@ static void compute_antic(ir_node *block, void *ctx) */ static void insert_nodes(ir_node *block, void *ctx) { - pre_env *env = ctx; + pre_env *env = (pre_env*)ctx; ir_node *value, *expr, *idom, *first_s, *worklist; block_info *curr_info, *idom_info; int pos, arity = get_irn_arity(block); @@ -605,7 +603,7 @@ static void insert_nodes(ir_node *block, void *ctx) v_prime = value; pred_info = get_block_info(pred_blk); - e_dprime = ir_valueset_lookup(pred_info->avail_out, v_prime); + e_dprime = (ir_node*)ir_valueset_lookup(pred_info->avail_out, v_prime); if (e_dprime == NULL) { pred_info->avail = e_prime; @@ -641,7 +639,8 @@ static void insert_nodes(ir_node *block, void *ctx) /* ignore bad blocks. */ if (is_Bad(pred_blk)) { - in[pos] = new_Bad(); + ir_graph *irg = get_irn_irg(pred_blk); + in[pos] = new_r_Bad(irg); continue; } @@ -717,7 +716,7 @@ static void insert_nodes(ir_node *block, void *ctx) */ static void eliminate(ir_node *irn, void *ctx) { - pre_env *env = ctx; + pre_env *env = (pre_env*)ctx; if (!is_Block(irn)) { ir_node *block = get_nodes_block(irn); @@ -725,7 +724,7 @@ static void eliminate(ir_node *irn, void *ctx) ir_node *value = lookup(irn); if (value != NULL) { - ir_node *expr = ir_valueset_lookup(bl->avail_out, value); + ir_node *expr = (ir_node*)ir_valueset_lookup(bl->avail_out, value); if (expr != NULL && expr != irn) { elim_pair *p = OALLOC(env->obst, elim_pair); @@ -807,7 +806,7 @@ void do_gvn_pre(ir_graph *irg) /* edges will crash if enabled due to our allocate on other obstack trick */ edges_deactivate(irg); - value_table = new_identities(); + new_identities(irg); ir_nodemap_init(&value_map); obstack_init(&obst); @@ -817,10 +816,6 @@ void do_gvn_pre(ir_graph *irg) a_env.end_block = get_irg_end_block(irg); a_env.pairs = NULL; - /* Move Proj's into the same block as their args, - else we would assign the result to wrong blocks */ - normalize_proj_nodes(irg); - /* critical edges MUST be removed */ remove_critical_cf_edges(irg); @@ -891,10 +886,8 @@ void do_gvn_pre(ir_graph *irg) if (bl_info->new_set) ir_valueset_del(bl_info->new_set); } - del_identities(value_table); ir_nodemap_destroy(&value_map); obstack_free(&obst, NULL); - value_table = NULL; /* pin the graph again: This is needed due to the use of set_opt_global_cse(1) */ set_irg_pinned(irg, op_pin_state_pinned);