- ir_node *block, *pred;
- int i;
-
- assert(node);
- inc_irg_block_visited(current_ir_graph);
- if (is_no_Block(node)) block = get_nodes_Block(node); else block = node;
- assert(get_irn_opcode(block) == iro_Block);
- irg_block_walk_2(block, pre, post, env);
- /* keepalive: the endless loops ... */
- if (get_irn_op(node) == op_End)
- for (i = 0; i < get_irn_arity(node); i++) {
- pred = get_irn_n(node, i);
- if (get_irn_op(pred) == op_Block)
- irg_block_walk_2(pred, pre, post, env);
+ ir_graph *irg = current_ir_graph;
+ ir_node *block, *pred;
+ int i;
+
+ hook_irg_block_walk(irg, node, (generic_func *)pre, (generic_func *)post);
+
+ assert(node);
+ assert(!get_interprocedural_view()); /* interprocedural_view not implemented, because it
+ * interleaves with irg_walk */
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_VISITED);
+ inc_irg_block_visited(irg);
+ block = is_Block(node) ? node : get_nodes_block(node);
+ assert(is_Block(block));
+ irg_block_walk_2(block, pre, post, env);
+
+ /* keepalive: the endless loops ... */
+ if (is_End(node)) {
+ int arity = get_irn_arity(node);
+ for (i = 0; i < arity; i++) {
+ pred = get_irn_n(node, i);
+ if (is_Block(pred))
+ irg_block_walk_2(pred, pre, post, env);
+ }
+ /* Sometimes the blocks died, but are still reachable through Phis.
+ * Make sure the algorithms that try to remove these reach them. */
+ for (i = 0; i < arity; i++) {
+ pred = get_irn_n(node, i);
+ if (get_irn_op(pred) == op_Phi) {
+ ir_node *block = get_nodes_block(pred);
+
+ if (! is_Bad(block))
+ irg_block_walk_2(block, pre, post, env);
+ }
+ }
+ }
+
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_VISITED);
+}
+
+/*
+ * walk over a graph block wise
+ */
+void irg_block_walk_graph(ir_graph *irg, irg_walk_func *pre,
+ irg_walk_func *post, void *env) {
+ ir_graph * rem = current_ir_graph;
+ current_ir_graph = irg;
+ irg_block_walk(get_irg_end(irg), pre, post, env);
+ current_ir_graph = rem;
+}
+
+/*
+ * Additionally walk over all anchors. Do NOT increase the visit flag.
+ */
+void irg_walk_anchors(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env) {
+ ir_graph * rem = current_ir_graph;
+ current_ir_graph = irg;
+
+ inc_irg_visited(irg);
+ irg_walk_2(irg->anchor, pre, post, env);
+
+ current_ir_graph = rem;
+}
+
+/********************************************************************/
+
+typedef struct walk_env {
+ irg_walk_func *pre;
+ irg_walk_func *post;
+ void *env;
+} walk_env;
+
+static void walk_initializer(ir_initializer_t *initializer, walk_env *env)
+{
+ switch(initializer->kind) {
+ case IR_INITIALIZER_CONST:
+ irg_walk(initializer->consti.value, env->pre, env->post, env->env);
+ return;
+ case IR_INITIALIZER_TARVAL:
+ case IR_INITIALIZER_NULL:
+ return;
+
+ case IR_INITIALIZER_COMPOUND: {
+ size_t i;
+ for(i = 0; i < initializer->compound.n_initializers; ++i) {
+ ir_initializer_t *subinitializer
+ = initializer->compound.initializers[i];
+ walk_initializer(subinitializer, env);
+ }
+ return;