X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgwalk.c;h=df0af385d2a75bb7b58ea528cb61d157cfd17445;hb=eb47aca33f2f8c414409f3695e73277b47442334;hp=7f42f880e5b18e76001c6f3b13e938025e4c484f;hpb=0a4048fbaae21a969b0f03b066dde30a06968814;p=libfirm diff --git a/ir/ir/irgwalk.c b/ir/ir/irgwalk.c index 7f42f880e..df0af385d 100644 --- a/ir/ir/irgwalk.c +++ b/ir/ir/irgwalk.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -190,7 +190,7 @@ void irg_walk_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void current_ir_graph. */ void all_irg_walk(irg_walk_func *pre, irg_walk_func *post, void *env) { - int i, n; + size_t i, n; ir_graph *irg; for (i = 0, n = get_irp_n_irgs(); i < n; i++) { @@ -373,37 +373,33 @@ static void irg_block_walk_2(ir_node *node, irg_walk_func *pre, } -/* walks only over Block nodes in the graph. Has it's own visited +/* walks only over Block nodes in the graph. Has its own visited flag, so that it can be interleaved with the other walker. */ -void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env) +void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, + void *env) { - ir_graph *irg = get_irn_irg(node); - ir_node *block, *pred; - int i; + ir_graph *irg = get_irn_irg(node); + ir_node *block = is_Block(node) ? node : get_nodes_block(node); hook_irg_block_walk(irg, node, (generic_func *)pre, (generic_func *)post); - assert(node); ir_reserve_resources(irg, IR_RESOURCE_BLOCK_VISITED); inc_irg_block_visited(irg); - block = is_Block(node) ? node : get_nodes_block(node); - assert(is_Block(block)); irg_block_walk_2(block, pre, post, env); - /* keepalive: the endless loops ... */ + /* Some blocks might be only reachable through keep-alive edges */ if (is_End(node)) { int arity = get_irn_arity(node); + int i; for (i = 0; i < arity; i++) { - pred = get_irn_n(node, i); + ir_node *pred = get_irn_n(node, i); 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. */ + /* this walker is also used during optimize_graph_df where we can + * temporarily have Bad as block inputs */ + if (is_Bad(pred)) + continue; irg_block_walk_2(pred, pre, post, env); } } @@ -478,7 +474,7 @@ static void walk_entity(ir_entity *ent, void *env) if (ent->initializer != NULL) { walk_initializer(ent->initializer, my_env); } else if (entity_has_compound_ent_values(ent)) { - int i, n_vals = get_compound_ent_n_values(ent); + size_t i, n_vals = get_compound_ent_n_values(ent); for (i = 0; i < n_vals; i++) irg_walk(get_compound_ent_value(ent, i), my_env->pre, my_env->post, my_env->env); @@ -488,7 +484,6 @@ static void walk_entity(ir_entity *ent, void *env) /* Walks over all code in const_code_irg. */ void walk_const_code(irg_walk_func *pre, irg_walk_func *post, void *env) { - int j; walk_env my_env; ir_segment_t s; size_t i; @@ -515,7 +510,7 @@ void walk_const_code(irg_walk_func *pre, irg_walk_func *post, void *env) for (i = 0; i < n_types; i++) { ir_type *tp = get_irp_type(i); if (is_Array_type(tp)) { - int n_dim = get_array_n_dimensions(tp); + size_t j, n_dim = get_array_n_dimensions(tp); for (j = 0; j < n_dim; j++) { ir_node *n = get_array_lower_bound(tp, j); if (n) irg_walk(n, pre, post, env);