X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbesched.c;h=a2c82b9d9fcca44efefe7760d6a9f256b4744f7a;hb=4ed245f5007168dab7850942a7ee6b6b29a19817;hp=a588458457016fbf41ef2259c8a94836b0baff77;hpb=e75b04273cb928f5a2dfd63326b147c7a26857da;p=libfirm diff --git a/ir/be/besched.c b/ir/be/besched.c index a58845845..a2c82b9d9 100644 --- a/ir/be/besched.c +++ b/ir/be/besched.c @@ -1,3 +1,5 @@ +/* $Id$ */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -12,6 +14,7 @@ #include "irnode_t.h" #include "irgraph_t.h" #include "iredges_t.h" +#include "ircons.h" #include "debug.h" #include "bearch.h" @@ -60,7 +63,7 @@ void sched_renumber(const ir_node *block) { ir_node *irn; sched_info_t *inf; - sched_timestep_t step = 0; + sched_timestep_t step = SCHED_INITIAL_GRANULARITY; sched_foreach(block, irn) { inf = get_irn_sched_info(irn); @@ -180,7 +183,7 @@ int sched_verify_irg(ir_graph *irg) int sched_skip_cf_predicator(const ir_node *irn, void *data) { arch_env_t *ae = data; - return arch_irn_classify(ae, irn) == arch_irn_class_branch; + return arch_irn_class_is(ae, irn, branch); } int sched_skip_phi_predicator(const ir_node *irn, void *data) { @@ -258,3 +261,49 @@ ir_node **sched_create_block_schedule(ir_graph *irg) } return blk_list; } + +typedef struct remove_dead_nodes_env_t_ { + ir_graph *irg; + bitset_t *reachable; +} remove_dead_nodes_env_t; + +static void mark_dead_nodes_walker(ir_node *node, void *data) +{ + remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data; + bitset_set(env->reachable, get_irn_idx(node)); +} + +static void remove_dead_nodes_walker(ir_node *block, void *data) +{ + remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data; + ir_node *node, *next; + + for(node = sched_first(block); !sched_is_end(node); node = next) { + int i, arity; + + // get next node now, as after calling sched_remove it will be invalid + next = sched_next(node); + + if(bitset_is_set(env->reachable, get_irn_idx(node))) + continue; + + arity = get_irn_arity(node); + for(i = 0; i < arity; ++i) + set_irn_n(node, i, new_r_Bad(env->irg)); + + sched_remove(node); + } +} + +void be_remove_dead_nodes_from_schedule(ir_graph *irg) +{ + remove_dead_nodes_env_t env; + env.irg = irg; + env.reachable = bitset_alloca(get_irg_last_idx(irg)); + + // mark all reachable nodes + irg_walk_graph(irg, mark_dead_nodes_walker, NULL, &env); + + // walk schedule and remove non-marked nodes + irg_block_walk_graph(irg, remove_dead_nodes_walker, NULL, &env); +}