beinfo: Remove declaration of the non-existent function be_info_duplicate().
[libfirm] / ir / be / bechordal.c
index 1e34f0c..d2b414c 100644 (file)
@@ -32,7 +32,6 @@
 #include "list.h"
 #include "bitset.h"
 #include "raw_bitset.h"
-#include "iterator.h"
 #include "bipartite.h"
 #include "hungarian.h"
 
@@ -55,7 +54,7 @@
 #include "beirgmod.h"
 #include "beifg.h"
 #include "beinsn_t.h"
-#include "bestatevent.h"
+#include "statev_t.h"
 #include "beirg.h"
 #include "beintlive_t.h"
 #include "bera.h"
@@ -67,8 +66,6 @@
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
-#define DUMP_INTERVALS
-
 typedef struct be_chordal_alloc_env_t {
        be_chordal_env_t *chordal_env;
 
@@ -76,8 +73,6 @@ typedef struct be_chordal_alloc_env_t {
        bitset_t *live;        /**< A liveness bitset. */
        bitset_t *tmp_colors;  /**< An auxiliary bitset which is as long as the number of colors in the class. */
        bitset_t *colors;      /**< The color mask. */
-       bitset_t *in_colors;   /**< Colors used by live in values. */
-       int colors_n;          /**< The number of colors. */
 } be_chordal_alloc_env_t;
 
 static int get_next_free_reg(const be_chordal_alloc_env_t *alloc_env, bitset_t *colors)
@@ -89,31 +84,18 @@ static int get_next_free_reg(const be_chordal_alloc_env_t *alloc_env, bitset_t *
        return bitset_next_set(tmp, 0);
 }
 
-static bitset_t *get_decisive_partner_regs(bitset_t *bs, const be_operand_t *o1, const be_operand_t *o2)
+static bitset_t const *get_decisive_partner_regs(be_operand_t const *const o1)
 {
-       bitset_t *res = bs;
-
-       if (!o1) {
-               bitset_copy(bs, o2->regs);
-               return bs;
-       }
-
-       if (!o2) {
-               bitset_copy(bs, o1->regs);
-               return bs;
-       }
+       be_operand_t const *const o2 = o1->partner;
+       assert(!o2 || o1->req->cls == o2->req->cls);
 
-       assert(o1->req->cls == o2->req->cls || ! o1->req->cls || ! o2->req->cls);
-
-       if (bitset_contains(o1->regs, o2->regs)) {
-               bitset_copy(bs, o1->regs);
+       if (!o2 || bitset_contains(o1->regs, o2->regs)) {
+               return o1->regs;
        } else if (bitset_contains(o2->regs, o1->regs)) {
-               bitset_copy(bs, o2->regs);
+               return o2->regs;
        } else {
-               res = NULL;
+               return NULL;
        }
-
-       return res;
 }
 
 static void pair_up_operands(const be_chordal_alloc_env_t *alloc_env, be_insn_t *insn)
@@ -166,23 +148,20 @@ static void pair_up_operands(const be_chordal_alloc_env_t *alloc_env, be_insn_t
        }
 }
 
-static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
+static void handle_constraints(be_chordal_alloc_env_t *alloc_env,
                                    ir_node *irn)
 {
        int n_regs;
-       bitset_t *bs;
        ir_node **alloc_nodes;
        //hungarian_problem_t *bp;
        int *assignment;
        pmap *partners;
        int i, n_alloc;
-       size_t col;
        ir_node *perm = NULL;
        //int match_res, cost;
        be_chordal_env_t *env  = alloc_env->chordal_env;
        void *base             = obstack_base(env->obst);
-       be_insn_t *insn        = chordal_scan_insn(env, irn);
-       ir_node *res           = insn->next_insn;
+       be_insn_t *insn        = be_scan_insn(env, irn);
        bipartite_t *bp;
 
        if (insn->pre_colored) {
@@ -199,7 +178,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
                goto end;
 
        n_regs      = env->cls->n_regs;
-       bs          = bitset_alloca(n_regs);
        alloc_nodes = ALLOCAN(ir_node*, n_regs);
        //bp          = hungarian_new(n_regs, n_regs, 2, HUNGARIAN_MATCH_PERFECT);
        bp          = bipartite_new(n_regs, n_regs);
@@ -251,15 +229,16 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
                        DBG((dbg, LEVEL_2, "\tassociating %+F and %+F\n", op->carrier,
                             partner));
 
-                       bitset_clear_all(bs);
-                       get_decisive_partner_regs(bs, op, op->partner);
+                       bitset_t const *const bs = get_decisive_partner_regs(op);
+                       if (bs) {
+                               DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier, bs));
 
-                       DBG((dbg, LEVEL_2, "\tallowed registers for %+F: %B\n", op->carrier,
-                            bs));
-
-                       bitset_foreach(bs, col) {
-                               //hungarian_add(bp, n_alloc, col, 1);
-                               bipartite_add(bp, n_alloc, col);
+                               bitset_foreach(bs, col) {
+                                       //hungarian_add(bp, n_alloc, col, 1);
+                                       bipartite_add(bp, n_alloc, col);
+                               }
+                       } else {
+                               DBG((dbg, LEVEL_2, "\tallowed registers for %+F: none\n", op->carrier));
                        }
 
                        n_alloc++;
@@ -341,9 +320,8 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
 
        /* Allocate the non-constrained Projs of the Perm. */
        if (perm != NULL) {
-               bitset_clear_all(bs);
-
                /* Put the colors of all Projs in a bitset. */
+               bitset_t *const bs = bitset_alloca(n_regs);
                foreach_out_edge(perm, edge) {
                        ir_node *proj              = get_edge_src_irn(edge);
                        const arch_register_t *reg = arch_get_irn_register(proj);
@@ -360,7 +338,7 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
                        DBG((dbg, LEVEL_2, "\tchecking reg of %+F: %s\n", proj, reg ? reg->name : "<none>"));
 
                        if (reg == NULL) {
-                               col = get_next_free_reg(alloc_env, bs);
+                               size_t const col = get_next_free_reg(alloc_env, bs);
                                reg = arch_register_for_index(env->cls, col);
                                bitset_set(bs, reg->index);
                                arch_set_irn_register(proj, reg);
@@ -376,7 +354,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
 
 end:
        obstack_free(env->obst, base);
-       return res;
 }
 
 /**
@@ -392,7 +369,9 @@ static void constraints(ir_node *bl, void *data)
        ir_node                *irn;
 
        for (irn = sched_first(bl); !sched_is_end(irn);) {
-               irn = handle_constraints(env, irn);
+               ir_node *const next = sched_next(irn);
+               handle_constraints(env, irn);
+               irn = next;
        }
 }
 
@@ -402,21 +381,15 @@ static void assign(ir_node *block, void *env_ptr)
        be_chordal_env_t *env       = alloc_env->chordal_env;
        bitset_t *live              = alloc_env->live;
        bitset_t *colors            = alloc_env->colors;
-       bitset_t *in_colors         = alloc_env->in_colors;
        struct list_head *head      = get_block_border_head(env, block);
        be_lv_t *lv                 = be_get_irg_liveness(env->irg);
 
-       const ir_node *irn;
-       border_t *b;
-       int idx;
-
        bitset_clear_all(colors);
        bitset_clear_all(live);
-       bitset_clear_all(in_colors);
 
        DBG((dbg, LEVEL_4, "Assigning colors for block %+F\n", block));
        DBG((dbg, LEVEL_4, "\tusedef chain for block\n"));
-       list_for_each_entry(border_t, b, head, list) {
+       foreach_border_head(head, b) {
                DBG((dbg, LEVEL_4, "\t%s %+F/%d\n", b->is_def ? "def" : "use",
                                        b->irn, get_irn_idx(b->irn)));
        }
@@ -426,20 +399,16 @@ static void assign(ir_node *block, void *env_ptr)
         * Since their colors have already been assigned (The dominators were
         * allocated before), we have to mark their colors as used also.
         */
-       be_lv_foreach(lv, block, be_lv_state_in, idx) {
-               irn = be_lv_get_irn(lv, block, idx);
-               if (has_reg_class(env, irn)) {
+       be_lv_foreach(lv, block, be_lv_state_in, irn) {
+               if (arch_irn_consider_in_reg_alloc(env->cls, irn)) {
                        const arch_register_t *reg = arch_get_irn_register(irn);
-                       int col;
 
                        assert(reg && "Node must have been assigned a register");
-                       col = arch_register_get_index(reg);
-
                        DBG((dbg, LEVEL_4, "%+F has reg %s\n", irn, reg->name));
 
                        /* Mark the color of the live in value as used. */
+                       int const col = reg->index;
                        bitset_set(colors, col);
-                       bitset_set(in_colors, col);
 
                        /* Mark the value live in. */
                        bitset_set(live, get_irn_idx(irn));
@@ -451,7 +420,7 @@ static void assign(ir_node *block, void *env_ptr)
         * elimination order. So, coloring the definitions from first to last
         * will work.
         */
-       list_for_each_entry_reverse(border_t, b, head, list) {
+       foreach_border_head(head, b) {
                ir_node *irn = b->irn;
                int nr       = get_irn_idx(irn);
                int ignore   = arch_irn_is_ignore(irn);
@@ -477,26 +446,23 @@ static void assign(ir_node *block, void *env_ptr)
                        bitset_set(colors, col);
                        arch_set_irn_register(irn, reg);
 
-                       DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n", arch_register_get_name(reg), col, irn));
+                       DBG((dbg, LEVEL_1, "\tassigning register %s(%d) to %+F\n", reg->name, col, irn));
 
                        assert(!bitset_is_set(live, nr) && "Value's definition must not have been encountered");
                        bitset_set(live, nr);
                } else if (!b->is_def) {
                        /* Clear the color upon a use. */
                        const arch_register_t *reg = arch_get_irn_register(irn);
-                       int col;
 
                        assert(reg && "Register must have been assigned");
 
-                       col = arch_register_get_index(reg);
-
-                       bitset_clear(colors, col);
+                       bitset_clear(colors, reg->index);
                        bitset_clear(live, nr);
                }
        }
 }
 
-void be_ra_chordal_color(be_chordal_env_t *chordal_env)
+static void be_ra_chordal_color(be_chordal_env_t *const chordal_env)
 {
        be_chordal_alloc_env_t env;
        char buf[256];
@@ -509,10 +475,8 @@ void be_ra_chordal_color(be_chordal_env_t *chordal_env)
        assure_doms(irg);
 
        env.chordal_env   = chordal_env;
-       env.colors_n      = colors_n;
        env.colors        = bitset_alloca(colors_n);
        env.tmp_colors    = bitset_alloca(colors_n);
-       env.in_colors     = bitset_alloca(colors_n);
        env.pre_colored   = pset_new_ptr_default();
 
        be_timer_push(T_SPLIT);