array: Add and use NEW_ARR_FZ().
[libfirm] / ir / be / beschedtrace.c
index 0a12e91..8c84bfb 100644 (file)
  * @brief       Implements a trace scheduler as presented in Muchnik[TM].
  * @author      Michael Beck
  * @date        28.08.2006
- * @version     $Id$
  */
 #include "config.h"
 
 #include <stdlib.h>
 
 #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));