never set the startblock to bad (even without the self-referencing loop)
[libfirm] / ir / ir / iredges.c
index 265d536..930dab4 100644 (file)
@@ -176,8 +176,7 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt, ir_node *old_tg
 {
        const char *msg = "";
 
-       if(!edges_activated_kind(irg, kind))
-               return;
+       assert(edges_activated_kind(irg, kind));
 
        /*
         * Only do something, if the old and new target differ.
@@ -206,8 +205,6 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt, ir_node *old_tg
 
                        /* mark the edge invalid if it was found */
                        if(edge) {
-                               ir_block_edge_t *block_edge = (ir_block_edge_t *) edge;
-
                                msg = "deleting";
                                list_del(&edge->list);
                                edge->invalid = 1;
@@ -267,12 +264,18 @@ void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt, ir_node *old_tg
 
 void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt, ir_graph *irg)
 {
-       edges_notify_edge_kind(src, pos, tgt, old_tgt, EDGE_KIND_NORMAL, irg);
-       if(is_Block(src)) {
+       if(edges_activated_kind(irg, EDGE_KIND_NORMAL)) {
+               edges_notify_edge_kind(src, pos, tgt, old_tgt, EDGE_KIND_NORMAL, irg);
+       }
+
+       if(edges_activated_kind(irg, EDGE_KIND_BLOCK) && is_Block(src)) {
                /* do not use get_nodes_block() here, it fails when running unpinned */
-               ir_node *bl_tgt = tgt     ? get_irn_n(skip_Proj(tgt), -1)     : NULL;
-               // ir_node *bl_old = old_tgt ? old_tgt : NULL;
                ir_node *bl_old = old_tgt ? get_irn_n(skip_Proj(old_tgt), -1) : NULL;
+               ir_node *bl_tgt = NULL;
+
+               if(tgt)
+                       bl_tgt = is_Bad(tgt) ? tgt : get_irn_n(skip_Proj(tgt), -1);
+
                edges_notify_edge_kind(src, pos, bl_tgt, bl_old, EDGE_KIND_BLOCK, irg);
        }
 }
@@ -280,15 +283,16 @@ void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt, ir
 
 void edges_node_deleted_kind(ir_node *old, ir_edge_kind_t kind, ir_graph *irg)
 {
-       if(edges_activated_kind(irg, kind)) {
-               int i, n;
+       int i, n;
 
-               DBG((dbg, LEVEL_5, "node deleted (kind: %s): %+F\n", get_kind_str(kind), old));
+       if(!edges_activated_kind(irg, kind))
+               return;
 
-               foreach_tgt(old, i, n, kind) {
-                       ir_node *old_tgt = get_n(old, i, kind);
-                       edges_notify_edge_kind(old, i, NULL, old_tgt, kind, irg);
-               }
+       DBG((dbg, LEVEL_5, "node deleted (kind: %s): %+F\n", get_kind_str(kind), old));
+
+       foreach_tgt(old, i, n, kind) {
+               ir_node *old_tgt = get_n(old, i, kind);
+               edges_notify_edge_kind(old, i, NULL, old_tgt, kind, irg);
        }
 }
 
@@ -304,6 +308,9 @@ static void build_edges_walker(ir_node *irn, void *data) {
        struct build_walker *w = data;
        int i, n;
 
+       if(!edges_activated_kind(w->irg, w->kind))
+               return;
+
        foreach_tgt(irn, i, n, w->kind)
                edges_notify_edge_kind(irn, i, get_n(irn, i, w->kind), NULL, w->kind, w->irg);
 }
@@ -361,8 +368,9 @@ void edges_activate_kind(ir_graph *irg, ir_edge_kind_t kind)
 
        info->activated = 1;
        edges_init_graph_kind(irg, kind);
-       irg_walk_graph(irg, init_lh_walker, build_edges_walker, &w);
-       irg_walk_anchors(irg, init_lh_walker, NULL, &w);
+       //irg_walk_graph(irg, init_lh_walker, build_edges_walker, &w);
+       inc_irg_visited(irg);
+       irg_walk_anchors(irg, init_lh_walker, build_edges_walker, &w);
        visit_all_identities(irg, visitor, &w);
 }
 
@@ -411,7 +419,6 @@ static void verify_set_presence(ir_node *irn, void *data)
 {
        struct build_walker *w = data;
        set *edges             = _get_irg_edge_info(w->irg, w->kind)->edges;
-       int not_a_block        = !is_Block(irn);
        int i, n;
 
        foreach_tgt(irn, i, n, w->kind) {