X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedtrace.c;h=8c84bfb9bbe28a7cd65c229b687c1478887a7466;hb=2cb67d89aafac7737bece78b5837d3d48fb528bc;hp=0a12e91a7ed6eaa8a88c10a1c826b4d1c7a4ed8b;hpb=0df5e0ea5d4d6a566339ac4b93a73719858e81e1;p=libfirm diff --git a/ir/be/beschedtrace.c b/ir/be/beschedtrace.c index 0a12e91a7..8c84bfb9b 100644 --- a/ir/be/beschedtrace.c +++ b/ir/be/beschedtrace.c @@ -22,14 +22,13 @@ * @brief Implements a trace scheduler as presented in Muchnik[TM]. * @author Michael Beck * @date 28.08.2006 - * @version $Id$ */ #include "config.h" #include #include "iredges_t.h" - +#include "beirg.h" #include "besched.h" #include "belistsched.h" #include "benode.h" @@ -62,10 +61,7 @@ typedef struct trace_env { */ static ir_node *get_nodeset_node(const ir_nodeset_t *nodeset) { - ir_nodeset_iterator_t iter; - - ir_nodeset_iterator_init(&iter, nodeset); - return ir_nodeset_iterator_next(&iter); + return ir_nodeset_first(nodeset); } /** @@ -252,11 +248,11 @@ static sched_timestep_t latency(trace_env_t *env, ir_node *pred, int pred_cycle, if (is_Proj(curr)) return 0; +#if 0 /* predecessors Proj's must be skipped */ 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 @@ -270,7 +266,6 @@ static sched_timestep_t latency(trace_env_t *env, ir_node *pred, int pred_cycle, static int get_num_successors(ir_node *irn) { int sum = 0; - const ir_edge_t *edge; if (get_irn_mode(irn) == mode_T) { /* for mode_T nodes: count the users of all Projs */ @@ -312,7 +307,6 @@ static int get_reg_difference(trace_env_t *env, ir_node *irn) if (get_irn_mode(irn) == mode_T) { /* mode_T nodes: num out regs == num Projs with mode datab */ - const ir_edge_t *edge; foreach_out_edge(irn, edge) { ir_node *proj = get_edge_src_irn(edge); if (mode_is_datab(get_irn_mode(proj))) @@ -391,8 +385,6 @@ static void descent(ir_node *root, ir_node *block, ir_node **list, trace_env_t * */ static int is_root(ir_node *root, ir_node *block) { - const ir_edge_t *edge; - foreach_out_edge(root, edge) { ir_node *succ = get_edge_src_irn(edge); @@ -415,7 +407,6 @@ static void trace_preprocess_block(trace_env_t *env, ir_node *block) ir_node *root = NULL, *preord = NULL; ir_node *curr, *irn; int cur_pos; - const ir_edge_t *edge; /* First step: Find the root set. */ foreach_out_edge(block, edge) { @@ -524,12 +515,11 @@ static trace_env_t *trace_init(ir_graph *irg) int nn = get_irg_last_idx(irg); env->curr_time = 0; - env->sched_info = NEW_ARR_F(trace_irn_t, nn); - env->liveness = be_liveness(irg); + env->sched_info = NEW_ARR_FZ(trace_irn_t, nn); + env->liveness = be_get_irg_liveness(irg); FIRM_DBG_REGISTER(env->dbg, "firm.be.sched.trace"); - be_liveness_assure_chk(env->liveness); - memset(env->sched_info, 0, nn * sizeof(*(env->sched_info))); + be_assure_live_chk(irg); return env; } @@ -541,7 +531,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); } @@ -551,9 +540,6 @@ static void trace_free(void *data) */ static ir_node *basic_selection(ir_nodeset_t *ready_set) { - ir_node *irn = NULL; - ir_nodeset_iterator_t iter; - /* assure that branches and constants are executed last */ foreach_ir_nodeset(ready_set, irn, iter) { if (!is_cfop(irn)) { @@ -562,9 +548,7 @@ static ir_node *basic_selection(ir_nodeset_t *ready_set) } /* at last: schedule branches */ - irn = get_nodeset_node(ready_set); - - return irn; + return get_nodeset_node(ready_set); } /** @@ -574,9 +558,7 @@ 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; /* calculate the max delay of all candidates */ foreach_ir_nodeset(ready_set, irn, iter) { @@ -598,6 +580,7 @@ static ir_node *muchnik_select(void *block_env, ir_nodeset_t *ready_set) } /* select a node */ + ir_node *irn; if (ir_nodeset_size(&mcands) == 1) { irn = get_nodeset_node(&mcands); DB((env->dbg, LEVEL_3, "\tirn = %+F, mcand = 1, max_delay = %u\n", irn, max_delay)); @@ -660,11 +643,10 @@ static void sched_muchnik(ir_graph *irg) 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; + ir_node *cand = NULL; int max_prio = INT_MIN; int cur_prio = INT_MIN; - int reg_fact, cand_reg_fact; - ir_nodeset_iterator_t iter; + int reg_fact; /* 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); */ @@ -706,7 +688,6 @@ static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns) 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));