+ ir_nodeset_remove(&be.cands, irn);
+ }
+
+ if (selector->finish_block)
+ selector->finish_block(be.selector_block_env);
+
+ ir_nodeset_destroy(&be.cands);
+ ir_nodeset_destroy(&be.live);
+}
+
+/* List schedule a graph. */
+void list_sched(const be_irg_t *birg, 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;
+ mris_env_t *mris = NULL;
+ 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));
+ }
+
+#if 1
+ /* Matze: This is very slow, we should avoid it to improve backend speed,
+ * we just have to make sure that we have no dangling out-edges at this
+ * point...
+ */
+
+ /* Assure, that we have no dangling out-edges to deleted stuff */
+ edges_deactivate(birg->irg);
+ edges_activate(birg->irg);
+#endif
+
+ switch (list_sched_options.prep) {
+ case BE_SCHED_PREP_MRIS:
+ mris = be_sched_mris_preprocess(birg);
+ break;
+ case BE_SCHED_PREP_RSS:
+ rss_schedule_preparation(birg);
+ break;
+ default:
+ break;
+ }
+
+ 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 each single block. */
+ irg_block_walk_graph(irg, list_sched_block, NULL, &env);
+
+ if (env.selector->finish_graph)
+ env.selector->finish_graph(env.selector_env);
+
+ if (list_sched_options.prep == BE_SCHED_PREP_MRIS)
+ be_sched_mris_free(mris);
+
+ 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));