* @author Sebastian Hack
* @cvs-id $Id$
*/
-
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
#include <stdio.h>
#include <libcore/lc_opts.h>
#include <libcore/lc_opts_enum.h>
+DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL);
+
#define BE_SCHED_NODE(irn) (be_is_Keep(irn) || be_is_CopyKeep(irn) || be_is_RegParams(irn))
enum {
nodeset *live; /**< simple liveness during scheduling */
const list_sched_selector_t *selector;
void *selector_block_env;
- DEBUG_ONLY(firm_dbg_module_t *dbg;)
} block_sched_env_t;
/**
if (env->selector->node_ready)
env->selector->node_ready(env->selector_block_env, irn, pred);
- DB((env->dbg, LEVEL_2, "\tmaking ready: %+F\n", irn));
+ DB((dbg, LEVEL_2, "\tmaking ready: %+F\n", irn));
return 1;
}
update_sched_liveness(env, irn);
sched_add_before(env->block, irn);
- DBG((env->dbg, LEVEL_2, "\tadding %+F\n", irn));
+ DBG((dbg, LEVEL_2, "\tadding %+F\n", irn));
}
/* notify the selector about the finally selected node. */
be.live = new_nodeset(get_irn_n_edges(block));
be.selector = selector;
be.sched_env = env;
- FIRM_DBG_REGISTER(be.dbg, "firm.be.sched");
- DBG((be.dbg, LEVEL_1, "scheduling %+F\n", block));
+ DBG((dbg, LEVEL_1, "scheduling %+F\n", block));
if (selector->init_block)
be.selector_block_env = selector->init_block(env->selector_env, block);
/* Make the node ready, if all operands live in a foreign block */
if (ready) {
- DBG((be.dbg, LEVEL_2, "\timmediately ready: %+F\n", irn));
+ DBG((dbg, LEVEL_2, "\timmediately ready: %+F\n", irn));
make_ready(&be, NULL, irn);
}
}
irn = be.selector->select(be.selector_block_env, be.cands, be.live);
}
- DB((be.dbg, LEVEL_2, "\tpicked node %+F\n", irn));
+ DB((dbg, LEVEL_2, "\tpicked node %+F\n", irn));
/* Add the node to the schedule. */
add_to_sched(&be, irn);
DEL_ARR_F(env.sched_info);
}
+/* List schedule a block. */
+void list_sched_single_block(const be_irg_t *birg, ir_node *block, be_options_t *be_opts)
+{
+ const arch_env_t *arch_env = birg->main_env->arch_env;
+ ir_graph *irg = birg->irg;
+
+ int num_nodes;
+ sched_env_t env;
+ list_sched_selector_t sel;
+
+ /* Select a scheduler based on backend options */
+ switch (list_sched_options.select) {
+ case BE_SCHED_SELECT_TRIVIAL:
+ memcpy(&sel, trivial_selector, sizeof(sel));
+ break;
+ case BE_SCHED_SELECT_RANDOM:
+ memcpy(&sel, random_selector, sizeof(sel));
+ break;
+ case BE_SCHED_SELECT_REGPRESS:
+ memcpy(&sel, reg_pressure_selector, sizeof(sel));
+ break;
+ case BE_SCHED_SELECT_MUCHNIK:
+ memcpy(&sel, muchnik_selector, sizeof(sel));
+ break;
+ case BE_SCHED_SELECT_HEUR:
+ memcpy(&sel, heuristic_selector, sizeof(sel));
+ break;
+ case BE_SCHED_SELECT_HMUCHNIK:
+ default:
+ memcpy(&sel, trivial_selector, sizeof(sel));
+ }
+
+ /* Assure, that the out edges are computed */
+ edges_deactivate(birg->irg);
+ edges_activate(birg->irg);
+
+ num_nodes = get_irg_last_idx(irg);
+
+ /* initialize environment for list scheduler */
+ memset(&env, 0, sizeof(env));
+ env.selector = arch_env->isa->impl->get_list_sched_selector(arch_env->isa, &sel);
+ env.arch_env = arch_env;
+ env.irg = irg;
+ env.sched_info = NEW_ARR_F(sched_irn_t, num_nodes);
+
+ memset(env.sched_info, 0, num_nodes * sizeof(env.sched_info[0]));
+
+ if (env.selector->init_graph)
+ env.selector_env = env.selector->init_graph(env.selector, arch_env, irg);
+
+ /* Schedule block. */
+ list_sched_block(block, &env);
+
+ if (env.selector->finish_graph)
+ env.selector->finish_graph(env.selector_env);
+
+ DEL_ARR_F(env.sched_info);
+}
+
/**
* Register list scheduler options.
*/
lc_opt_entry_t *sched_grp = lc_opt_get_grp(be_grp, "listsched");
lc_opt_add_table(sched_grp, list_sched_option_table);
+
+ FIRM_DBG_REGISTER(dbg, "firm.be.sched");
}
BE_REGISTER_MODULE_CONSTRUCTOR(be_init_listsched);