begnuas: let user specify elf variants
[libfirm] / ir / be / becopyheur.c
index 083a06a..165db4a 100644 (file)
@@ -47,6 +47,9 @@
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
+/** Defines an invalid register index. */
+#define NO_COLOR (-1)
+
 #define SEARCH_FREE_COLORS
 
 #define SLOTS_PINNED_GLOBAL 64
@@ -258,7 +261,7 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
        ir_node *sub_res, *curr;
        be_ifg_t *ifg = chordal_env->ifg;
        neighbours_iter_t iter;
-
+       const arch_register_req_t *req;
 
        DBG((dbg, LEVEL_3, "\t    %+F \tcaused col(%+F) \t%2d --> %2d\n", trigger, irn, irn_col, col));
 
@@ -274,13 +277,13 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
                return irn;
        }
 
+       req = arch_get_irn_register_req(irn);
 #ifdef SEARCH_FREE_COLORS
        /* If we resolve conflicts (recursive calls) we can use any unused color.
         * In case of the first call @p col must be used.
         */
        if (irn != trigger) {
                bitset_t *free_cols = bitset_alloca(cls->n_regs);
-               const arch_register_req_t *req;
                ir_node *curr;
                int free_col;
 
@@ -288,7 +291,6 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
                bitset_copy(free_cols, co->cenv->allocatable_regs);
 
                /* Exclude colors not assignable to the irn */
-               req = arch_get_register_req_out(irn);
                if (arch_register_req_is(req, limited)) {
                        bitset_t *limited = bitset_alloca(cls->n_regs);
                        rbitset_copy_to_bitset(req->limited, limited);
@@ -312,7 +314,7 @@ static ir_node *qnode_color_irn(const qnode_t *qn, ir_node *irn, int col, const
 #endif /* SEARCH_FREE_COLORS */
 
        /* If target color is not allocatable changing color is impossible */
-       if (!arch_reg_out_is_allocatable(irn, arch_register_for_index(cls, col))) {
+       if (!arch_reg_is_allocatable(req, arch_register_for_index(cls, col))) {
                DBG((dbg, LEVEL_3, "\t      %+F impossible\n", irn));
                return CHANGE_IMPOSSIBLE;
        }
@@ -398,7 +400,7 @@ static inline void qnode_max_ind_set(qnode_t *qn, const unit_t *ou)
        ir_node **safe, **unsafe;
        int i, o, safe_count, safe_costs, unsafe_count, *unsafe_costs;
        bitset_t *curr, *best;
-       unsigned pos;
+       size_t pos;
        int next, curr_weight, best_weight = 0;
 
        /* assign the nodes into two groups.
@@ -461,7 +463,7 @@ static inline void qnode_max_ind_set(qnode_t *qn, const unit_t *ou)
                                                        goto no_stable_set;
 
                        /* if we arrive here, we have a stable set */
-                       /* compute the weigth of the stable set*/
+                       /* compute the weight of the stable set*/
                        curr_weight = 0;
                        bitset_foreach(curr, pos)
                                curr_weight += unsafe_costs[pos];
@@ -564,7 +566,7 @@ static void ou_optimize(unit_t *ou)
        /* init queue */
        INIT_LIST_HEAD(&ou->queue);
 
-       req              = arch_get_register_req_out(ou->nodes[0]);
+       req              = arch_get_irn_register_req(ou->nodes[0]);
        allocatable_regs = ou->co->cenv->allocatable_regs;
        n_regs           = req->cls->n_regs;
        if (arch_register_req_is(req, limited)) {
@@ -655,7 +657,7 @@ int co_solve_heuristic(copy_opt_t *co)
        return 0;
 }
 
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyheur);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyheur)
 void be_init_copyheur(void)
 {
        static co_algo_info copyheur = {