make sure projs of projs are moved in part_block_edges
authorMatthias Braun <matze@braunis.de>
Fri, 9 Sep 2011 09:21:13 +0000 (11:21 +0200)
committerMatthias Braun <matze@braunis.de>
Mon, 12 Sep 2011 09:24:43 +0000 (11:24 +0200)
ir/ir/irgmod.c

index fa26791..4ae20bb 100644 (file)
@@ -189,6 +189,22 @@ static void move(ir_node *node, ir_node *from_bl, ir_node *to_bl)
        }
 }
 
+static void move_projs(const ir_node *node, ir_node *to_bl)
+{
+       const ir_edge_t *edge;
+
+       if (get_irn_mode(node) != mode_T)
+               return;
+
+       foreach_out_edge(node, edge) {
+               ir_node *proj = get_edge_src_irn(edge);
+               if (!is_Proj(proj))
+                       continue;
+               set_nodes_block(proj, to_bl);
+               move_projs(proj, to_bl);
+       }
+}
+
 /**
  * Moves node and all predecessors of node from from_bl to to_bl.
  * Does not move predecessors of Phi nodes (or block nodes).
@@ -201,13 +217,7 @@ static void move_edges(ir_node *node, ir_node *from_bl, ir_node *to_bl)
        set_nodes_block(node, to_bl);
 
        /* move its Projs */
-       if (get_irn_mode(node) == mode_T) {
-               const ir_edge_t *edge;
-               foreach_out_edge(node, edge) {
-                       ir_node *proj = get_edge_src_irn(edge);
-                       set_nodes_block(proj, to_bl);
-               }
-       }
+       move_projs(node, to_bl);
 
        /* We must not move predecessors of Phi nodes, even if they are in
         * from_bl. (because these are values from an earlier loop iteration