From a6b6c1a45c6341e4f5d1ebabf97f60d0cdaaf249 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Fri, 9 Apr 2010 14:03:51 +0000 Subject: [PATCH] fix consconfirm missing nodes in its statistics and worse not invalidating out-edges because of that [r27365] --- ir/ana/irconsconfirm.c | 68 +++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/ir/ana/irconsconfirm.c b/ir/ana/irconsconfirm.c index d9a2c17eb..a6628df04 100644 --- a/ir/ana/irconsconfirm.c +++ b/ir/ana/irconsconfirm.c @@ -298,39 +298,40 @@ static void handle_if(ir_node *block, ir_node *cmp, pn_Cmp pnc, env_t *env) DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, user, right)); env->num_eq += 1; - } else if (block_dominates(blk, cond_block)) { - if (is_Const(right) && get_irn_pinned(user) == op_pin_state_floats) { - /* - * left == Const and we found a movable user of left in a - * dominator of the Cond block - */ - const ir_edge_t *edge, *next; - for (edge = get_irn_out_edge_first(user); edge; edge = next) { - ir_node *usr_of_usr = get_edge_src_irn(edge); - int npos = get_edge_src_pos(edge); - ir_node *blk = get_effective_use_block(usr_of_usr, npos); - - next = get_irn_out_edge_next(user, edge); - if (block_dominates(block, blk)) { - /* - * The user of the user is dominated by our true/false - * block. So, create a copy of user WITH the constant - * replacing it's pos'th input. - * - * This is always good for unop's and might be good - * for binops. - * - * If user has other user in the false/true block, code - * placement will move it down. - * If there are users in cond block or upper, we create - * "redundant ops", because one will have a const op, - * the other no const ... - */ - ir_node *new_op = exact_copy(user); - set_nodes_block(new_op, block); - set_irn_n(new_op, pos, right); - set_irn_n(usr_of_usr, npos, new_op); - } + } else if (block_dominates(blk, cond_block) + && is_Const(right) + && get_irn_pinned(user) == op_pin_state_floats) { + /* + * left == Const and we found a movable user of left in a + * dominator of the Cond block + */ + const ir_edge_t *edge, *next; + for (edge = get_irn_out_edge_first(user); edge; edge = next) { + ir_node *usr_of_usr = get_edge_src_irn(edge); + int npos = get_edge_src_pos(edge); + ir_node *blk = get_effective_use_block(usr_of_usr, npos); + + next = get_irn_out_edge_next(user, edge); + if (block_dominates(block, blk)) { + /* + * The user of the user is dominated by our true/false + * block. So, create a copy of user WITH the constant + * replacing it's pos'th input. + * + * This is always good for unop's and might be good + * for binops. + * + * If user has other user in the false/true block, code + * placement will move it down. + * If there are users in cond block or upper, we create + * "redundant ops", because one will have a const op, + * the other no const ... + */ + ir_node *new_op = exact_copy(user); + set_nodes_block(new_op, block); + set_irn_n(new_op, pos, right); + set_irn_n(usr_of_usr, npos, new_op); + env->num_eq += 1; } } } @@ -564,7 +565,6 @@ void construct_confirms(ir_graph *irg) env_t env; int edges_active = edges_activated(irg); - FIRM_DBG_REGISTER(dbg, "firm.ana.confirm"); remove_critical_cf_edges(irg); -- 2.20.1