#include "bechordal_common.h"
#include "bechordal.h"
#include "bechordal_t.h"
+#include "becopyopt_t.h"
#include "beinsn_t.h"
#include "benode.h"
#include "belive.h"
#include "beutil.h"
#include "plist.h"
#include "pqueue.h"
-#include "becopyopt.h"
/* pbqp includes */
#include "kaps.h"
ir_graph *irg; /**< The graph under examination. */
const arch_register_class_t *cls; /**< Current processed register class */
be_lv_t *lv;
- bitset_t *allocatable_regs;
+ bitset_t const *allocatable_regs;
pbqp_matrix_t *ife_matrix_template;
pbqp_matrix_t *aff_matrix_template;
plist_t *rpeo;
} be_pbqp_alloc_env_t;
-#define is_Reg_Phi(irn) (is_Phi(irn) && mode_is_data(get_irn_mode(irn)))
-#define get_Perm_src(irn) (get_irn_n(get_Proj_pred(irn), get_Proj_proj(irn)))
-#define is_Perm_Proj(irn) (is_Proj(irn) && be_is_Perm(get_Proj_pred(irn)))
#define insert_edge(pbqp, src_node, trg_node, template_matrix) (add_edge_costs(pbqp, get_irn_idx(src_node), get_irn_idx(trg_node), pbqp_matrix_copy(pbqp, template_matrix)))
#define get_free_regs(restr_nodes, cls, irn) (arch_register_class_n_regs(cls) - restr_nodes[get_irn_idx(irn)])
static void create_pbqp_node(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *irn)
{
- const arch_register_class_t *cls = pbqp_alloc_env->cls;
- pbqp_t *pbqp_inst = pbqp_alloc_env->pbqp_inst;
- bitset_t *allocatable_regs = pbqp_alloc_env->allocatable_regs;
- unsigned colors_n = arch_register_class_n_regs(cls);
- unsigned cntConstrains = 0;
+ arch_register_class_t const *const cls = pbqp_alloc_env->cls;
+ pbqp_t *const pbqp_inst = pbqp_alloc_env->pbqp_inst;
+ bitset_t const *const allocatable_regs = pbqp_alloc_env->allocatable_regs;
+ unsigned const colors_n = arch_register_class_n_regs(cls);
+ unsigned cntConstrains = 0;
/* create costs vector depending on register constrains */
vector_t *costs_vector = vector_alloc(pbqp_inst, colors_n);
unsigned pos;
unsigned max;
- if (is_Reg_Phi(irn)) { /* Phis */
+ if (is_Phi(irn)) { /* Phis */
for (pos = 0, max = get_irn_arity(irn); pos < max; ++pos) {
ir_node *arg = get_irn_n(irn, pos);
static void insert_perms(ir_node *block, void *data)
{
be_chordal_env_t *env = (be_chordal_env_t*)data;
- ir_node *irn;
- for (irn = sched_first(block); !sched_is_end(irn);) {
- ir_node *const next = sched_next(irn);
- be_insn_t * insn = be_scan_insn(env, irn);
+ sched_foreach_safe(block, irn) {
+ be_insn_t *insn = be_scan_insn(env, irn);
if (insn)
pre_process_constraints(env, &insn);
-
- irn = next;
}
}
pbqp_alloc_env.cls = cls;
pbqp_alloc_env.irg = irg;
pbqp_alloc_env.lv = lv;
- pbqp_alloc_env.allocatable_regs = bitset_malloc(colors_n);
+ pbqp_alloc_env.allocatable_regs = env->allocatable_regs;
pbqp_alloc_env.rpeo = plist_new();
pbqp_alloc_env.restr_nodes = XMALLOCNZ(unsigned, get_irg_last_idx(irg));
pbqp_alloc_env.ife_edge_num = XMALLOCNZ(unsigned, get_irg_last_idx(irg));
pbqp_alloc_env.env = env;
- be_put_allocatable_regs(irg, cls, pbqp_alloc_env.allocatable_regs);
-
/* create costs matrix template for interference edges */
ife_matrix = pbqp_matrix_alloc(pbqp_alloc_env.pbqp_inst, colors_n, colors_n);
#if KAPS_DUMP
fclose(file_before);
#endif
- bitset_free(pbqp_alloc_env.allocatable_regs);
free_pbqp(pbqp_alloc_env.pbqp_inst);
plist_free(pbqp_alloc_env.rpeo);
xfree(pbqp_alloc_env.restr_nodes);