removed unitialized used vartiable
[libfirm] / ir / be / beilpsched.c
index 31c5242..a6b9d88 100644 (file)
@@ -31,6 +31,7 @@
 #include "debug.h"
 #include "irtools.h"
 #include "irdump.h"
+#include "irprintf.h"
 #include "plist.h"
 #include "irprintf.h"
 
@@ -121,7 +122,7 @@ typedef struct {
 
 /* The ILP scheduling environment */
 typedef struct {
-       phase_t              ph;            /**< The phase */
+       ir_phase             ph;            /**< The phase */
        ir_graph             *irg;          /**< The current irg */
        heights_t            *height;       /**< The heights object of the irg */
        void                 *irg_env;      /**< An environment for the irg scheduling, provided by the backend */
@@ -258,7 +259,7 @@ static int cmp_ilpsched_irn(const void *a, const void *b) {
 /**
  * In case there is no phase information for irn, initialize it.
  */
-static void *init_ilpsched_irn(phase_t *ph, ir_node *irn, void *old) {
+static void *init_ilpsched_irn(ir_phase *ph, ir_node *irn, void *old) {
        be_ilpsched_irn_t *res = old ? old : phase_alloc(ph, sizeof(res[0]));
 
        if (res == old) {
@@ -1097,6 +1098,33 @@ static void create_variables(be_ilpsched_env_t *env, lpp_t *lpp, be_ilpsched_irn
  *
  *******************************************************/
 
+/**
+ * Collect all operands and nodes @p irn depends on.
+ * If there is a Proj within the dependencies, all other Projs of the parent node are added as well.
+ */
+static nodeset *sta_collect_in_deps(ir_node *irn, nodeset *deps) {
+       int i;
+
+       for (i = get_irn_ins_or_deps(irn) - 1; i >= 0; --i) {
+               ir_node *p = get_irn_in_or_dep(irn, i);
+
+               if (is_Proj(p)) {
+                       const ir_edge_t *edge;
+
+                       p = get_Proj_pred(p);
+                       foreach_out_edge(p, edge) {
+                               ir_node *src = get_edge_src_irn(edge);
+                               nodeset_insert(deps, src);
+                       }
+               }
+               else {
+                       nodeset_insert(deps, p);
+               }
+       }
+
+       return deps;
+}
+
 /**
  * Create following ILP constraints:
  * - the assignment constraints:
@@ -1117,10 +1145,12 @@ static void create_assignment_and_precedence_constraints(be_ilpsched_env_t *env,
 
        num_cst_assign = num_cst_prec = num_cst_dead = 0;
        foreach_linked_irns(ba->head_ilp_nodes, irn) {
-               int                  cst, tp_idx, i;
+               int                  cst, tp_idx;
                unsigned             cur_var;
                be_ilpsched_irn_t    *node;
                ilpsched_node_attr_t *na;
+               ir_node              *pred;
+               nodeset              *deps = new_nodeset(16);
 
                node    = get_ilpsched_irn(env, irn);
                na      = get_ilpsched_node_attr(node);
@@ -1144,13 +1174,15 @@ static void create_assignment_and_precedence_constraints(be_ilpsched_env_t *env,
                /* the precedence constraints */
                ilp_timer_push(t_cst_prec);
                bs_block_irns = bitset_clear_all(bs_block_irns);
-               for (i = get_irn_ins_or_deps(irn) - 1; i >= 0; --i) {
-                       ir_node              *pred = skip_normal_Proj(env->arch_env->isa, get_irn_in_or_dep(irn, i));
+
+               deps = sta_collect_in_deps(irn, deps);
+               foreach_nodeset(deps, pred) {
                        unsigned             t_low, t_high, t;
                        be_ilpsched_irn_t    *pred_node;
                        ilpsched_node_attr_t *pna;
                        unsigned             delay;
 
+                       pred = skip_normal_Proj(env->arch_env->isa, pred);
                        if (is_Phi(pred) || block_node->irn != get_nodes_block(pred) || is_NoMem(pred))
                                continue;
 
@@ -1217,6 +1249,7 @@ static void create_assignment_and_precedence_constraints(be_ilpsched_env_t *env,
                                DEL_ARR_F(tmp_var_idx);
                        }
                }
+               del_nodeset(deps);
                ilp_timer_pop();
        }
        DBG((env->dbg, LEVEL_1, "\t%u assignement constraints (%g sec)\n",