X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedtrace.c;h=3c1865c6d809ade72e11e8cb3f4e3d24efa28a86;hb=274626e2d58cfa247b88ee05adaca8906b025d93;hp=956f9df2b4909ddbf5383c03547eb1983c5baacc;hpb=16fc4cdb8f7bc9d203f4e024d0bad50f79867c4f;p=libfirm diff --git a/ir/be/beschedtrace.c b/ir/be/beschedtrace.c index 956f9df2b..3c1865c6d 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" @@ -34,6 +33,7 @@ #include "belistsched.h" #include "benode.h" #include "belive.h" +#include "bemodule.h" /* we need a special mark */ static char _mark; @@ -52,8 +52,6 @@ typedef struct trace_irn { typedef struct trace_env { trace_irn_t *sched_info; /**< trace scheduling information about the nodes */ sched_timestep_t curr_time; /**< current time of the scheduler */ - void *selector_env; /**< the backend selector environment */ - const list_sched_selector_t *selector; /**< the actual backend selector */ be_lv_t *liveness; /**< The liveness for the irg */ DEBUG_ONLY(firm_dbg_module_t *dbg;) } trace_env_t; @@ -228,10 +226,13 @@ static inline void set_irn_critical_path_len(trace_env_t *env, ir_node *n, unsig */ static sched_timestep_t exectime(trace_env_t *env, ir_node *n) { + (void) env; if (be_is_Keep(n) || is_Proj(n)) return 0; +#if 0 if (env->selector->exectime) return env->selector->exectime(env->selector_env, n); +#endif return 1; } @@ -240,6 +241,8 @@ static sched_timestep_t exectime(trace_env_t *env, ir_node *n) */ static sched_timestep_t latency(trace_env_t *env, ir_node *pred, int pred_cycle, ir_node *curr, int curr_cycle) { + (void) pred_cycle; + (void) curr_cycle; /* a Keep hides a root */ if (be_is_Keep(curr)) return exectime(env, pred); @@ -252,8 +255,11 @@ static sched_timestep_t latency(trace_env_t *env, ir_node *pred, int pred_cycle, if (is_Proj(pred)) pred = get_Proj_pred(pred); +#if 0 if (env->selector->latency) return env->selector->latency(env->selector_env, pred, pred_cycle, curr, curr_cycle); +#endif + return 1; } @@ -563,14 +569,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) { @@ -621,11 +626,9 @@ force_mcands: return irn; } -static void *muchnik_init_graph(const list_sched_selector_t *vtab, ir_graph *irg) +static void *muchnik_init_graph(ir_graph *irg) { trace_env_t *env = trace_init(irg); - env->selector = vtab; - env->selector_env = (void*) be_get_irg_arch_env(irg); return (void *)env; } @@ -636,30 +639,35 @@ static void *muchnik_init_block(void *graph_env, ir_node *bl) return graph_env; } -const list_sched_selector_t muchnik_selector = { - muchnik_init_graph, - muchnik_init_block, - muchnik_select, - trace_node_ready, /* node_ready */ - trace_update_time, /* node_selected */ - NULL, /* exectime */ - NULL, /* latency */ - NULL, /* finish_block */ - trace_free /* finish_graph */ -}; +static void sched_muchnik(ir_graph *irg) +{ + static const list_sched_selector_t muchnik_selector = { + muchnik_init_graph, + muchnik_init_block, + muchnik_select, + trace_node_ready, /* node_ready */ + trace_update_time, /* node_selected */ + NULL, /* finish_block */ + trace_free /* finish_graph */ + }; + be_list_sched_graph(irg, &muchnik_selector); +} /** * 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 @@ -682,7 +690,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; @@ -698,7 +705,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)); @@ -723,14 +729,23 @@ static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns, ir_nodeset_t return cand; } -const list_sched_selector_t heuristic_selector = { - muchnik_init_graph, - muchnik_init_block, - heuristic_select, - trace_node_ready, /* node_ready */ - trace_update_time, /* node_selected */ - NULL, /* exectime */ - NULL, /* latency */ - NULL, /* finish_block */ - trace_free /* finish_graph */ -}; +static void sched_heuristic(ir_graph *irg) +{ + static const list_sched_selector_t heuristic_selector = { + muchnik_init_graph, + muchnik_init_block, + heuristic_select, + trace_node_ready, /* node_ready */ + trace_update_time, /* node_selected */ + NULL, /* finish_block */ + trace_free /* finish_graph */ + }; + be_list_sched_graph(irg, &heuristic_selector); +} + +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_sched_trace) +void be_init_sched_trace(void) +{ + be_register_scheduler("heur", sched_heuristic); + be_register_scheduler("muchnik", sched_muchnik); +}