X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fgvn_pre.c;h=87b072521187e734c23c2f1424871395ffa4e98f;hb=c7dc950ac0cdd7d24acffb798b5867d0db5dd7c8;hp=f116405d98a8404d473409d8a5fa073c85d0623f;hpb=b519dd6a1e6d85e843eff533be787d1f138a07ff;p=libfirm diff --git a/ir/opt/gvn_pre.c b/ir/opt/gvn_pre.c index f116405d9..87b072521 100644 --- a/ir/opt/gvn_pre.c +++ b/ir/opt/gvn_pre.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -380,7 +380,7 @@ static int need_copy(ir_node *node, ir_node *block) /* Phi always stop the recursion */ if (is_Phi(node)) - return get_nodes_block(node) == block; + return get_irn_intra_n(node, -1) == block; if (! is_nice_value(node)) return 0; @@ -409,7 +409,7 @@ static ir_node *translate(ir_node *node, ir_node *block, int pos, pre_env *env) /* Phi always stop the recursion */ if (is_Phi(node)) { - if (get_nodes_block(node) == block) + if (get_irn_intra_n(node, -1) == block) return get_Phi_pred(node, pos); return node; } @@ -424,7 +424,7 @@ static ir_node *translate(ir_node *node, ir_node *block, int pos, pre_env *env) need_new = 0; do { ir_node *pred = get_irn_intra_n(node, i); - ir_node *pred_blk = get_nodes_block(pred); + ir_node *pred_blk = get_irn_intra_n(pred, -1); ir_node *leader = value_lookup(get_block_info(pred_blk)->avail_out, pred); in[i] = translate(leader ? leader : pred, block, pos, env); need_new |= (in[i] != pred); @@ -446,10 +446,12 @@ static ir_node *translate(ir_node *node, ir_node *block, int pos, pre_env *env) node might depend on that. */ copy_node_attr(node, nn); res = node_add(env->trans_set, nn); - if (nn != res) + if (nn != res) { obstack_free(env->obst, nn); - else + } else { DB((dbg, LEVEL_2, "--> Translate %+F in <%+F,%d> into %+F\n", node, block, pos, res)); + } + return res; } return node; @@ -489,7 +491,7 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, pre_env *e struct obstack *old; if (is_Phi(node)) { - if (get_nodes_block(node) == block) + if (get_irn_intra_n(node, -1) == block) return get_Phi_pred(node, pos); return node; } @@ -499,11 +501,11 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, pre_env *e /* check if the node has at least one Phi predecessor */ for (i = 0; i < arity; ++i) { ir_node *pred = get_irn_intra_n(node, i); - ir_node *pred_bl = get_nodes_block(pred); + ir_node *pred_bl = get_irn_intra_n(pred, -1); ir_node *leader = value_lookup(get_block_info(pred_bl)->avail_out, pred); leader = leader != NULL ? leader : pred; - if (is_Phi(leader) && get_nodes_block(pred) == block) + if (is_Phi(leader) && get_irn_intra_n(pred, -1) == block) break; } if (i >= arity) { @@ -528,14 +530,14 @@ static ir_node *phi_translate(ir_node *node, ir_node *block, int pos, pre_env *e node might depend on that. */ copy_node_attr(node, nn); - set_nodes_block(nn, get_nodes_block(node)); + set_irn_n(nn, -1, get_irn_intra_n(node, -1)); for (i = 0; i < arity; ++i) { ir_node *pred = get_irn_intra_n(node, i); - ir_node *pred_bl = get_nodes_block(pred); + ir_node *pred_bl = get_irn_intra_n(pred, -1); ir_node *leader = value_lookup(get_block_info(pred_bl)->avail_out, pred); leader = leader != NULL ? leader : pred; - if (is_Phi(leader) && get_nodes_block(pred) == block) + if (is_Phi(leader) && get_irn_intra_n(pred, -1) == block) set_irn_n(nn, i, get_Phi_pred(leader, pos)); else set_irn_n(nn, i, leader); @@ -604,7 +606,7 @@ restart: for (i = get_irn_intra_arity(n) - 1; i >= 0; --i) { pred = get_irn_intra_n(n, i); - pred_blk = get_nodes_block(pred); + pred_blk = get_irn_intra_n(pred, -1); if (block_dominates(pred_blk, blk)) continue; /* pred do not dominate it, but may be in the set */ @@ -793,8 +795,9 @@ static void insert_nodes(ir_node *block, void *ctx) value_set_foreach(entry, idom_info->new_set) { updated |= value_add_or_replace(curr_info->avail_out, entry->node, entry->value); } - if (updated) + if (updated) { dump_value_set(curr_info->avail_out, "Updated [Avail_out]", block); + } if (arity <= 1) return; @@ -1005,6 +1008,10 @@ 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);