X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firedges.c;h=2b6e19da8eb956317c52105f12b0cb7302d71a32;hb=fad022b108892a74b02bef7dfb13315caef5a3fc;hp=27dd5b30ed412ce6386049b87cdd8db27f99607f;hpb=a142727aca4ef56cf754045fc0129b6d1b840a63;p=libfirm diff --git a/ir/ir/iredges.c b/ir/ir/iredges.c index 27dd5b30e..2b6e19da8 100644 --- a/ir/ir/iredges.c +++ b/ir/ir/iredges.c @@ -70,6 +70,7 @@ typedef struct { static int get_zero(const ir_node *irn) { + (void) irn; return 0; } @@ -169,6 +170,7 @@ static int edge_cmp(const void *p1, const void *p2, size_t len) { const ir_edge_t *e1 = p1; const ir_edge_t *e2 = p2; + (void) len; if(e1->src != e2->src) return 1; @@ -261,7 +263,7 @@ static INLINE void vrfy_list_head(ir_node *irn, ir_edge_kind_t kind) { fprintf(stderr, "- at list entry %d\n", num); if (edge->invalid) fprintf(stderr, "- edge(%ld) is invalid\n", edge_get_id(edge)); - if (edge->src); + if (edge->src) ir_fprintf(stderr, "- edge(%ld) %+F(%d)\n", edge_get_id(edge), edge->src, edge->pos); err = 1; break; @@ -496,8 +498,6 @@ 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); - inc_irg_visited(irg); irg_walk_anchors(irg, init_lh_walker, build_edges_walker, &w); visit_all_identities(irg, visitor, &w); } @@ -652,6 +652,7 @@ static void clear_links(ir_node *irn, void *env) { static void count_user(ir_node *irn, void *env) { int i; int first; + (void) env; first = get_irn_first(irn); for (i = get_irn_arity(irn) - 1; i >= first; --i) { @@ -755,9 +756,7 @@ int edges_verify(ir_graph *irg) { w.problem_found = 0; /* verify counter */ - inc_irg_visited(irg); irg_walk_anchors(irg, clear_links, count_user, &w); - inc_irg_visited(irg); irg_walk_anchors(irg, NULL, verify_edge_counter, &w); return problem_found ? 1 : w.problem_found; @@ -839,3 +838,38 @@ void dump_all_out_edges(ir_node *irn) } } } + +static void irg_block_edges_walk2(ir_node *bl, + irg_walk_func *pre, irg_walk_func *post, + void *env) { + const ir_edge_t *edge, *next; + + if (Block_not_block_visited(bl)) { + mark_Block_block_visited(bl); + + if (pre) + pre(bl, env); + + foreach_out_edge_kind_safe(bl, edge, next, EDGE_KIND_BLOCK) { + /* find the corresponding successor block. */ + ir_node *pred = get_edge_src_irn(edge); + irg_block_edges_walk2(pred, pre, post, env); + } + + if (post) + post(bl, env); + } +} + +/* Walks only over Block nodes in the graph. Has it's own visited + flag, so that it can be interleaved with the other walker. */ +void irg_block_edges_walk(ir_node *node, + irg_walk_func *pre, irg_walk_func *post, + void *env) { + + assert(edges_activated(current_ir_graph)); + assert(is_Block(node)); + + inc_irg_block_visited(current_ir_graph); + irg_block_edges_walk2(node, pre, post, env); +}