+ foreach_out_edge(irn, edge)
+ res += get_result_hops_sum(env, get_edge_src_irn(edge));
+ }
+
+ else if(mode_is_data(get_irn_mode(irn)))
+ res = compute_max_hops(env, irn);
+
+
+ return res;
+}
+
+static INLINE int reg_pr_costs(reg_pressure_selector_env_t *env, ir_node *irn)
+{
+ int i, n;
+ int sum = 0;
+
+ for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
+ ir_node *op = get_irn_n(irn, i);
+
+ if(must_appear_in_schedule(env->vtab, env, op))
+ sum += compute_max_hops(env, op);
+ }
+
+ sum += get_result_hops_sum(env, irn);
+
+ return sum;
+}
+
+static ir_node *reg_pressure_select(void *block_env, pset *ready_set)
+{
+ reg_pressure_selector_env_t *env = block_env;
+ ir_node *irn, *res = NULL;
+ int curr_cost = INT_MAX;
+
+ assert(pset_count(ready_set) > 0);
+
+ for(irn = pset_first(ready_set); irn; irn = pset_next(ready_set)) {
+ int costs = reg_pr_costs(env, irn);
+ if(costs <= curr_cost) {
+ res = irn;
+ curr_cost = costs;
+ }
+ }
+
+ pset_insert_ptr(env->already_scheduled, res);
+ return res;
+}
+
+static const list_sched_selector_t reg_pressure_selector_struct = {
+ reg_pressure_graph_init,
+ reg_pressure_block_init,
+ reg_pressure_select,
+ NULL,
+ reg_pressure_block_free,
+ NULL
+};
+
+const list_sched_selector_t *reg_pressure_selector = ®_pressure_selector_struct;
+
+static void list_sched_block(ir_node *block, void *env_ptr);
+
+void list_sched(const struct _arch_isa_t *isa, ir_graph *irg)
+{
+ sched_env_t env;
+ const list_sched_selector_t *selector;
+
+ memset(&env, 0, sizeof(env));
+ selector = env.selector = isa->impl->get_list_sched_selector(isa);
+ env.selector_env = selector->init_graph ? selector->init_graph(selector, isa, irg) : NULL;
+ env.irg = irg;
+
+ /* Assure, that the out edges are computed */
+ edges_assure(irg);
+
+ /* Schedule each single block. */
+ irg_block_walk_graph(irg, list_sched_block, NULL, &env);