- printf("kind \"%s\"\n", get_kind_str(i));
- foreach_out_edge_kind(irn, edge, i) {
- ir_printf("\t%+F(%d)\n", edge->src, edge->pos);
+ foreach_out_edge_kind_safe(node, edge, next, EDGE_KIND_NORMAL) {
+ /* find the corresponding successor block. */
+ ir_node *pred = get_edge_src_irn(edge);
+ irg_walk_edges2(pred, pre, post, env);
+ }
+
+ if (post != NULL)
+ post(node, env);
+}
+
+void irg_walk_edges(ir_node *node, irg_walk_func *pre, irg_walk_func *post,
+ void *env)
+{
+ ir_graph *irg = get_irn_irg(node);
+
+ assert(edges_activated(irg));
+ assert(is_Block(node));
+
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
+
+ inc_irg_visited(irg);
+ irg_walk_edges2(node, pre, post, env);
+
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
+}
+
+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_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);