+ sched_info_t *const old_info = get_irn_sched_info(old);
+ sched_info_t *const irn_info = get_irn_sched_info(irn);
+ *irn_info = *old_info;
+
+ old_info->prev = NULL;
+ old_info->next = NULL;
+
+ ir_node *const prev = irn_info->prev;
+ ir_node *const next = irn_info->next;
+ get_irn_sched_info(prev)->next = irn;
+ get_irn_sched_info(next)->prev = irn;
+}
+
+static be_module_list_entry_t *schedulers;
+static schedule_func scheduler;
+
+void be_register_scheduler(const char *name, schedule_func func)
+{
+ if (scheduler == NULL)
+ scheduler = func;
+ be_add_module_to_list(&schedulers, name, (void*)func);
+}
+
+void be_schedule_graph(ir_graph *irg)
+{
+ scheduler(irg);
+}
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_sched)
+void be_init_sched(void)
+{
+ lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
+ be_add_module_list_opt(be_grp, "scheduler", "scheduling algorithm",
+ &schedulers, (void**)&scheduler);