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
18 # include "irgraph.h" /* visited flag */
21 void irg_walk_2(ir_node *node,
22 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
29 /* printf(" - "); DDMSG2(node); */
31 if (get_irn_visited(node) < get_irg_visited(current_ir_graph)) {
33 /* printf(" -> "); DDMSG2(node); */
34 set_irn_visited(node, get_irg_visited(current_ir_graph));
40 if (is_no_Block(node)) {
41 irg_walk_2(get_nodes_Block(node), pre, post, env);
43 for (i = get_irn_arity(node) - 1; i >= 0; --i) {
44 /* printf(" "); DDMSG2(node);
45 printf(" "); DDMSG2(get_irn_n(node, i)); */
47 irg_walk_2(get_irn_n(node, i), pre, post, env);
50 /* printf(" <- "); DDMSG2(node); */
58 void irg_walk(ir_node *node,
59 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
63 inc_irg_visited (current_ir_graph);
64 irg_walk_2(node, pre, post, env);
68 /***************************************************************************/
70 /* Walks back from n until it finds a real cf op. */
71 ir_node *get_cf_op(ir_node *n) {
77 if (!(is_cfop(pred) || is_fragile_op(pred) ||
78 (get_irn_op(pred) == op_Bad)))
84 void irg_block_walk_2(ir_node *node, void (pre)(ir_node*, void*),
85 void (post)(ir_node*, void*), void *env)
89 assert(get_irn_opcode(node) == iro_Block);
91 if(get_Block_block_visited(node) < get_irg_block_visited(current_ir_graph)) {
92 set_Block_block_visited(node, get_irg_block_visited(current_ir_graph));
97 for(i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) {
99 /* find the corresponding predecessor block. */
100 ir_node *pred = get_cf_op(get_Block_cfgpred(node, i));
101 /* GL: I'm not sure whether this assert must go through. There
102 could be Id chains?? Tuple/Proj .... */
104 assert(is_cfop(pred) || is_fragile_op(pred) ||
105 (get_irn_op(pred) == op_Bad));
106 pred = get_nodes_Block(pred);
107 if(get_irn_opcode(pred) == iro_Block) {
109 irg_block_walk_2(pred, pre, post, env);
112 assert(get_irn_opcode(pred) == iro_Bad);
123 /* walks only over Block nodes in the graph. Has it's own visited
124 flag, so that it can be interleaved with the other walker. */
125 void irg_block_walk(ir_node *node,
126 void (pre)(ir_node*, void*), void (post)(ir_node*, void*),
129 ir_node *block, *pred;
133 inc_irg_block_visited(current_ir_graph);
134 if (is_no_Block(node)) block = get_nodes_Block(node); else block = node;
135 assert(get_irn_opcode(block) == iro_Block);
136 irg_block_walk_2(block, pre, post, env);
137 /* keepalive: the endless loops ... */
138 if (get_irn_op(node) == op_End)
139 for (i = 0; i < get_irn_arity(node); i++) {
140 pred = get_irn_n(node, i);
141 if (get_irn_op(pred) == op_Block)
142 irg_block_walk_2(pred, pre, post, env);