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
16 # include "irgraph.h" /* visited flag */
19 void irg_walk_2(ir_node *node,
20 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
26 /* printf(" - "); DDMSG2(node); */
28 if (get_irn_visited(node) < get_irg_visited(current_ir_graph)) {
30 /* printf(" -> "); DDMSG2(node); */
31 set_irn_visited(node, get_irg_visited(current_ir_graph));
37 if (is_no_Block(node)) {
38 irg_walk_2(get_nodes_Block(node), pre, post, env);
40 for (i = get_irn_arity(node) - 1; i >= 0; --i) {
41 /* printf(" "); DDMSG2(node); */
42 /* printf(" "); DDMSG2(get_irn_n(node, i)); */
44 irg_walk_2(get_irn_n(node, i), pre, post, env);
47 /* printf(" <- "); DDMSG2(node); */
55 void irg_walk(ir_node *node,
56 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
60 inc_irg_visited (current_ir_graph);
61 irg_walk_2(node, pre, post, env);
65 /***************************************************************************/
66 void irg_block_walk_2(ir_node *node, void (pre)(ir_node*, void*),
67 void (post)(ir_node*, void*), void *env)
71 assert(get_irn_opcode(node) == iro_Block);
73 if(get_Block_block_visited(node) < get_irg_block_visited(current_ir_graph)) {
74 set_Block_block_visited(node, get_irg_block_visited(current_ir_graph));
79 for(i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) {
81 /* find the corresponding predecessor block. */
82 ir_node *pred = skip_Proj(get_Block_cfgpred(node, i));
83 /* GL: I'm not sure whether this assert must go through. There
84 could be Id chains?? */
85 assert(is_cfop(pred) || is_fragile_op(pred));
86 pred = get_nodes_Block(pred);
87 if(get_irn_opcode(pred) == iro_Block) {
89 irg_block_walk_2(pred, pre, post, env);
92 assert(get_irn_opcode(pred) == iro_Bad);
103 /* walks only over Block nodes in the graph. Has it's own visited
104 flag, so that it can be interleaved with the other walker. */
105 void irg_block_walk(ir_node *node,
106 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
110 inc_irg_block_visited(current_ir_graph);
111 if (is_no_Block(node)) node = get_nodes_Block(node);
112 assert(get_irn_opcode(node) == iro_Block);
113 irg_block_walk_2(node, pre, post, env);