Added new ifg interface
[libfirm] / ir / be / belistsched.c
index 1d650fe..880d442 100644 (file)
@@ -29,6 +29,8 @@
 #include "beutil.h"
 #include "belive_t.h"
 #include "belistsched.h"
+#include "bearch_firm.h"
+
 
 /**
  * Scheduling environment for the whole graph.
@@ -71,6 +73,8 @@ static ir_node *trivial_select(void *env, void *block_env,
                const struct list_head *sched_head,
                int curr_time, pset *ready_set)
 {
+       ir_node *res;
+
 #if 0
        int i, n = pset_count(ready_set);
        ir_node *irn;
@@ -80,8 +84,7 @@ static ir_node *trivial_select(void *env, void *block_env,
                ready[i++] = irn;
 #endif
 
-
-       ir_node *res = pset_first(ready_set);
+       res = pset_first(ready_set);
        pset_break(ready_set);
        return res;
 }
@@ -302,7 +305,6 @@ static void list_sched_block(ir_node *block, void *env_ptr)
        sched_env_t *env = env_ptr;
        block_sched_env_t be;
        const list_sched_selector_t *selector = env->selector;
-
        const ir_edge_t *edge;
        ir_node *irn;
        int i, n, j, m;
@@ -319,7 +321,7 @@ static void list_sched_block(ir_node *block, void *env_ptr)
        be.ready_set = new_pset(node_cmp_func, get_irn_n_edges(block));
        be.already_scheduled = new_pset(node_cmp_func, get_irn_n_edges(block));
 
-  firm_dbg_set_mask(be.dbg, 0);
+       firm_dbg_set_mask(be.dbg, 0);
 
        if(selector->init_block)
                block_env = selector->init_block(env->selector_env, block);
@@ -345,14 +347,14 @@ static void list_sched_block(ir_node *block, void *env_ptr)
                /* Other nodes must have all operands in other blocks to be made
                 * ready */
                else {
-                       bool ready = true;
+                       int ready = 1;
 
                        /* Check, if the operands of a node are not local to this block */
                        for(j = 0, m = get_irn_arity(irn); j < m; ++j) {
                                ir_node *operand = get_irn_n(irn, j);
 
                                if(get_nodes_block(operand) == block) {
-                                       ready = false;
+                                       ready = 0;
                                        break;
                                }
                        }
@@ -398,3 +400,34 @@ static void list_sched_block(ir_node *block, void *env_ptr)
        del_pset(be.ready_set);
        del_pset(be.already_scheduled);
 }
+
+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);
+       }
+}
+
+void be_sched_imm(ir_graph *irg) {
+       irg_walk_graph(irg, imm_scheduler, NULL, NULL);
+}