handle Block_entity like other node attributes
[libfirm] / ir / ir / irgmod.c
index a19f30d..be77a7a 100644 (file)
@@ -21,7 +21,6 @@
  * @file
  * @brief    Support for ir graph modification.
  * @author   Martin Trapp, Christian Schaefer, Goetz Lindenmaier
- * @version  $Id$
  */
 #include "config.h"
 
@@ -47,11 +46,12 @@ void turn_into_tuple(ir_node *node, int arity)
 {
        ir_graph *irg = get_irn_irg(node);
        ir_node **in  = ALLOCAN(ir_node*, arity);
+       ir_node  *bad = new_r_Bad(irg, mode_ANY);
        int       i;
 
        /* construct a new in array, with every input being bad */
        for (i = 0; i < arity; ++i) {
-               in[i] = new_r_Bad(irg);
+               in[i] = bad;
        }
        set_irn_in(node, arity, in);
        set_irn_op(node, op_Tuple);
@@ -111,6 +111,10 @@ void exchange(ir_node *old, ir_node *nw)
                old->in[0] = block;
                old->in[1] = nw;
        }
+
+       /* update irg flags */
+       clear_irg_state(irg, IR_GRAPH_STATE_CONSISTENT_OUTS
+                          | IR_GRAPH_STATE_CONSISTENT_LOOPINFO);
 }
 
 /*--------------------------------------------------------------------*/
@@ -184,6 +188,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).
@@ -196,13 +216,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
@@ -284,11 +298,10 @@ ir_node *part_block_edges(ir_node *node)
 void kill_node(ir_node *node)
 {
        ir_graph *irg = get_irn_irg(node);
-       ir_node *bad = get_irg_bad(irg);
-       int i;
 
-       for (i = get_irn_arity(node) - 1; i >= -1; --i) {
-               set_irn_n(node, i, bad);
+       if (edges_activated(irg)) {
+               edges_node_deleted(node);
        }
-       exchange(node, bad);
+       /* noone is allowed to reference this node anymore */
+       set_irn_op(node, op_Deleted);
 }