X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelistsched.c;h=dbdf8cf99142891073e23557e026de6b07fc4e88;hb=f1faabdafa40558bab4d171999c7c4871dfee5a6;hp=72f3a117837ce3e714668fbdd5036af6846ce58c;hpb=a8d1d1746d152b07ae118e5180c9cb8f99aa9851;p=libfirm diff --git a/ir/be/belistsched.c b/ir/be/belistsched.c index 72f3a1178..dbdf8cf99 100644 --- a/ir/be/belistsched.c +++ b/ir/be/belistsched.c @@ -22,7 +22,6 @@ * @brief Primitive list scheduling with different node selectors. * @author Sebastian Hack * @date 20.10.2004 - * @version $Id$ */ #include "config.h" @@ -37,14 +36,13 @@ #include "obst.h" #include "list.h" -#include "iterator.h" #include "iredges_t.h" #include "irgwalk.h" #include "irnode_t.h" #include "irmode_t.h" #include "irdump.h" -#include "irprintf_t.h" +#include "irprintf.h" #include "array.h" #include "debug.h" #include "irtools.h" @@ -56,12 +54,11 @@ #include "belistsched.h" #include "bearch.h" #include "bestat.h" -#include "beirg.h" #include "lc_opts.h" #include "lc_opts_enum.h" -DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL); +DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) /** * Scheduling environment for the whole graph. @@ -76,19 +73,20 @@ typedef struct sched_env_t { * Environment for a block scheduler. */ typedef struct block_sched_env_t { - unsigned *scheduled; /**< scheduling info per node, copied from the - global scheduler object */ - ir_nodeset_t cands; /**< the set of candidates */ - ir_node *block; /**< the current block */ - sched_env_t *sched_env; /**< the scheduler environment */ + /** scheduling info per node, copied from the global scheduler object */ + unsigned *scheduled; + /** the set of candidates */ + ir_nodeset_t cands; + ir_node *block; /**< the current block */ + sched_env_t *sched_env; /**< the scheduler environment */ const list_sched_selector_t *selector; - void *selector_block_env; + void *selector_block_env; } block_sched_env_t; /** * Returns non-zero if the node is already scheduled */ -static bool is_already_scheduled(block_sched_env_t *env, ir_node *n) +static bool is_already_scheduled(const sched_env_t *env, ir_node *n) { unsigned idx = get_irn_idx(n); return rbitset_is_set(env->scheduled, idx); @@ -97,7 +95,7 @@ static bool is_already_scheduled(block_sched_env_t *env, ir_node *n) /** * Mark a node as already scheduled */ -static void set_already_scheduled(block_sched_env_t *env, ir_node *n) +static void set_already_scheduled(sched_env_t *env, ir_node *n) { unsigned idx = get_irn_idx(n); rbitset_set(env->scheduled, idx); @@ -113,7 +111,7 @@ static void add_to_sched(block_sched_env_t *env, ir_node *irn); static void node_ready(block_sched_env_t *env, ir_node *pred, ir_node *irn) { if (is_Proj(irn) - || (arch_irn_get_flags(irn) & arch_irn_flags_not_scheduled)) { + || (arch_get_irn_flags(irn) & arch_irn_flags_not_scheduled)) { selected(env, irn); DB((dbg, LEVEL_3, "\tmaking immediately available: %+F\n", irn)); } else if (be_is_Keep(irn) || be_is_CopyKeep(irn)) { @@ -154,7 +152,8 @@ static void try_make_ready(block_sched_env_t *env, ir_node *pred, ir_node *irn) /* If the operand is local to the scheduled block and not yet * scheduled, this nodes cannot be made ready, so exit. */ - if (get_nodes_block(op) == env->block && !is_already_scheduled(env, op)) + if (get_nodes_block(op) == env->block + && !is_already_scheduled(env->sched_env, op)) return; } @@ -163,14 +162,12 @@ static void try_make_ready(block_sched_env_t *env, ir_node *pred, ir_node *irn) static void selected(block_sched_env_t *env, ir_node *node) { - const ir_edge_t *edge; - /* notify the selector about the finally selected node. */ if (env->selector->node_selected) env->selector->node_selected(env->selector_block_env, node); /* Insert the node in the set of all available scheduled nodes. */ - set_already_scheduled(env, node); + set_already_scheduled(env->sched_env, node); /* check users, they might be ready now */ foreach_out_edge(node, edge) { @@ -191,7 +188,7 @@ static void selected(block_sched_env_t *env, ir_node *node) */ static void add_to_sched(block_sched_env_t *env, ir_node *irn) { - assert(! (arch_irn_get_flags(irn) & arch_irn_flags_not_scheduled)); + assert(! (arch_get_irn_flags(irn) & arch_irn_flags_not_scheduled)); sched_add_before(env->block, irn); @@ -220,17 +217,16 @@ static void list_sched_block(ir_node *block, void *env_ptr) const list_sched_selector_t *selector = env->selector; block_sched_env_t be; - const ir_edge_t *edge; + ir_nodeset_t *cands = &be.cands; /* Initialize the block's list head that will hold the schedule. */ sched_init_block(block); /* Initialize the block scheduling environment */ - be.scheduled = env->scheduled; - be.block = block; - ir_nodeset_init_size(&be.cands, get_irn_n_edges(block)); - be.selector = selector; - be.sched_env = env; + be.block = block; + be.selector = selector; + be.sched_env = env; + ir_nodeset_init_size(cands, get_irn_n_edges(block)); DB((dbg, LEVEL_1, "scheduling %+F\n", block)); @@ -254,20 +250,20 @@ static void list_sched_block(ir_node *block, void *env_ptr) } /* Iterate over all remaining nodes */ - while (ir_nodeset_size(&be.cands) > 0) { - ir_node *irn = be.selector->select(be.selector_block_env, &be.cands); + while (ir_nodeset_size(cands) > 0) { + ir_node *irn = be.selector->select(be.selector_block_env, cands); DB((dbg, LEVEL_2, "\tpicked node %+F\n", irn)); /* remove the scheduled node from the ready list. */ - ir_nodeset_remove(&be.cands, irn); + ir_nodeset_remove(cands, irn); /* Add the node to the schedule. */ add_to_sched(&be, irn); } + ir_nodeset_destroy(cands); + if (selector->finish_block) selector->finish_block(be.selector_block_env); - - ir_nodeset_destroy(&be.cands); } /* List schedule a graph. */ @@ -302,7 +298,7 @@ void be_list_sched_graph(ir_graph *irg, const list_sched_selector_t *selector) free(env.scheduled); } -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_listsched); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_listsched) void be_init_listsched(void) { FIRM_DBG_REGISTER(dbg, "firm.be.sched");