iredges: introduce new reroute_edges_except
[libfirm] / ir / ir / iredges.c
index 1e6fe6c..cb163b1 100644 (file)
@@ -631,6 +631,7 @@ void edges_deactivate_kind(ir_graph *irg, ir_edge_kind_t kind)
                ir_edgeset_destroy(&info->edges);
                info->allocated = 0;
        }
+       clear_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES);
 }
 
 int (edges_activated_kind)(const ir_graph *irg, ir_edge_kind_t kind)
@@ -656,6 +657,18 @@ void edges_reroute_kind(ir_node *from, ir_node *to, ir_edge_kind_t kind)
        }
 }
 
+void edges_reroute_except(ir_node *from, ir_node *to, ir_node *exception)
+{
+       const ir_edge_t *edge;
+       const ir_edge_t *next;
+       foreach_out_edge_safe(from, edge, next) {
+               ir_node *src = get_edge_src_irn(edge);
+               if (src == exception)
+                       continue;
+               set_irn_n(src, edge->pos, to);
+       }
+}
+
 static void verify_set_presence(ir_node *irn, void *data)
 {
        build_walker *w     = (build_walker*)data;
@@ -917,6 +930,7 @@ void assure_edges(ir_graph *irg)
 {
        assure_edges_kind(irg, EDGE_KIND_BLOCK);
        assure_edges_kind(irg, EDGE_KIND_NORMAL);
+       add_irg_properties(irg, IR_GRAPH_PROPERTY_CONSISTENT_OUT_EDGES);
 }
 
 void assure_edges_kind(ir_graph *irg, ir_edge_kind_t kind)