+typedef struct dom_traversal_t {
+ blk_collect_data_t *blks;
+ irg_walk_func *pre;
+ irg_walk_func *post;
+ void *env;
+} dom_traversal_t;
+
+/**
+ * Dom block walker. Visit all nodes in pre oder.
+ */
+static void dom_block_visit_pre(ir_node *block, void *env)
+{
+ dom_traversal_t *ctx = (dom_traversal_t*)env;
+ block_entry_t *entry = block_find_entry(block, ctx->blks);
+
+ traverse_block_pre(block, entry, ctx->pre, ctx->env);
+}
+
+/**
+ * Dom block walker. Visit all nodes in post oder.
+ */
+static void dom_block_visit_post(ir_node *block, void *env)
+{
+ dom_traversal_t *ctx = (dom_traversal_t*)env;
+ block_entry_t *entry = block_find_entry(block, ctx->blks);
+
+ traverse_block_post(block, entry, ctx->post, ctx->env);
+}
+
+/**
+ * Dom block walker. Visit all nodes in pre oder, than in post order.
+ */
+static void dom_block_visit_both(ir_node *block, void *env)
+{
+ dom_traversal_t *ctx = (dom_traversal_t*)env;
+ block_entry_t *entry = block_find_entry(block, ctx->blks);
+
+ traverse_block_pre(block, entry, ctx->pre, ctx->env);
+ traverse_block_post(block, entry, ctx->post, ctx->env);
+}
+
+/**
+ * Do the traversal in the dominator tree in top-down order.
+ */
+static void traverse_dom_blocks_top_down(blk_collect_data_t* blks, irg_walk_func *pre, irg_walk_func *post, void *env)
+{
+ dom_traversal_t ctx;
+
+ ctx.blks = blks;
+ ctx.pre = pre;
+ ctx.post = post;
+ ctx.env = env;
+
+ if (pre != NULL && post != NULL)
+ dom_tree_walk_irg(current_ir_graph, dom_block_visit_both, NULL, &ctx);
+ else if (pre != NULL)
+ dom_tree_walk_irg(current_ir_graph, dom_block_visit_pre, NULL, &ctx);
+ else if (post != NULL)
+ dom_tree_walk_irg(current_ir_graph, dom_block_visit_post, NULL, &ctx);
+}
+