1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Author: Boris Boesler
6 ** traverse an ir graph
7 ** - execute the pre function before recursion
8 ** - execute the post function after recursion
12 # include "irgraph.h" /* ir_visited */
15 void irg_walk_2(ir_node *node,
16 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
22 if(node->visit < ir_visited) {
23 node->visit = ir_visited;
28 if (is_no_Block(node))
29 irg_walk_2(get_nodes_Block(node), pre, post, env);
30 for(i = get_irn_arity(node) - 1; i >= 0; --i) {
31 irg_walk_2(get_irn_n(node, i), pre, post, env);
41 void irg_walk(ir_node *node,
42 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
47 irg_walk_2(node, pre, post, env);
51 /***************************************************************************/
52 void irg_block_walk_2(ir_node *node,
53 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
58 assert(get_irn_opcode(node) == iro_Block);
61 if(get_Block_block_visit(node) < block_visited) {
62 set_Block_block_visit(node, block_visited);
67 for(i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) {
69 /* find the corresponding predecessor block. */
70 ir_node *pred = skip_Proj(get_Block_cfgpred(node, i));
71 /* GL: I'm not sure whether this assert must go through. There
72 could be Id chains?? */
73 assert(is_cfop(pred) || is_fragile_op(pred));
74 pred = get_nodes_Block(pred);
75 assert(get_irn_opcode(pred) == iro_Block);
78 irg_block_walk_2(pred, pre, post, env);
88 /* walks only over Block nodes in the graph. Has it's own visited
89 flag, so that it can be interleaved with the other walker. */
90 void irg_block_walk(ir_node *node,
91 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
96 if (is_no_Block(node)) node = get_nodes_Block(node);
97 assert(get_irn_opcode(node) == iro_Block);
98 irg_block_walk_2(node, pre, post, env);