From: Christoph Mallon Date: Tue, 11 Nov 2008 11:44:33 +0000 (+0000) Subject: Make the out edge verifier happy, when removing unnecessary ia32_Test, by not creatin... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=83ae842bb35718cdc1498888014045f9da8a6769;p=libfirm Make the out edge verifier happy, when removing unnecessary ia32_Test, by not creating a result Proj, when there are no other users. [r23555] --- diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index 2bb3b3365..9b9c308b4 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -139,40 +139,6 @@ check_shift_amount: produces_flag_zero : produces_no_flag; } -/** - * If the given node has not mode_T, creates a mode_T version (with a result Proj). - * - * @param node the node to change - * - * @return the new mode_T node (if the mode was changed) or node itself - */ -static ir_node *turn_into_mode_t(ir_node *node) -{ - ir_node *block; - ir_node *res_proj; - ir_node *new_node; - const arch_register_t *reg; - - if(get_irn_mode(node) == mode_T) - return node; - - assert(get_irn_mode(node) == mode_Iu); - - new_node = exact_copy(node); - set_irn_mode(new_node, mode_T); - - block = get_nodes_block(new_node); - res_proj = new_r_Proj(current_ir_graph, block, new_node, mode_Iu, - pn_ia32_res); - - reg = arch_get_irn_register(node); - arch_set_irn_register(res_proj, reg); - - sched_add_before(node, new_node); - be_peephole_exchange(node, res_proj); - return new_node; -} - /** * Replace Cmp(x, 0) by a Test(x, x) */ @@ -315,7 +281,19 @@ static void peephole_ia32_Test(ir_node *node) return; } - left = turn_into_mode_t(left); + if (get_irn_mode(left) != mode_T) { + set_irn_mode(left, mode_T); + + /* If there are other users, reroute them to result proj */ + if (get_irn_n_edges(left) != 2) { + ir_node *res = new_r_Proj(current_ir_graph, block, left, + mode_Iu, pn_ia32_res); + + edges_reroute(left, res, current_ir_graph); + /* Reattach the result proj to left */ + set_Proj_pred(res, left); + } + } flags_mode = ia32_reg_classes[CLASS_ia32_flags].mode; flags_proj = new_r_Proj(current_ir_graph, block, left, flags_mode,