be: let begnuas call be_dbg_method_begin/end
[libfirm] / ir / be / becopyilp2.c
index 8c3abfb..acecf27 100644 (file)
  *  - Clique-star constraints
  *
  *
- *     \min \sum_{ (i,j) \in Q }  w_ij y_ij
+ * \min \sum_{ (i,j) \in Q }  w_ij y_ij
  *
- *             \sum_c x_nc                     =  1                    n \in N, c \in C
+ *     \sum_c x_nc           =  1           n \in N, c \in C
  *
- *             x_nc                            =  0                    n \in N, c \not\in C(n)
+ *     x_nc                  =  0           n \in N, c \not\in C(n)
  *
- *             \sum x_nc                       <= 1                    x_nc \in Clique \in AllCliques,  c \in C
+ *     \sum x_nc            <=  1           x_nc \in Clique \in AllCliques,  c \in C
  *
- *             \sum_{e \in p} y_e      >= 1                    p \in P         path constraints
+ *     \sum_{e \in p} y_e   >=  1           p \in P      path constraints
  *
- *             \sum_{e \in cs} y_e     >= |cs| - 1             cs \in CP       clique-star constraints
+ *     \sum_{e \in cs} y_e  >= |cs| - 1     cs \in CP    clique-star constraints
  *
- *             x_nc, y_ij \in N,   w_ij \in R^+
+ *     x_nc, y_ij \in N,   w_ij \in R^+
  */
 #include "config.h"
 
-#ifdef WITH_ILP
-
 #include "bitset.h"
 #include "raw_bitset.h"
 #include "pdeq.h"
 
-#include "irtools.h"
+#include "util.h"
 #include "irgwalk.h"
 #include "becopyilp_t.h"
-#include "beifg_t.h"
+#include "beifg.h"
 #include "besched.h"
 #include "bemodule.h"
 
 #define DEBUG_LVL 1
 
-typedef struct _local_env_t {
+typedef struct local_env_t {
        double time_limit;
        int first_x_var, last_x_var;
        int n_colors;
@@ -73,16 +71,16 @@ typedef struct _local_env_t {
 static void build_coloring_cstr(ilp_env_t *ienv)
 {
        be_ifg_t *ifg     = ienv->co->cenv->ifg;
-       void *iter        = be_ifg_nodes_iter_alloca(ifg);
+       nodes_iter_t iter;
        bitset_t *colors;
        ir_node *irn;
        char buf[16];
 
        colors = bitset_alloca(arch_register_class_n_regs(ienv->co->cls));
 
-       be_ifg_foreach_node(ifg, iter, irn)
+       be_ifg_foreach_node(ifg, &iter, irn)
                if (!sr_is_removed(ienv->sr, irn)) {
-                       bitset_pos_t col;
+                       size_t col;
                        int cst_idx;
                        const arch_register_req_t *req;
                        int curr_node_color = get_irn_col(irn);
@@ -91,7 +89,7 @@ static void build_coloring_cstr(ilp_env_t *ienv)
 
                        pmap_insert(lenv->nr_2_irn, INT_TO_PTR(node_nr), irn);
 
-                       req = arch_get_register_req_out(irn);
+                       req = arch_get_irn_register_req(irn);
 
                        bitset_clear_all(colors);
 
@@ -106,7 +104,7 @@ static void build_coloring_cstr(ilp_env_t *ienv)
                        cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_equal, 1.0);
 
                        bitset_foreach(colors, col) {
-                               int var_idx = lpp_add_var(ienv->lp, name_cdd(buf, 'x', node_nr, col), lpp_binary, 0.0);
+                               int var_idx = lpp_add_var(ienv->lp, name_cdd(buf, 'x', node_nr, (int)col), lpp_binary, 0.0);
                                lpp_set_start_value(ienv->lp, var_idx, (col == (unsigned) curr_node_color) ? 1.0 : 0.0);
                                lpp_set_factor_fast(ienv->lp, cst_idx, var_idx, 1);
 
@@ -118,7 +116,7 @@ static void build_coloring_cstr(ilp_env_t *ienv)
                        /* add register constraint constraints */
                        bitset_foreach_clear(colors, col) {
                                int cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_equal, 0.0);
-                               int var_idx = lpp_add_var(ienv->lp, name_cdd(buf, 'x', node_nr, col), lpp_binary, 0.0);
+                               int var_idx = lpp_add_var(ienv->lp, name_cdd(buf, 'x', node_nr, (int)col), lpp_binary, 0.0);
                                lpp_set_start_value(ienv->lp, var_idx, 0.0);
                                lpp_set_factor_fast(ienv->lp, cst_idx, var_idx, 1);
 
@@ -133,7 +131,7 @@ static void build_interference_cstr(ilp_env_t *ienv)
        local_env_t *lenv     = ienv->env;
        be_ifg_t    *ifg      = ienv->co->cenv->ifg;
        int          n_colors = lenv->n_colors;
-       void        *iter     = be_ifg_cliques_iter_alloca(ifg);
+       cliques_iter_t iter;
        ir_node    **clique   = ALLOCAN(ir_node*, n_colors);
        int          size;
        int          col;
@@ -142,7 +140,7 @@ static void build_interference_cstr(ilp_env_t *ienv)
        char buf[16];
 
        /* for each maximal clique */
-       be_ifg_foreach_clique(ifg, iter, clique, &size) {
+       be_ifg_foreach_clique(ifg, &iter, clique, &size) {
                int realsize = 0;
 
                for (i=0; i<size; ++i)
@@ -154,7 +152,7 @@ static void build_interference_cstr(ilp_env_t *ienv)
 
                /* for all colors */
                for (col=0; col<n_colors; ++col) {
-                       int cst_idx = lpp_add_cst(lpp, NULL, lpp_less, 1.0);
+                       int cst_idx = lpp_add_cst(lpp, NULL, lpp_less_equal, 1.0);
 
                        /* for each member of this clique */
                        for (i=0; i<size; ++i) {
@@ -203,7 +201,7 @@ static void build_affinity_cstr(ilp_env_t *ienv)
 
                        /* add constraints relating the affinity var to the color vars */
                        for (col=0; col<n_colors; ++col) {
-                               int cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_less, 0.0);
+                               int cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_less_equal, 0.0);
                                root_idx = lpp_get_var_idx(ienv->lp, name_cdd(buf, 'x', root_nr, col));
                                arg_idx  = lpp_get_var_idx(ienv->lp, name_cdd(buf, 'x', arg_nr,  col));
 
@@ -218,7 +216,7 @@ static void build_affinity_cstr(ilp_env_t *ienv)
 /**
  * Helping stuff for build_clique_star_cstr
  */
-typedef struct _edge_t {
+typedef struct edge_t {
        ir_node *n1, *n2;
 } edge_t;
 
@@ -331,8 +329,8 @@ static void build_clique_star_cstr(ilp_env_t *ienv)
                        int growed;
 
                        /* get 2 starting nodes to form a clique */
-                       for (e=set_first(edges); !e->n1; e=set_next(edges))
-                               /*nothing*/ ;
+                       for (e=set_first(edges); !e->n1; e=set_next(edges)) {
+                       }
 
                        /* we could be stepped out of the loop before the set iterated to the end */
                        set_break(edges);
@@ -384,7 +382,7 @@ static void build_clique_star_cstr(ilp_env_t *ienv)
                                int var_idx, cst_idx, center_nr, member_nr;
                                char buf[16];
 
-                               cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_greater, pset_count(clique)-1);
+                               cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_greater_equal, pset_count(clique)-1);
                                center_nr = get_irn_idx(center);
 
                                pset_foreach(clique, member) {
@@ -441,7 +439,7 @@ static void extend_path(ilp_env_t *ienv, pdeq *path, const ir_node *irn)
                /* And a path of length 2 is covered by a clique star constraint. */
                if (len > 2) {
                        /* finally build the constraint */
-                       int cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_greater, 1.0);
+                       int cst_idx = lpp_add_cst(ienv->lp, NULL, lpp_greater_equal, 1.0);
                        for (i=1; i<len; ++i) {
                                char buf[16];
                                int nr_1    = get_irn_idx(curr_path[i-1]);
@@ -494,7 +492,7 @@ static void ilp2_build(ilp_env_t *ienv)
        local_env_t *lenv = ienv->env;
        int lower_bound;
 
-       ienv->lp = new_lpp(ienv->co->name, lpp_minimize);
+       ienv->lp = lpp_new(ienv->co->name, lpp_minimize);
        build_coloring_cstr(ienv);
        build_interference_cstr(ienv);
        build_affinity_cstr(ienv);
@@ -518,7 +516,7 @@ static void ilp2_apply(ilp_env_t *ienv)
                lpp_sol_state_t  state = lpp_get_solution(ienv->lp, sol, lenv->first_x_var, lenv->last_x_var);
 
                if (state != lpp_optimal) {
-                       printf("WARNING %s: Solution state is not 'optimal': %d\n", ienv->co->name, state);
+                       printf("WARNING %s: Solution state is not 'optimal': %d\n", ienv->co->name, (int)state);
                        assert(state >= lpp_feasible && "The solution should at least be feasible!");
                }
 
@@ -551,7 +549,7 @@ static void ilp2_apply(ilp_env_t *ienv)
 #endif
 }
 
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyilp2);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyilp2)
 void be_init_copyilp2(void)
 {
        static co_algo_info copyheur = {
@@ -578,8 +576,8 @@ int co_solve_ilp2(copy_opt_t *co)
 
        my.normal_colors = bitset_alloca(arch_register_class_n_regs(co->cls));
        bitset_clear_all(my.normal_colors);
-       arch_put_non_ignore_regs(co->cls, my.normal_colors);
-       my.n_colors = bitset_popcnt(my.normal_colors);
+       be_put_allocatable_regs(co->irg, co->cls, my.normal_colors);
+       my.n_colors = bitset_popcount(my.normal_colors);
 
        ienv = new_ilp_env(co, ilp2_build, ilp2_apply, &my);
 
@@ -590,11 +588,3 @@ int co_solve_ilp2(copy_opt_t *co)
 
        return sol_state == lpp_optimal;
 }
-
-#else /* WITH_ILP */
-
-static inline void only_that_you_can_compile_without_WITH_ILP_defined(void)
-{
-}
-
-#endif /* WITH_ILP */