+static void irg_walk_edges2(ir_node *node, irg_walk_func *pre,
+ irg_walk_func *post, void *env)
+{
+ const ir_edge_t *edge, *next;
+
+ if (irn_visited_else_mark(node))
+ return;
+
+ if (pre != NULL)
+ pre(node, env);
+
+ 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);
+}
+