#include "irtools.h"
#include "irgwalk.h"
#include "benode_t.h"
-
+#include "array_t.h"
// XXX there is no one time init for schedulers
-#define NORMAL_DBG
+//#define NORMAL_DBG
+#include "irprintf.h"
static int must_be_scheduled(const ir_node* const irn)
{
const irn_cost_pair* const a1 = a;
const irn_cost_pair* const b1 = b;
- int ret;
- if (is_irn_forking(a1->irn)) {
- ret = 1;
- } else if (is_irn_forking(b1->irn)) {
- ret = -1;
- } else {
- ret = b1->cost - a1->cost;
- //ret = a1->cost - b1->cost;
- }
+ int ret = b1->cost - a1->cost;
+ if (ret == 0)
+ ret = (int)get_irn_idx(a1->irn) - (int)get_irn_idx(b1->irn);
#if defined NORMAL_DBG
- ir_fprintf(stderr, "%+F %s %+F\n", a1->irn, ret < 0 ? "<" : ret > 0 ? ">" : "=", b1->irn);
+ ir_fprintf(stderr, "cost %+F %s %+F\n", a1->irn, ret < 0 ? "<" : ret > 0 ? ">" : "=", b1->irn);
#endif
return ret;
}
flag_and_cost* fc = get_irn_link(irn);
ir_node* block = get_nodes_block(irn);
int arity = get_irn_arity(irn);
+ ir_node* last;
int n_res;
int cost;
int n_op_res = 0;
}
cost = 0;
+ last = 0;
for (i = 0; i < arity; ++i) {
- if (get_irn_mode(fc->costs[i].irn) == mode_M) continue;
- if (arch_irn_is(cur_arch_env, fc->costs[i].irn, ignore)) continue;
+ ir_node* op = fc->costs[i].irn;
+ if (op == last) continue;
+ if (get_irn_mode(op) == mode_M) continue;
+ if (arch_irn_is(cur_arch_env, op, ignore)) continue;
cost = MAX(fc->costs[i].cost + n_op_res, cost);
+ last = op;
++n_op_res;
}
n_res = count_result(irn);
int arity = get_irn_arity(irn);
int i;
- if (irn_visited(irn)) return sched;
- if (is_End(irn)) return sched;
+ if (irn_visited_else_mark(irn)) return sched;
+ if (is_End(irn)) return sched;
if (!is_Phi(irn) && !be_is_Keep(irn)) {
for (i = 0; i < arity; ++i) {
}
}
- mark_irn_visited(irn);
ARR_APP1(ir_node*, sched, irn);
return sched;
}
{
const irn_cost_pair* const a1 = a;
const irn_cost_pair* const b1 = b;
- int ret = b1->cost - a1->cost;
+ int ret;
+ if (is_irn_forking(a1->irn)) {
+ ret = 1;
+ } else if (is_irn_forking(b1->irn)) {
+ ret = -1;
+ } else {
+ ret = b1->cost - a1->cost;
+ if (ret == 0) {
+ /* place live-out nodes later */
+ ret = (count_result(a1->irn) != 0) - (count_result(b1->irn) != 0);
+ }
+ }
#if defined NORMAL_DBG
- ir_fprintf(stderr, "%+F %s %+F\n", a1->irn, ret < 0 ? "<" : ret > 0 ? ">" : "=", b1->irn);
+ ir_fprintf(stderr, "root %+F %s %+F\n", a1->irn, ret < 0 ? "<" : ret > 0 ? ">" : "=", b1->irn);
#endif
return ret;
}