X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgwalk.c;h=f4726194eac8e14159e9795c53e7c7855c79dd73;hb=bbcec654890da41c2299bf3b07d4cb51e9ed48e1;hp=a0fe6134abb19c652f598d591028bfe30e46a4c3;hpb=0fbcef83aa6060534172bb13e71cdadb04428806;p=libfirm diff --git a/ir/ir/irgwalk.c b/ir/ir/irgwalk.c index a0fe6134a..f4726194e 100644 --- a/ir/ir/irgwalk.c +++ b/ir/ir/irgwalk.c @@ -29,9 +29,7 @@ */ #include "config.h" -#ifdef HAVE_STDLIB_H -# include -#endif +#include #include "irnode_t.h" #include "irgraph_t.h" @@ -45,13 +43,15 @@ #include "pset_new.h" #include "array.h" +#ifdef INTERPROCEDURAL_VIEW /** * Walk over an interprocedural graph (callgraph). * Visits only graphs in irg_set. */ static void irg_walk_cg(ir_node * node, ir_visited_t visited, pset_new_t *irg_set, irg_walk_func *pre, - irg_walk_func *post, void * env) { + irg_walk_func *post, void * env) +{ int i; ir_graph * rem = current_ir_graph; ir_node * pred; @@ -119,7 +119,7 @@ static void irg_walk_cg(ir_node * node, ir_visited_t visited, current_ir_graph = rem; } - +#endif /** * Insert all ir_graphs in irg_set, that are (transitive) reachable. @@ -451,7 +451,7 @@ void irg_walk_in_or_dep_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func * * Returns current_ir_graph and sets it to the irg of predecessor index * of node n. */ -static INLINE ir_graph * +static inline ir_graph * switch_irg(ir_node *n, int index) { ir_graph *old_current = current_ir_graph; @@ -470,6 +470,7 @@ switch_irg(ir_node *n, int index) { return old_current; } +#ifdef INTERPROCEDURAL_VIEW static void cg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env) { @@ -495,7 +496,6 @@ cg_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void * env) } } -#ifdef INTERPROCEDURAL_VIEW /* Walks all irgs in interprocedural view. Visits each node only once. */ void cg_walk(irg_walk_func *pre, irg_walk_func *post, void *env) { int i; @@ -576,13 +576,13 @@ static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *p if (!Block_block_visited(node)) { mark_Block_block_visited(node); - if(pre) pre(node, env); + if (pre) pre(node, env); for(i = get_Block_n_cfgpreds(node) - 1; i >= 0; --i) { /* find the corresponding predecessor block. */ ir_node *pred = get_cf_op(get_Block_cfgpred(node, i)); pred = get_nodes_block(pred); - if(get_irn_opcode(pred) == iro_Block) { + if (get_irn_opcode(pred) == iro_Block) { /* recursion */ irg_block_walk_2(pred, pre, post, env); } @@ -591,7 +591,7 @@ static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *p } } - if(post) post(node, env); + if (post) post(node, env); } } @@ -608,7 +608,7 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void assert(node); assert(!get_interprocedural_view()); /* interprocedural_view not implemented, because it - * interleaves with irg_walk */ + * 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); @@ -620,19 +620,16 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void 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); + if (!is_Block(pred)) { + pred = get_nodes_block(pred); + if (!is_Block(pred)) { + /* if rare cases a kept node might have a bad block input */ + continue; + } } + /* Sometimes the blocks died, but are still reachable through kept nodes. + * Make sure the algorithms that try to remove these reach them. */ + irg_block_walk_2(pred, pre, post, env); } }