bescripts: Copy all common node attributes into the constructor variants.
[libfirm] / ir / be / becopyheur2.c
index 5883053..1d727c0 100644 (file)
@@ -22,7 +22,6 @@
  * @brief       More experiments on coalescing.
  * @author      Sebastian Hack
  * @date        14.04.2006
- * @version     $Id$
  */
 #include "config.h"
 
 #include "util.h"
 #include "irtools.h"
 #include "irnodemap.h"
-
+#include "be_t.h"
 #include "bemodule.h"
 #include "beabi.h"
 #include "benode.h"
 #include "becopyopt.h"
 #include "becopyopt_t.h"
 #include "bechordal_t.h"
-#include "beirg.h"
 
 #define DUMP_BEFORE 1
 #define DUMP_AFTER  2
@@ -179,7 +177,7 @@ typedef struct {
 
 static co2_irn_t *get_co2_irn(co2_t *env, const ir_node *node)
 {
-       co2_irn_t *ci = ir_nodemap_get(&env->map, node);
+       co2_irn_t *ci = ir_nodemap_get(co2_irn_t, &env->map, node);
        if (ci == NULL) {
                ci = OALLOCZ(&env->obst, co2_irn_t);
 
@@ -197,7 +195,7 @@ static co2_irn_t *get_co2_irn(co2_t *env, const ir_node *node)
 
 static co2_cloud_irn_t *get_co2_cloud_irn(co2_t *env, const ir_node *node)
 {
-       co2_cloud_irn_t *ci = ir_nodemap_get(&env->map, node);
+       co2_cloud_irn_t *ci = ir_nodemap_get(co2_cloud_irn_t, &env->map, node);
        if (ci == NULL) {
                ci = OALLOCZ(&env->obst, co2_cloud_irn_t);
 
@@ -335,17 +333,15 @@ static void determine_color_costs(co2_t *env, co2_irn_t *ci, col_cost_pair_t *co
        const ir_node *irn = ci->irn;
        be_ifg_t *ifg      = env->co->cenv->ifg;
        int n_regs         = env->co->cls->n_regs;
-       bitset_t *forb     = bitset_alloca(n_regs);
        affinity_node_t *a = ci->aff;
 
-       size_t elm;
        const ir_node *pos;
        neighbours_iter_t it;
        int i;
 
        /* Put all forbidden colors into the aux bitset. */
-       admissible_colors(env, ci, forb);
-       bitset_flip_all(forb);
+       bitset_t *const admissible = bitset_alloca(n_regs);
+       admissible_colors(env, ci, admissible);
 
        for (i = 0; i < n_regs; ++i) {
                col_costs[i].col   = i;
@@ -353,8 +349,6 @@ static void determine_color_costs(co2_t *env, co2_irn_t *ci, col_cost_pair_t *co
        }
 
        if (a) {
-               neighb_t *n;
-
                co_gs_foreach_neighb(a, n) {
                        if (color_is_fix(env, n->irn)) {
                                col_t col = get_col(env, n->irn);
@@ -378,7 +372,7 @@ static void determine_color_costs(co2_t *env, co2_irn_t *ci, col_cost_pair_t *co
        be_ifg_neighbours_break(&it);
 
        /* Set the costs to infinity for each color which is not allowed at this node. */
-       bitset_foreach(forb, elm) {
+       bitset_foreach_clear(admissible, elm) {
                col_costs[elm].costs  = INT_MAX;
        }
 
@@ -403,16 +397,12 @@ static void single_color_cost(co2_t *env, co2_irn_t *ci, col_t col, col_cost_pai
 
 static void reject_coloring(struct list_head *h)
 {
-       co2_irn_t *pos;
-
        list_for_each_entry(co2_irn_t, pos, h, changed_list)
                pos->tmp_fixed = 0;
 }
 
 static void materialize_coloring(struct list_head *h)
 {
-       co2_irn_t *pos;
-
        list_for_each_entry(co2_irn_t, pos, h, changed_list) {
                pos->orig_col  = pos->tmp_col;
                pos->tmp_fixed = 0;
@@ -623,13 +613,11 @@ static void node_color_badness(co2_cloud_irn_t *ci, int *badness)
        be_ifg_t *ifg  = env->co->cenv->ifg;
        bitset_t *bs   = bitset_alloca(n_regs);
 
-       size_t elm;
        const ir_node *irn;
        neighbours_iter_t it;
 
        admissible_colors(env, &ci->inh, bs);
-       bitset_flip_all(bs);
-       bitset_foreach(bs, elm)
+       bitset_foreach_clear(bs, elm)
                badness[elm] = ci->costs;
 
        /* Use constrained/fixed interfering neighbors to influence the color badness */
@@ -781,7 +769,6 @@ static void populate_cloud(co2_t *env, co2_cloud_t *cloud, affinity_node_t *a, i
        be_ifg_t *ifg       = env->co->cenv->ifg;
        co2_cloud_irn_t *ci = get_co2_cloud_irn(env, a->irn);
        int costs           = 0;
-       neighb_t *n;
 
        if (ci->cloud)
                return;
@@ -825,7 +812,6 @@ static void populate_cloud(co2_t *env, co2_cloud_t *cloud, affinity_node_t *a, i
 static co2_cloud_t *new_cloud(co2_t *env, affinity_node_t *a)
 {
        co2_cloud_t *cloud = OALLOC(&env->obst, co2_cloud_t);
-       co2_cloud_irn_t *ci;
        int i;
 
        DBG((env->dbg, LEVEL_2, "new cloud with %+F\n", a->irn));
@@ -894,7 +880,6 @@ static void process_cloud(co2_cloud_t *cloud)
        obstack_init(&cloud->obst);
        for (i = 0; i < cloud->n_memb; ++i) {
                co2_cloud_irn_t *ci = cloud->seq[i];
-               neighb_t *n;
 
                co_gs_foreach_neighb(ci->inh.aff, n) {
                        co2_cloud_irn_t *ni = get_co2_cloud_irn(cloud->env, n->irn);
@@ -1011,7 +996,6 @@ static void process_cloud(co2_cloud_t *cloud)
 static int cloud_costs(co2_cloud_t *cloud)
 {
        int i, costs = 0;
-       neighb_t *n;
 
        for (i = 0; i < cloud->n_memb; ++i) {
                co2_irn_t *ci = (co2_irn_t *) cloud->seq[i];
@@ -1035,150 +1019,8 @@ static void writeback_colors(co2_t *env)
        }
 }
 
-
-/*
-  ___ _____ ____   ____   ___ _____   ____                        _
- |_ _|  ___/ ___| |  _ \ / _ \_   _| |  _ \ _   _ _ __ ___  _ __ (_)_ __   __ _
-  | || |_ | |  _  | | | | | | || |   | | | | | | | '_ ` _ \| '_ \| | '_ \ / _` |
-  | ||  _|| |_| | | |_| | |_| || |   | |_| | |_| | | | | | | |_) | | | | | (_| |
- |___|_|   \____| |____/ \___/ |_|   |____/ \__,_|_| |_| |_| .__/|_|_| |_|\__, |
-                                                           |_|            |___/
-*/
-
-static const char *get_dot_color_name(size_t col)
-{
-       static const char *const names[] = {
-               "blue",
-               "red",
-               "green",
-               "yellow",
-               "cyan",
-               "magenta",
-               "orange",
-               "chocolate",
-               "beige",
-               "navy",
-               "darkgreen",
-               "darkred",
-               "lightPink",
-               "chartreuse",
-               "lightskyblue",
-               "linen",
-               "pink",
-               "lightslateblue",
-               "mintcream",
-               "red",
-               "darkolivegreen",
-               "mediumblue",
-               "mistyrose",
-               "salmon",
-               "darkseagreen",
-               "mediumslateblue"
-               "moccasin",
-               "tomato",
-               "forestgreen",
-               "darkturquoise",
-               "palevioletred"
-       };
-
-       return col < (sizeof(names)/sizeof(names[0])) ? names[col] : "white";
-}
-
-static const char *get_dot_shape_name(co2_irn_t *ci)
-{
-       const arch_register_req_t *req = arch_get_irn_register_req(ci->irn);
-
-       if (arch_register_req_is(req, limited))
-               return "diamond";
-
-       if (ci->fixed)
-               return "rectangle";
-
-       if (ci->tmp_fixed)
-               return "hexagon";
-
-       return "ellipse";
-}
-
-static void ifg_dump_graph_attr(FILE *f, void *self)
-{
-       (void) self;
-       fprintf(f, "overlay=false");
-}
-
-static int ifg_is_dump_node(void *self, ir_node *irn)
-{
-       const arch_register_req_t *req = arch_get_irn_register_req(irn);
-       (void)self;
-       return !(req->type & arch_register_req_type_ignore);
-}
-
-static void ifg_dump_node_attr(FILE *f, void *self, ir_node *irn)
-{
-       co2_t *env    = (co2_t*)self;
-       co2_irn_t *ci = get_co2_irn(env, irn);
-       int peri      = 1;
-
-       char buf[128] = "";
-
-       if (ci->aff) {
-               co2_cloud_irn_t *cci = (co2_cloud_irn_t*) ci;
-               if (cci->cloud && cci->cloud->mst_root == cci)
-                       peri = 2;
-
-               if (cci->cloud && cci->cloud->mst_root)
-                       ir_snprintf(buf, sizeof(buf), "%+F", cci->cloud->mst_root->inh.irn);
-       }
-
-       ir_fprintf(f, "label=\"%+F%s\" style=filled peripheries=%d color=%s shape=%s", irn, buf, peri,
-               get_dot_color_name(get_col(env, irn)), get_dot_shape_name(ci));
-}
-
-static void ifg_dump_at_end(FILE *file, void *self)
-{
-       co2_t *env = (co2_t*)self;
-       affinity_node_t *a;
-
-       co_gs_foreach_aff_node(env->co, a) {
-               co2_cloud_irn_t *ai = get_co2_cloud_irn(env, a->irn);
-               int idx = get_irn_idx(a->irn);
-               neighb_t *n;
-
-               if (ai->mst_parent != ai)
-                       fprintf(file, "\tn%d -- n%u [style=dotted color=blue arrowhead=normal];\n", idx, get_irn_idx(ai->mst_parent->inh.irn));
-
-               co_gs_foreach_neighb(a, n) {
-                       int nidx = get_irn_idx(n->irn);
-                       co2_cloud_irn_t *ci = get_co2_cloud_irn(env, n->irn);
-
-                       if (idx < nidx) {
-                               const char *color = get_col(env, a->irn) == get_col(env, n->irn) ? "black" : "red";
-                               const char *arr = "arrowhead=dot arrowtail=dot";
-
-                               if (ci->mst_parent == ai)
-                                       arr = "arrowtail=normal";
-                               else if (ai->mst_parent == ci)
-                                       arr = "arrowhead=normal";
-
-                               fprintf(file, "\tn%d -- n%d [label=\"%d\" %s style=dashed color=%s weight=0.01];\n", idx, nidx, n->costs, arr, color);
-                       }
-               }
-       }
-}
-
-static be_ifg_dump_dot_cb_t ifg_dot_cb = {
-       ifg_is_dump_node,
-       ifg_dump_graph_attr,
-       ifg_dump_node_attr,
-       NULL,
-       NULL,
-       ifg_dump_at_end
-};
-
 static void process(co2_t *env)
 {
-       affinity_node_t *a;
-       co2_cloud_t *pos;
        co2_cloud_t **clouds;
        int n_clouds;
        int i;
@@ -1210,19 +1052,6 @@ static void process(co2_t *env)
 
                all_costs   += clouds[i]->costs;
                final_costs += cloud_costs(clouds[i]);
-
-               /* Dump the IFG if the user demanded it. */
-               if (dump_flags & DUMP_CLOUD) {
-                       char buf[256];
-                       FILE *f;
-
-                       ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_cloud_%d.dot", env->co->irg, env->co->cls->name, i);
-                       f = fopen(buf, "wt");
-                       if (f != NULL) {
-                               be_ifg_dump_dot(env->co->cenv->ifg, env->co->irg, f, &ifg_dot_cb, env);
-                               fclose(f);
-                       }
-               }
        }
 
        DB((env->dbg, LEVEL_1, "all costs: %d, init costs: %d, final costs: %d\n", all_costs, init_costs, final_costs));
@@ -1230,11 +1059,9 @@ static void process(co2_t *env)
        xfree(clouds);
 }
 
-int co_solve_heuristic_new(copy_opt_t *co)
+static int co_solve_heuristic_new(copy_opt_t *co)
 {
-       char  buf[256];
        co2_t env;
-       FILE  *f;
 
        ir_nodemap_init(&env.map, co->irg);
        obstack_init(&env.obst);
@@ -1247,26 +1074,8 @@ int co_solve_heuristic_new(copy_opt_t *co)
        FIRM_DBG_REGISTER(env.dbg, "firm.be.co2");
        INIT_LIST_HEAD(&env.cloud_head);
 
-       if (dump_flags & DUMP_BEFORE) {
-               ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_before.dot", co->irg, co->cls->name);
-               f = fopen(buf, "wt");
-               if (f != NULL) {
-                       be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &env);
-                       fclose(f);
-               }
-       }
-
        process(&env);
 
-       if (dump_flags & DUMP_AFTER) {
-               ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_after.dot", co->irg, co->cls->name);
-               f = fopen(buf, "wt");
-               if (f != NULL) {
-                       be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &env);
-                       fclose(f);
-               }
-       }
-
        writeback_colors(&env);
        obstack_free(&env.obst, NULL);
        ir_nodemap_destroy(&env.map);