fix cltd
[libfirm] / ir / be / becopyilp2.c
index 42921e8..52a36f6 100644 (file)
  *
  *             x_nc, y_ij \in N,   w_ij \in R^+
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif /* HAVE_CONFIG_H */
-
-#include "firm_config.h"
 
 #ifdef WITH_ILP
 
@@ -60,7 +56,8 @@
 #include "irgwalk.h"
 #include "becopyilp_t.h"
 #include "beifg_t.h"
-#include "besched_t.h"
+#include "besched.h"
+#include "bemodule.h"
 
 #define DEBUG_LVL 1
 
@@ -87,13 +84,13 @@ static void build_coloring_cstr(ilp_env_t *ienv) {
                        bitset_pos_t col;
                        int cst_idx;
                        const arch_register_req_t *req;
-                       int curr_node_color = get_irn_col(ienv->co, irn);
+                       int curr_node_color = get_irn_col(irn);
                        int node_nr = (int)get_irn_idx(irn);
                        local_env_t *lenv = ienv->env;
 
                        pmap_insert(lenv->nr_2_irn, INT_TO_PTR(node_nr), irn);
 
-                       req = arch_get_register_req(ienv->co->aenv, irn, -1);
+                       req = arch_get_register_req_out(irn);
 
                        bitset_clear_all(colors);
 
@@ -129,16 +126,17 @@ static void build_coloring_cstr(ilp_env_t *ienv) {
                }
 }
 
-static void build_interference_cstr(ilp_env_t *ienv) {
-       lpp_t *lpp        = ienv->lp;
-       local_env_t *lenv = ienv->env;
-       be_ifg_t *ifg     = ienv->co->cenv->ifg;
-       int n_colors      = lenv->n_colors;
-       int i, col;
-
-       void *iter = be_ifg_cliques_iter_alloca(ifg);
-       ir_node **clique = alloca(sizeof(*clique) * n_colors);
-       int size;
+static void build_interference_cstr(ilp_env_t *ienv)
+{
+       lpp_t       *lpp      = ienv->lp;
+       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);
+       ir_node    **clique   = ALLOCAN(ir_node*, n_colors);
+       int          size;
+       int          col;
+       int          i;
 
        char buf[16];
 
@@ -190,12 +188,12 @@ static void build_affinity_cstr(ilp_env_t *ienv) {
 
                root = curr->nodes[0];
                root_nr = (int) get_irn_idx(root);
-               root_col = get_irn_col(ienv->co, root);
+               root_col = get_irn_col(root);
 
                for (i = 1; i < curr->node_count; ++i) {
                        arg = curr->nodes[i];
                        arg_nr = (int) get_irn_idx(arg);
-                       arg_col = get_irn_col(ienv->co, arg);
+                       arg_col = get_irn_col(arg);
 
                        /* add a new affinity variable */
                        y_idx = lpp_add_var(ienv->lp, name_cdd_sorted(buf, 'y', root_nr, arg_nr), lpp_binary, curr->costs[i]);
@@ -232,7 +230,7 @@ static int compare_edge_t(const void *k1, const void *k2, size_t size) {
 
 #define HASH_EDGE(e) (hash_irn((e)->n1) ^ hash_irn((e)->n2))
 
-static INLINE edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
+static inline edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
        edge_t new_edge;
 
        if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@ -246,7 +244,7 @@ static INLINE edge_t *add_edge(set *edges, ir_node *n1, ir_node *n2, int *counte
        return set_insert(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
 }
 
-static INLINE edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2) {
+static inline edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2) {
        edge_t new_edge;
 
        if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@ -259,7 +257,7 @@ static INLINE edge_t *find_edge(set *edges, ir_node *n1, ir_node *n2) {
        return set_find(edges, &new_edge, sizeof(new_edge), HASH_EDGE(&new_edge));
 }
 
-static INLINE void remove_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
+static inline void remove_edge(set *edges, ir_node *n1, ir_node *n2, int *counter) {
        edge_t new_edge, *e;
 
        if (PTR_TO_INT(n1) < PTR_TO_INT(n2)) {
@@ -296,7 +294,7 @@ static void build_clique_star_cstr(ilp_env_t *ienv) {
                set *edges;
                int i, o, n_nodes, n_edges;
 
-               if (arch_irn_is(ienv->co->aenv, aff->irn, ignore))
+               if (arch_irn_is_ignore(aff->irn))
                        continue;
 
                obstack_init(&ob);
@@ -305,7 +303,7 @@ static void build_clique_star_cstr(ilp_env_t *ienv) {
                /* get all affinity neighbours */
                n_nodes = 0;
                co_gs_foreach_neighb(aff, nbr) {
-                       if (!arch_irn_is(ienv->co->aenv, nbr->irn, ignore)) {
+                       if (!arch_irn_is_ignore(nbr->irn)) {
                                obstack_ptr_grow(&ob, nbr->irn);
                                ++n_nodes;
                        }
@@ -409,7 +407,7 @@ static void extend_path(ilp_env_t *ienv, pdeq *path, const ir_node *irn) {
        if (pdeq_contains(path, irn))
                return;
 
-       if (arch_irn_is(ienv->co->aenv, irn, ignore))
+       if (arch_irn_is_ignore(irn))
                return;
 
        /* insert the new irn */
@@ -418,8 +416,8 @@ static void extend_path(ilp_env_t *ienv, pdeq *path, const ir_node *irn) {
 
 
        /* check for forbidden interferences */
-       len = pdeq_len(path);
-       curr_path = alloca(len * sizeof(*curr_path));
+       len       = pdeq_len(path);
+       curr_path = ALLOCAN(ir_node*, len);
        pdeq_copyl(path, (const void **)curr_path);
 
        for (i=1; i<len; ++i)
@@ -500,16 +498,14 @@ static void ilp2_build(ilp_env_t *ienv) {
 
 static void ilp2_apply(ilp_env_t *ienv) {
        local_env_t *lenv = ienv->env;
-       double *sol;
-       lpp_sol_state_t state;
-       int i, count;
+       int i;
 
        /* first check if there was sth. to optimize */
        if (lenv->first_x_var >= 0) {
+               int              count = lenv->last_x_var - lenv->first_x_var + 1;
+               double          *sol   = XMALLOCN(double, count);
+               lpp_sol_state_t  state = lpp_get_solution(ienv->lp, sol, lenv->first_x_var, lenv->last_x_var);
 
-               count = lenv->last_x_var - lenv->first_x_var + 1;
-               sol = xmalloc(count * sizeof(sol[0]));
-               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);
                        assert(state >= lpp_feasible && "The solution should at least be feasible!");
@@ -544,6 +540,17 @@ static void ilp2_apply(ilp_env_t *ienv) {
 #endif
 }
 
+void be_init_copyilp2(void)
+{
+       static co_algo_info copyheur = {
+               co_solve_ilp2, 1
+       };
+
+       be_register_copyopt("ilp", &copyheur);
+}
+
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyilp2);
+
 int co_solve_ilp2(copy_opt_t *co) {
        lpp_sol_state_t sol_state;
        ilp_env_t *ienv;
@@ -560,7 +567,7 @@ 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->aenv, co->cls, my.normal_colors);
+       arch_put_non_ignore_regs(co->cls, my.normal_colors);
        my.n_colors = bitset_popcnt(my.normal_colors);
 
        ienv = new_ilp_env(co, ilp2_build, ilp2_apply, &my);
@@ -575,7 +582,7 @@ int co_solve_ilp2(copy_opt_t *co) {
 
 #else /* WITH_ILP */
 
-static INLINE void only_that_you_can_compile_without_WITH_ILP_defined(void) {
+static inline void only_that_you_can_compile_without_WITH_ILP_defined(void) {
 }
 
 #endif /* WITH_ILP */