X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgwalk.c;h=058b1c6f246d3fcd1fcc7392036e41297136ced8;hb=e5bab593a4048c0a320d7794fb2cb17697da8389;hp=180680b04c8950e03b7113a0d7d6d85da7f7ce52;hpb=92113524c53ef7b31e31b9ab4f4e2f7af69d46b8;p=libfirm diff --git a/ir/ir/irgwalk.c b/ir/ir/irgwalk.c index 180680b04..058b1c6f2 100644 --- a/ir/ir/irgwalk.c +++ b/ir/ir/irgwalk.c @@ -398,11 +398,11 @@ static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, irg_walk_func *p ir_node *pred = get_cf_op(get_Block_cfgpred(node, i)); pred = get_nodes_block(pred); if(get_irn_opcode(pred) == iro_Block) { - /* recursion */ - irg_block_walk_2(pred, pre, post, env); + /* recursion */ + irg_block_walk_2(pred, pre, post, env); } else { - assert(get_irn_opcode(pred) == iro_Bad); + assert(get_irn_opcode(pred) == iro_Bad); } } @@ -428,6 +428,7 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void if (is_no_Block(node)) block = get_nodes_block(node); else block = node; assert(get_irn_opcode(block) == iro_Block); irg_block_walk_2(block, pre, post, env); + /* keepalive: the endless loops ... */ if (get_irn_op(node) == op_End) { int arity = get_irn_arity(node); @@ -436,6 +437,17 @@ void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void if (get_irn_op(pred) == op_Block) 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); + } + } } return;