+static void firm_prepare_graph(void *self)
+{
+ firm_code_gen_t *cg = self;
+
+ irg_walk_graph(cg->irg, clear_link, localize_const_walker, NULL);
+ irg_walk_graph(cg->irg, NULL, prepare_walker, NULL);
+}
+
+static void firm_before_sched(void *self)
+{
+}
+
+static void imm_scheduler(ir_node *irn, void *env) {
+ if(is_Imm(irn)) {
+ const ir_edge_t *e;
+ ir_node *user, *user_block, *before, *tgt_block;
+
+ if (1 != get_irn_n_edges(irn)) {
+ printf("Out edges: %d\n", get_irn_n_edges(irn));
+ assert(1 == get_irn_n_edges(irn));
+ }
+
+ e = get_irn_out_edge_first(irn);
+ user = e->src;
+ user_block = get_nodes_block(user);
+ if (is_Phi(user)) {
+ before = get_Block_cfgpred_block(user_block, e->pos);
+ tgt_block = before;
+ } else {
+ before = user;
+ tgt_block = user_block;
+ }
+
+ sched_remove(irn);
+ set_nodes_block(irn, tgt_block);
+ sched_add_before(before, irn);
+ }
+}
+
+static void firm_before_ra(void *self)
+{
+ firm_code_gen_t *cg = self;
+ irg_walk_graph(cg->irg, imm_scheduler, NULL, NULL);
+}
+
+static void firm_codegen_done(void *self)