do not optimize dead blocks preventing endless loops ...
[libfirm] / ir / ir / irgmod.c
index 47abfa3..7d55d7a 100644 (file)
@@ -40,7 +40,7 @@ turn_into_tuple (ir_node *node, int arity)
   } else {
     /* Allocate new array, don't free old in_array, it's on the obstack. */
     ir_node *block = get_nodes_block(node);
-    edges_invalidate(node, current_ir_graph);
+    edges_node_deleted(node, current_ir_graph);
     node->in = NEW_ARR_D(ir_node *, current_ir_graph->obst, arity+1);
     /* clear the new in array, else edge_notify tries to delete garbage */
     memset(node->in, 0, (arity+1) * sizeof(node->in[0]));
@@ -54,6 +54,7 @@ turn_into_tuple (ir_node *node, int arity)
 void
 exchange (ir_node *old, ir_node *nw)
 {
+  assert(old != nw && "Exchanging node with itself is not allowed");
   hook_replace(old, nw);
 
   /*
@@ -61,7 +62,11 @@ exchange (ir_node *old, ir_node *nw)
    * the edges from the old node to the new directly.
    */
   if (edges_activated(current_ir_graph)) {
+    /* copy all dependencies from old to new */
+    add_irn_deps(nw, old);
+
     edges_reroute(old, nw, current_ir_graph);
+    edges_reroute_kind(old, nw, EDGE_KIND_DEP, current_ir_graph);
     edges_node_deleted(old, current_ir_graph);
     old->op = op_Bad;
   }