I was annoyed by the compiler warnings about implicit conversions.
[libfirm] / ir / be / bepbqpcoloring.c
index dc9fe03..606aa25 100644 (file)
@@ -61,7 +61,7 @@
 #include "matrix.h"
 #include "vector.h"
 #include "vector_t.h"
-#include "heuristical.h"
+#include "heuristical_co.h"
 #include "pbqp_t.h"
 #include "html_dumper.h"
 #include "pbqp_node_t.h"
@@ -83,6 +83,7 @@ typedef struct _be_pbqp_alloc_env_t {
        pbqp_matrix                                     *aff_matrix_template;
        plist_t                                         *rpeo;
        unsigned                                        *restr_nodes;
+       unsigned                                        *ife_edge_num;
        be_chordal_env_t                        *env;
 } be_pbqp_alloc_env_t;
 
@@ -154,7 +155,8 @@ static void create_pbqp_node(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *irn)
        pbqp_alloc_env->restr_nodes[get_irn_idx(irn)] = cntConstrains;
 }
 
-static void insert_ife_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_node, ir_node *trg_node) {
+static void insert_ife_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_node, ir_node *trg_node)
+{
        pbqp                                            *pbqp                = pbqp_alloc_env->pbqp_inst;
        const arch_register_class_t *cls                 = pbqp_alloc_env->cls;
        pbqp_matrix                             *ife_matrix_template = pbqp_alloc_env->ife_matrix_template;
@@ -162,6 +164,10 @@ static void insert_ife_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_no
 
        if(get_edge(pbqp, get_irn_idx(src_node), get_irn_idx(trg_node)) == NULL) {
 
+               /* increase ife edge counter */
+               pbqp_alloc_env->ife_edge_num[get_irn_idx(src_node)]++;
+               pbqp_alloc_env->ife_edge_num[get_irn_idx(trg_node)]++;
+
                /* do useful optimization to speed up pbqp solving (we can do this because we know our matrix) */
                if(get_free_regs(restr_nodes, cls, src_node) == 1 && get_free_regs(restr_nodes, cls, trg_node) == 1) {
                        unsigned src_idx = vector_get_min_index(get_node(pbqp, get_irn_idx(src_node))->costs);
@@ -186,7 +192,8 @@ static void insert_ife_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_no
        }
 }
 
-static void inser_afe_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_node, ir_node *trg_node, int pos) {
+static void inser_afe_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_node, ir_node *trg_node, int pos)
+{
        pbqp                                            *pbqp             = pbqp_alloc_env->pbqp_inst;
        const arch_register_class_t *cls              = pbqp_alloc_env->cls;
        unsigned                                        *restr_nodes      = pbqp_alloc_env->restr_nodes;
@@ -234,7 +241,8 @@ static void inser_afe_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_nod
        }
 }
 
-static void create_affinity_edges(ir_node *irn, void *env) {
+static void create_affinity_edges(ir_node *irn, void *env)
+{
        be_pbqp_alloc_env_t         *pbqp_alloc_env   = env;
        const arch_register_class_t *cls              = pbqp_alloc_env->cls;
        const arch_register_req_t   *req              = arch_get_register_req_out(irn);
@@ -285,7 +293,8 @@ static void create_affinity_edges(ir_node *irn, void *env) {
        }
 }
 
-static void create_pbqp_coloring_instance(ir_node *block, void *data) {
+static void create_pbqp_coloring_instance(ir_node *block, void *data)
+{
        be_pbqp_alloc_env_t         *pbqp_alloc_env     = data;
        be_lv_t                     *lv                 = pbqp_alloc_env->lv;
        const arch_register_class_t *cls                = pbqp_alloc_env->cls;
@@ -381,10 +390,10 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) {
 
                                // insert proj node into priority queue (descending by the number of interference edges)
                                if(get_free_regs(restr_nodes, cls, proj) <= 4/*bitset_is_set(restr_nodes, get_irn_idx(proj))*/) {
-                                       pqueue_put(restr_nodes_queue, proj, pbqp_node_get_degree(get_node(pbqp_inst, get_irn_idx(proj))));
+                                       pqueue_put(restr_nodes_queue, proj, pbqp_alloc_env->ife_edge_num[get_irn_idx(proj)]);
                                }
                                else {
-                                       pqueue_put(queue,proj, pbqp_node_get_degree(get_node(pbqp_inst, get_irn_idx(proj))));
+                                       pqueue_put(queue,proj, pbqp_alloc_env->ife_edge_num[get_irn_idx(proj)]);
                                }
                        }
 
@@ -428,7 +437,8 @@ static void create_pbqp_coloring_instance(ir_node *block, void *data) {
        del_pqueue(restr_nodes_queue);
 }
 
-static void insert_perms(ir_node *block, void *data) {
+static void insert_perms(ir_node *block, void *data)
+{
        /*
         * Start silent in the start block.
         * The silence remains until the first barrier is seen.
@@ -460,7 +470,8 @@ static void insert_perms(ir_node *block, void *data) {
        }
 }
 
-void be_pbqp_coloring(be_chordal_env_t *env) {
+void be_pbqp_coloring(be_chordal_env_t *env)
+{
        ir_graph                      *irg  = env->irg;
        be_irg_t                      *birg = env->birg;
        const arch_register_class_t   *cls  = env->cls;
@@ -470,13 +481,12 @@ void be_pbqp_coloring(be_chordal_env_t *env) {
        be_lv_t *lv;
 
 #if TIMER
-       ir_timer_t *t_ra_pbqp_alloc_create    = ir_timer_register("be_pbqp_alloc_create", "pbqp alloc create");
-       ir_timer_t *t_ra_pbqp_alloc_solve     = ir_timer_register("be_pbqp_alloc_solve", "pbqp alloc solve");
-       ir_timer_t *t_ra_pbqp_alloc_create_aff  = ir_timer_register("be_pbqp_alloc_create_aff", "pbqp alloc create aff");
+       ir_timer_t *t_ra_pbqp_alloc_create     = ir_timer_new();
+       ir_timer_t *t_ra_pbqp_alloc_solve      = ir_timer_new();
+       ir_timer_t *t_ra_pbqp_alloc_create_aff = ir_timer_new();
 
        printf("#### ----- === Allocating registers of %s (%s) ===\n", cls->name, get_entity_name(get_irg_entity(irg)));
 #endif
-
        lv = be_assure_liveness(birg);
        be_liveness_assure_sets(lv);
        be_liveness_assure_chk(lv);
@@ -502,6 +512,7 @@ void be_pbqp_coloring(be_chordal_env_t *env) {
        pbqp_alloc_env.ignored_regs = bitset_malloc(colors_n);
        pbqp_alloc_env.rpeo                     = plist_new();
        pbqp_alloc_env.restr_nodes  = XMALLOCNZ(unsigned, get_irg_last_idx(irg));
+       pbqp_alloc_env.ife_edge_num = XMALLOCNZ(unsigned, get_irg_last_idx(irg));
        pbqp_alloc_env.env                      = env;
        be_put_ignore_regs(birg, cls, pbqp_alloc_env.ignored_regs);                             /* get ignored registers */
 
@@ -589,9 +600,12 @@ void be_pbqp_coloring(be_chordal_env_t *env) {
 
 
 #if TIMER
-       printf("%-20s: %8.3lf msec\n" , ir_timer_get_description(t_ra_pbqp_alloc_create), (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_create) / 1000.0);
-       printf("%-20s: %8.3lf msec\n" , ir_timer_get_description(t_ra_pbqp_alloc_solve), (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_solve) / 1000.0);
-       printf("%-20s: %8.3lf msec\n" , ir_timer_get_description(t_ra_pbqp_alloc_create_aff), (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_create_aff) / 1000.0);
+       printf("%-20s: %8.3lf msec\n", "pbqp alloc create",
+              (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_create) / 1000.0);
+       printf("%-20s: %8.3lf msec\n", "pbqp alloc solve",
+              (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_solve) / 1000.0);
+       printf("%-20s: %8.3lf msec\n", "pbqp alloc create aff",
+              (double)ir_timer_elapsed_usec(t_ra_pbqp_alloc_create_aff) / 1000.0);
 #endif
 
 
@@ -603,13 +617,15 @@ void be_pbqp_coloring(be_chordal_env_t *env) {
        free_pbqp(pbqp_alloc_env.pbqp_inst);
        plist_free(pbqp_alloc_env.rpeo);
        xfree(pbqp_alloc_env.restr_nodes);
+       xfree(pbqp_alloc_env.ife_edge_num);
 }
 
 
 /**
  * Initializes this module.
  */
-void be_init_pbqp_coloring(void) {
+void be_init_pbqp_coloring(void)
+{
        lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
        lc_opt_entry_t *ra_grp = lc_opt_get_grp(be_grp, "ra");
        lc_opt_entry_t *chordal_grp = lc_opt_get_grp(ra_grp, "chordal");