Make the out edge verifier happy, when removing unnecessary ia32_Test, by not creatin...
authorChristoph Mallon <christoph.mallon@gmx.de>
Tue, 11 Nov 2008 11:44:33 +0000 (11:44 +0000)
committerChristoph Mallon <christoph.mallon@gmx.de>
Tue, 11 Nov 2008 11:44:33 +0000 (11:44 +0000)
[r23555]

ir/be/ia32/ia32_optimize.c

index 2bb3b33..9b9c308 100644 (file)
@@ -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,