removed unitialized used vartiable
[libfirm] / ir / be / belower.c
index c57d713..6a16a0b 100644 (file)
 #include "ircons.h"
 #include "debug.h"
 #include "irhooks.h"
+#include "xmalloc.h"
 
 #include "bearch.h"
 #include "belower.h"
 #include "benode_t.h"
 #include "besched_t.h"
 #include "bestat.h"
-#include "benodesets.h"
+#include "bessaconstr.h"
+#include "irnodeset.h"
 
 #include "irgmod.h"
 #include "iredges_t.h"
 #include "irgwalk.h"
 
-#ifdef HAVE_MALLOC_H
- #include <malloc.h>
-#endif
-#ifdef HAVE_ALLOCA_H
- #include <alloca.h>
-#endif
-
 #undef KEEP_ALIVE_COPYKEEP_HACK
 
 /* associates op with it's copy and CopyKeep */
 typedef struct {
        ir_node *op;         /* an irn which must be different */
-       pset    *copies;     /* all non-spillable copies of this irn */
+       ir_nodeset_t copies; /* all non-spillable copies of this irn */
        const arch_register_class_t *cls;
 } op_copy_assoc_t;
 
@@ -85,15 +80,6 @@ typedef struct _perm_cycle_t {
        perm_type_t             type;        /**< type (CHAIN or CYCLE) */
 } perm_cycle_t;
 
-static void kill_node(ir_node *irn, int kill_block) {
-       int      i, arity = get_irn_arity(irn);
-       ir_graph *irg     = get_irn_irg(irn);
-
-       for (i = -1; i < arity; ++i) {
-               set_irn_n(irn, i, new_r_Bad(irg));
-       }
-}
-
 /* Compare the two operands */
 static int cmp_op_copy_assoc(const void *a, const void *b) {
        const op_copy_assoc_t *op1 = a;
@@ -347,8 +333,9 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
                        sched_remove(pairs[i].out_node);
 
                        /* reroute the edges from the proj to the argument */
-                       edges_reroute(pairs[i].out_node, pairs[i].in_node, env->birg->irg);
-                       set_irn_n(pairs[i].out_node, 0, new_Bad());
+                       exchange(pairs[i].out_node, pairs[i].in_node);
+                       //edges_reroute(pairs[i].out_node, pairs[i].in_node, env->birg->irg);
+                       //set_irn_n(pairs[i].out_node, 0, new_Bad());
 
                        pairs[i].checked = 1;
                }
@@ -511,8 +498,8 @@ static void lower_perm_node(ir_node *irn, void *walk_env) {
 
        /* remove the perm from schedule */
        if (! keep_perm) {
-               kill_node(irn, 0);
                sched_remove(irn);
+               be_kill_node(irn);
        }
 }
 
@@ -605,22 +592,22 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
 
        /* insert the other different and it's copies into the set */
        key.op         = other_different;
-       key.copies     = NULL;
        entry          = pset_find(op_set, &key, nodeset_hash(other_different));
 
        if (! entry) {
                entry         = obstack_alloc(&env->obst, sizeof(*entry));
-               entry->copies = pset_new_ptr_default();
+               ir_nodeset_init(&entry->copies);
                entry->op     = other_different;
                entry->cls    = cls;
        }
 
        /* insert copy */
-       pset_insert_ptr(entry->copies, cpy);
+       ir_nodeset_insert(&entry->copies, cpy);
 
        /* insert keep in case of CopyKeep */
-       if (be_is_CopyKeep(keep))
-               pset_insert_ptr(entry->copies, keep);
+       if (be_is_CopyKeep(keep)) {
+               ir_nodeset_insert(&entry->copies, keep);
+       }
 
        pset_insert(op_set, entry, nodeset_hash(other_different));
 }
@@ -631,19 +618,16 @@ static void gen_assure_different_pattern(ir_node *irn, ir_node *other_different,
  */
 static void assure_different_constraints(ir_node *irn, constraint_env_t *env) {
        const arch_register_req_t *req;
-       arch_register_req_t       req_temp;
 
-       req = arch_get_register_req(env->birg->main_env->arch_env, &req_temp, irn, -1);
+       req = arch_get_register_req(env->birg->main_env->arch_env, irn, -1);
 
-       if (req) {
-               if (arch_register_req_is(req, should_be_different)) {
-                       gen_assure_different_pattern(irn, req->other_different, env);
-               }
-               else if (arch_register_req_is(req, should_be_different_from_all)) {
-                       int i, n = get_irn_arity(belower_skip_proj(irn));
-                       for (i = 0; i < n; i++) {
-                               gen_assure_different_pattern(irn, get_irn_n(belower_skip_proj(irn), i), env);
-                       }
+       if (arch_register_req_is(req, should_be_different)) {
+               ir_node *different_from = get_irn_n(irn, req->other_different);
+               gen_assure_different_pattern(irn, different_from, env);
+       } else if (arch_register_req_is(req, should_be_different_from_all)) {
+               int i, n = get_irn_arity(belower_skip_proj(irn));
+               for (i = 0; i < n; i++) {
+                       gen_assure_different_pattern(irn, get_irn_n(belower_skip_proj(irn), i), env);
                }
        }
 }
@@ -678,13 +662,14 @@ static void melt_copykeeps(constraint_env_t *cenv) {
                int     idx, num_ck;
                ir_node *cp;
                struct obstack obst;
+               ir_nodeset_iterator_t iter;
                ir_node **ck_arr, **melt_arr;
 
                obstack_init(&obst);
 
                /* collect all copykeeps */
                num_ck = idx = 0;
-               foreach_pset(entry->copies, cp) {
+               foreach_ir_nodeset(&entry->copies, cp, iter) {
                        if (be_is_CopyKeep(cp)) {
                                obstack_grow(&obst, &cp, sizeof(cp));
                                ++num_ck;
@@ -721,7 +706,7 @@ static void melt_copykeeps(constraint_env_t *cenv) {
 
                                        if (j != idx && cur_ck && skip_Proj(get_irn_n(cur_ck, 1)) == ref_mode_T) {
                                                obstack_grow(&obst, &cur_ck, sizeof(cur_ck));
-                                               pset_remove_ptr(entry->copies, cur_ck);
+                                               ir_nodeset_remove(&entry->copies, cur_ck);
                                                DBG((cenv->dbg, LEVEL_1, "\t%+F\n", cur_ck));
                                                ck_arr[j] = NULL;
                                                ++n_melt;
@@ -736,7 +721,7 @@ static void melt_copykeeps(constraint_env_t *cenv) {
                                        continue;
                                }
 
-                               pset_remove_ptr(entry->copies, ref);
+                               ir_nodeset_remove(&entry->copies, ref);
                                sched_remove(ref);
 
                                melt_arr = (ir_node **)obstack_finish(&obst);
@@ -748,7 +733,7 @@ static void melt_copykeeps(constraint_env_t *cenv) {
                                        /* now, we can kill the melted keep, except the */
                                        /* ref one, we still need some information      */
                                        if (melt_arr[j] != ref)
-                                               kill_node(melt_arr[j], 0);
+                                               be_kill_node(melt_arr[j]);
                                }
 
 #ifdef KEEP_ALIVE_COPYKEEP_HACK
@@ -762,7 +747,7 @@ static void melt_copykeeps(constraint_env_t *cenv) {
                                for (j = 1; j <= n_melt; ++j)
                                        be_node_set_reg_class(new_ck, j, entry->cls);
 
-                               pset_insert_ptr(entry->copies, new_ck);
+                               ir_nodeset_insert(&entry->copies, new_ck);
 
                                /* find scheduling point */
                                if (get_irn_mode(ref_mode_T) == mode_T) {
@@ -778,7 +763,7 @@ static void melt_copykeeps(constraint_env_t *cenv) {
                                DBG((cenv->dbg, LEVEL_1, "created %+F, scheduled before %+F\n", new_ck, sched_pt));
 
                                /* finally: kill the reference copykeep */
-                               kill_node(ref, 0);
+                               be_kill_node(ref);
                        }
                }
 
@@ -815,17 +800,18 @@ void assure_constraints(be_irg_t *birg) {
        foreach_pset(cenv.op_set, entry) {
                int     n;
                ir_node *cp;
+               ir_nodeset_iterator_t iter;
+               be_ssa_construction_env_t senv;
 
-               n     = pset_count(entry->copies);
-               nodes = alloca((n + 1) * sizeof(nodes[0]));
+               n     = ir_nodeset_size(&entry->copies);
+               nodes = alloca(n * sizeof(nodes[0]));
 
                /* put the node in an array */
-               n          = 0;
-               nodes[n++] = entry->op;
                DBG((mod, LEVEL_1, "introduce copies for %+F ", entry->op));
 
                /* collect all copies */
-               foreach_pset(entry->copies, cp) {
+               n = 0;
+               foreach_ir_nodeset(&entry->copies, cp, iter) {
                        nodes[n++] = cp;
                        DB((mod, LEVEL_1, ", %+F ", cp));
                }
@@ -833,12 +819,15 @@ void assure_constraints(be_irg_t *birg) {
                DB((mod, LEVEL_1, "\n"));
 
                /* introduce the copies for the operand and it's copies */
-               be_ssa_constr(birg->dom_front, NULL, n, nodes);
-
+               be_ssa_construction_init(&senv, birg);
+               be_ssa_construction_add_copy(&senv, entry->op);
+               be_ssa_construction_add_copies(&senv, nodes, n);
+               be_ssa_construction_fix_users(&senv, entry->op);
+               be_ssa_construction_destroy(&senv);
 
                /* Could be that not all CopyKeeps are really needed, */
                /* so we transform unnecessary ones into Keeps.       */
-               foreach_pset(entry->copies, cp) {
+               foreach_ir_nodeset(&entry->copies, cp, iter) {
                        if (be_is_CopyKeep(cp) && get_irn_n_edges(cp) < 1) {
                                ir_node *keep;
                                int     n = get_irn_arity(cp);
@@ -848,16 +837,17 @@ void assure_constraints(be_irg_t *birg) {
                                sched_add_before(cp, keep);
 
                                /* Set all ins (including the block) of the CopyKeep BAD to keep the verifier happy. */
-                               kill_node(cp, 1);
                                sched_remove(cp);
+                               be_kill_node(cp);
                        }
                }
 
-               del_pset(entry->copies);
+               ir_nodeset_destroy(&entry->copies);
        }
 
        del_pset(cenv.op_set);
        obstack_free(&cenv.obst, NULL);
+       be_invalidate_liveness(birg);
 }