X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgwalk.c;h=3c5ddac35f2872c96468f498e462e7b7f930ad13;hb=a226465c4f00c94b3e94a7c717e04061625e7a33;hp=b46a93603a81fc6b950cd53238a9954b0ed8bebc;hpb=4e3fd9fecccfd54df03b342bd20e1ecd2d5c940f;p=libfirm diff --git a/ir/ir/irgwalk.c b/ir/ir/irgwalk.c index b46a93603..3c5ddac35 100644 --- a/ir/ir/irgwalk.c +++ b/ir/ir/irgwalk.c @@ -28,6 +28,8 @@ # include "irprog.h" # include "irgwalk.h" # include "typewalk.h" +# include "firmstat.h" +# include "ircgcons.h" # include "eset.h" # include "array.h" @@ -150,10 +152,13 @@ irg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env) void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env) { assert(node && node->kind==k_ir_node); + if (interprocedural_view) { eset * irg_set = eset_create(); int visited; ir_graph * irg; + assert(get_irp_ip_view_state() == ip_view_valid); + interprocedural_view = false; eset_insert(irg_set, current_ir_graph); irg_walk(node, (irg_walk_func *) collect_irgs, NULL, irg_set); @@ -174,6 +179,8 @@ void irg_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env) void irg_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env) { ir_graph * rem = current_ir_graph; + + stat_irg_walk(irg, (void *)pre, (void *)post); current_ir_graph = irg; irg_walk(get_irg_end(irg), pre, post, env); current_ir_graph = rem; @@ -234,7 +241,8 @@ cg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env) if (is_no_Block(node)) cg_walk_2(get_nodes_block(node), pre, post, env); for (i = get_irn_arity(node) - 1; i >= 0; --i) { - rem = switch_irg(node, i); + rem = switch_irg(node, i); /* @@@ AS: Is this wrong? We do have to + switch to the irg of the predecessor, don't we? */ cg_walk_2(get_irn_n(node, i), pre, post, env); current_ir_graph = rem; } @@ -324,7 +332,6 @@ static ir_node *get_cf_op(ir_node *n) { static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env) { int i; - assert(get_irn_opcode(node) == iro_Block); if(get_Block_block_visited(node) < get_irg_block_visited(current_ir_graph)) { set_Block_block_visited(node, get_irg_block_visited(current_ir_graph)); @@ -357,6 +364,8 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void ir_node *block, *pred; int i; + stat_irg_block_walk(current_ir_graph, node, (void *)pre, (void *)post); + assert(node); assert(!interprocedural_view); /* interprocedural_view not implemented, because it * interleaves with irg_walk */