X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedtrace.c;h=0308ebf9c7343859780db41594662f84c7e802ed;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=8c31a44ad9e6a7f3cb2d5bc7f6bc9b2ef184c098;hpb=a09efb2ccc91c6d720aa6aa8c5f7e3c562528b2a;p=libfirm diff --git a/ir/be/beschedtrace.c b/ir/be/beschedtrace.c index 8c31a44ad..0308ebf9c 100644 --- a/ir/be/beschedtrace.c +++ b/ir/be/beschedtrace.c @@ -22,7 +22,6 @@ * @brief Implements a trace scheduler as presented in Muchnik[TM]. * @author Michael Beck * @date 28.08.2006 - * @version $Id$ */ #include "config.h" @@ -525,10 +524,10 @@ static trace_env_t *trace_init(ir_graph *irg) env->curr_time = 0; env->sched_info = NEW_ARR_F(trace_irn_t, nn); - env->liveness = be_liveness(irg); + env->liveness = be_get_irg_liveness(irg); FIRM_DBG_REGISTER(env->dbg, "firm.be.sched.trace"); - be_liveness_assure_chk(env->liveness); + be_assure_live_chk(irg); memset(env->sched_info, 0, nn * sizeof(*(env->sched_info))); return env; @@ -541,7 +540,6 @@ static trace_env_t *trace_init(ir_graph *irg) static void trace_free(void *data) { trace_env_t *env = (trace_env_t*)data; - be_liveness_free(env->liveness); DEL_ARR_F(env->sched_info); free(env); } @@ -570,14 +568,13 @@ static ir_node *basic_selection(ir_nodeset_t *ready_set) /** * The muchnik selector. */ -static ir_node *muchnik_select(void *block_env, ir_nodeset_t *ready_set, ir_nodeset_t *live_set) +static ir_node *muchnik_select(void *block_env, ir_nodeset_t *ready_set) { trace_env_t *env = (trace_env_t*)block_env; ir_nodeset_t mcands, ecands; ir_nodeset_iterator_t iter; sched_timestep_t max_delay = 0; ir_node *irn; - (void) live_set; /* calculate the max delay of all candidates */ foreach_ir_nodeset(ready_set, irn, iter) { @@ -658,15 +655,18 @@ static void sched_muchnik(ir_graph *irg) /** * Execute the heuristic function. */ -static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns, ir_nodeset_t *lv) +static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns) { trace_env_t *trace_env = (trace_env_t*)block_env; ir_node *irn, *cand = NULL; int max_prio = INT_MIN; int cur_prio = INT_MIN; - int cur_pressure = ir_nodeset_size(lv); - int reg_fact, cand_reg_fact; + int reg_fact; ir_nodeset_iterator_t iter; + /* Note: register pressure calculation needs an overhaul, you need correct + * tracking for each register class indidually and weight by each class + int cur_pressure = ir_nodeset_size(lv); */ + int cur_pressure = 1; /* prefer instructions which can be scheduled early */ #define PRIO_TIME 3 @@ -689,7 +689,6 @@ static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns, ir_nodeset_t int sign = rdiff < 0; int chg = (rdiff < 0 ? -rdiff : rdiff) << PRIO_CHG_PRESS; - /* reg_fact = chg << cur_pressure; */ reg_fact = chg * cur_pressure; if (reg_fact < chg) reg_fact = INT_MAX - 2; @@ -705,7 +704,6 @@ static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns, ir_nodeset_t if (cur_prio > max_prio) { cand = irn; max_prio = cur_prio; - cand_reg_fact = reg_fact; } DBG((trace_env->dbg, LEVEL_4, "checked NODE %+F\n", irn)); @@ -744,7 +742,7 @@ static void sched_heuristic(ir_graph *irg) be_list_sched_graph(irg, &heuristic_selector); } -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_sched_trace); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_sched_trace) void be_init_sched_trace(void) { be_register_scheduler("heur", sched_heuristic);