X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedtrace.c;h=1e38a7accd2e018e172d32eda2c472d74420227c;hb=34e3b8d50bce639e760da7233524a4db85c80290;hp=58e7604dc64c37f9a1d8e9863efc66d380285f0f;hpb=f8f2653ab58755a60aa9b4a9f226343687d1bc90;p=libfirm diff --git a/ir/be/beschedtrace.c b/ir/be/beschedtrace.c index 58e7604dc..1e38a7acc 100644 --- a/ir/be/beschedtrace.c +++ b/ir/be/beschedtrace.c @@ -1,20 +1,6 @@ /* - * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. - * * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. + * Copyright (C) 2012 University of Karlsruhe. */ /** @@ -22,14 +8,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 +47,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); } /** @@ -230,10 +212,6 @@ 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; } @@ -252,15 +230,6 @@ static sched_timestep_t latency(trace_env_t *env, ir_node *pred, int pred_cycle, if (is_Proj(curr)) return 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 - return 1; } @@ -270,7 +239,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 +280,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 +358,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 +380,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 +488,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 +504,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 +513,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 +521,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 +531,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 +553,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 +616,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 +661,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)); @@ -745,7 +699,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);