#include "beutil.h"
#include "belive_t.h"
#include "belistsched.h"
+#include "bearch_firm.h"
+
/**
* Scheduling environment for the whole graph.
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;
ready[i++] = irn;
#endif
-
- ir_node *res = pset_first(ready_set);
+ res = pset_first(ready_set);
pset_break(ready_set);
return res;
}
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;
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);
/* 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;
}
}
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);
+}