fixed precedence constraint
[libfirm] / ir / be / becopyheur2.c
index 780974a..10ae5b6 100644 (file)
@@ -9,10 +9,8 @@
 #include "config.h"
 #endif
 
-#ifdef WITH_LIBCORE
 #include <libcore/lc_opts.h>
 #include <libcore/lc_opts_enum.h>
-#endif /* WITH_LIBCORE */
 
 #include <stdlib.h>
 #include <limits.h>
@@ -30,6 +28,7 @@
 #include "irprintf.h"
 #include "irtools.h"
 
+#include "bemodule.h"
 #include "beabi.h"
 #include "benode_t.h"
 #include "becopyopt.h"
 #define DUMP_CLOUD  4
 #define DUMP_ALL    2 * DUMP_CLOUD - 1
 
-static int    dump_flags      = 0;
-static int    subtree_iter    = 4;
-static int    max_depth       = 20;
-static double constr_factor   = 0.9;
+static unsigned dump_flags      = 0;
+static int      subtree_iter    = 4;
+static int      max_depth       = 20;
+static double   constr_factor   = 0.9;
 
 /* Options using libcore */
-#ifdef WITH_LIBCORE
-
 static const lc_opt_enum_mask_items_t dump_items[] = {
        { "before",  DUMP_BEFORE },
        { "after",   DUMP_AFTER  },
@@ -62,19 +59,24 @@ static lc_opt_enum_mask_var_t dump_var = {
 };
 
 static const lc_opt_table_entry_t options[] = {
-       LC_OPT_ENT_ENUM_MASK("dump", "dump ifg before, after or after each cloud",             &dump_var),
-       LC_OPT_ENT_INT      ("iter", "iterations for subtree nodes (standard: 3)",             &subtree_iter),
+       LC_OPT_ENT_ENUM_MASK("dump", "dump ifg cloud",                                         &dump_var),
+       LC_OPT_ENT_INT      ("iter", "iterations for subtree nodes",                           &subtree_iter),
        LC_OPT_ENT_DBL      ("cf",   "factor of constraint importance (between 0.0 and 1.0)",  &constr_factor),
-       LC_OPT_ENT_INT      ("max",  "maximum recursion depth (default 20)",                   &max_depth),
+       LC_OPT_ENT_INT      ("max",  "maximum recursion depth",                                &max_depth),
        { NULL }
 };
 
-void be_co2_register_options(lc_opt_entry_t *grp)
+void be_init_copyheur2(void)
 {
-       lc_opt_entry_t *co2_grp = lc_opt_get_grp(grp, "co2");
+       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");
+       lc_opt_entry_t *co2_grp = lc_opt_get_grp(chordal_grp, "co2");
+
        lc_opt_add_table(co2_grp, options);
 }
-#endif
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyheur2);
 
 /*
   ____  _             _
@@ -200,8 +202,8 @@ static void *co2_irn_init(phase_t *ph, ir_node *irn, void *data)
 
 static int cmp_clouds_gt(const void *a, const void *b)
 {
-       const co2_cloud_t **p = a;
-       const co2_cloud_t **q = b;
+       const co2_cloud_t * const *p = a;
+       const co2_cloud_t * const *q = b;
        double c = CLOUD_WEIGHT(*p);
        double d = CLOUD_WEIGHT(*q);
        return QSORT_CMP(d, c);
@@ -403,7 +405,6 @@ static int recolor(co2_t *env, ir_node *irn, col_cost_pair_t *col_list, struct l
        be_ifg_t *ifg      = env->co->cenv->ifg;
        co2_irn_t *ci      = get_co2_irn(env, irn);
        int res            = 0;
-       int n_aff          = 0;
 
        int i;
 
@@ -703,7 +704,6 @@ static int coalesce_top_down(co2_cloud_irn_t *ci, int child_nr, int depth)
        INIT_LIST_HEAD(&changed);
        for(i = 0; i < (best_col < 0 ? n_regs : n_iter); ++i) {
                col_t col    = seq[i].col;
-               int costs    = seq[i].costs;
                int add_cost = !is_root && col != parent_col ? ci->mst_costs : 0;
 
                int subtree_costs, sum_costs;
@@ -867,7 +867,6 @@ static void process_cloud(co2_cloud_t *cloud)
        int *mst_edges = xmalloc(cloud->n_memb * cloud->n_memb * sizeof(mst_edges[0]));
        pdeq *q;
 
-       struct list_head changed;
        edge_t *edges;
        int i;
        int best_col;
@@ -956,7 +955,7 @@ static void process_cloud(co2_cloud_t *cloud)
 
        DBG((env->dbg, LEVEL_3, "mst:\n"));
        for(i = 0; i < cloud->n_memb; ++i) {
-               co2_cloud_irn_t *ci = cloud->seq[i];
+               DEBUG_ONLY(co2_cloud_irn_t *ci = cloud->seq[i]);
                DBG((env->dbg, LEVEL_3, "\t%+F -> %+F\n", ci->inh.irn, ci->mst_parent->inh.irn));
        }
 
@@ -1030,7 +1029,7 @@ static void process(co2_t *env)
                co2_cloud_irn_t *ci = get_co2_cloud_irn(env, a->irn);
 
                if(!ci->cloud) {
-                       co2_cloud_t *cloud = new_cloud(env, a);
+                       new_cloud(env, a);
                        n_clouds++;
                }
        }
@@ -1056,7 +1055,8 @@ static void process(co2_t *env)
                        FILE *f;
 
                        ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_cloud_%d.dot", env->co->irg, env->co->cls->name, i);
-                       if(f = fopen(buf, "wt")) {
+                       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);
                        }
@@ -1170,7 +1170,7 @@ static void ifg_dump_node_attr(FILE *f, void *self, ir_node *irn)
                        peri = 2;
 
                if(cci->cloud && cci->cloud->mst_root)
-                       snprintf(buf, sizeof(buf), "%+F", cci->cloud->mst_root->inh.irn);
+                       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,
@@ -1220,7 +1220,7 @@ static be_ifg_dump_dot_cb_t ifg_dot_cb = {
 };
 
 
-void co_solve_heuristic_new(copy_opt_t *co)
+int co_solve_heuristic_new(copy_opt_t *co)
 {
        char buf[256];
        co2_t env;
@@ -1240,7 +1240,8 @@ void co_solve_heuristic_new(copy_opt_t *co)
 
        if(dump_flags & DUMP_BEFORE) {
                ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_before.dot", co->irg, co->cls->name);
-               if(f = fopen(buf, "wt")) {
+               f = fopen(buf, "wt");
+               if (f != NULL) {
                        be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &env);
                        fclose(f);
                }
@@ -1250,7 +1251,8 @@ void co_solve_heuristic_new(copy_opt_t *co)
 
        if(dump_flags & DUMP_AFTER) {
                ir_snprintf(buf, sizeof(buf), "ifg_%F_%s_after.dot", co->irg, co->cls->name);
-               if(f = fopen(buf, "wt")) {
+               f = fopen(buf, "wt");
+               if (f != NULL) {
                        be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &env);
                        fclose(f);
                }
@@ -1258,4 +1260,5 @@ void co_solve_heuristic_new(copy_opt_t *co)
 
        writeback_colors(&env);
        phase_free(&env.ph);
+       return 0;
 }