simplify and cleanup execfreq API
[libfirm] / ir / be / bechordal.c
index 9b5da2b..ba9df02 100644 (file)
@@ -22,7 +22,6 @@
  * @brief       Chordal register allocation.
  * @author      Sebastian Hack
  * @date        08.12.2004
- * @version     $Id$
  */
 #include "config.h"
 
@@ -33,7 +32,6 @@
 #include "list.h"
 #include "bitset.h"
 #include "raw_bitset.h"
-#include "iterator.h"
 #include "bipartite.h"
 #include "hungarian.h"
 
@@ -44,7 +42,6 @@
 #include "irdump.h"
 #include "irdom.h"
 #include "irtools.h"
-#include "irbitset.h"
 #include "debug.h"
 #include "iredges.h"
 
@@ -178,8 +175,6 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
        int *assignment;
        pmap *partners;
        int i, n_alloc;
-       size_t col;
-       const ir_edge_t *edge;
        ir_node *perm = NULL;
        //int match_res, cost;
        be_chordal_env_t *env  = alloc_env->chordal_env;
@@ -198,7 +193,7 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
         * Perms inserted before the constraint handling phase are considered to be
         * correctly precolored. These Perms arise during the ABI handling phase.
         */
-       if (!insn->has_constraints)
+       if (!insn->has_constraints || is_Phi(irn))
                goto end;
 
        n_regs      = env->cls->n_regs;
@@ -334,7 +329,7 @@ static ir_node *handle_constraints(be_chordal_alloc_env_t *alloc_env,
                        DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", irn, reg->name));
                }
 
-               irn = (ir_node*)pmap_get(partners, alloc_nodes[i]);
+               irn = pmap_get(ir_node, partners, alloc_nodes[i]);
                if (irn != NULL) {
                        arch_set_irn_register(irn, reg);
                        (void) pset_hinsert_ptr(alloc_env->pre_colored, irn);
@@ -363,7 +358,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);
@@ -409,10 +404,6 @@ static void assign(ir_node *block, void *env_ptr)
        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);
@@ -429,8 +420,7 @@ 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);
+       be_lv_foreach(lv, block, be_lv_state_in, irn) {
                if (has_reg_class(env, irn)) {
                        const arch_register_t *reg = arch_get_irn_register(irn);
                        int col;
@@ -503,16 +493,12 @@ void be_ra_chordal_color(be_chordal_env_t *chordal_env)
 {
        be_chordal_alloc_env_t env;
        char buf[256];
-       be_lv_t *lv;
        const arch_register_class_t *cls = chordal_env->cls;
 
-       int colors_n          = arch_register_class_n_regs(cls);
-       ir_graph *irg         = chordal_env->irg;
-
-       lv = be_assure_liveness(irg);
-       be_liveness_assure_sets(lv);
-       be_liveness_assure_chk(lv);
+       int       colors_n = arch_register_class_n_regs(cls);
+       ir_graph *irg      = chordal_env->irg;
 
+       be_assure_live_sets(irg);
        assure_doms(irg);
 
        env.chordal_env   = chordal_env;
@@ -522,6 +508,15 @@ void be_ra_chordal_color(be_chordal_env_t *chordal_env)
        env.in_colors     = bitset_alloca(colors_n);
        env.pre_colored   = pset_new_ptr_default();
 
+       be_timer_push(T_SPLIT);
+
+       if (chordal_env->opts->dump_flags & BE_CH_DUMP_SPLIT) {
+               snprintf(buf, sizeof(buf), "%s-split", chordal_env->cls->name);
+               dump_ir_graph(chordal_env->irg, buf);
+       }
+
+       be_timer_pop(T_SPLIT);
+
        be_timer_push(T_CONSTR);
 
        /* Handle register targeting constraints */