* @brief Chordal register allocation.
* @author Sebastian Hack
* @date 08.12.2004
- * @version $Id$
*/
#include "config.h"
#include "list.h"
#include "bitset.h"
#include "raw_bitset.h"
-#include "iterator.h"
#include "bipartite.h"
#include "hungarian.h"
#include "irdump.h"
#include "irdom.h"
#include "irtools.h"
-#include "irbitset.h"
#include "debug.h"
#include "iredges.h"
int *assignment;
pmap *partners;
int i, n_alloc;
- size_t col;
- const ir_edge_t *edge;
ir_node *perm = NULL;
//int match_res, cost;
be_chordal_env_t *env = alloc_env->chordal_env;
* Perms inserted before the constraint handling phase are considered to be
* correctly precolored. These Perms arise during the ABI handling phase.
*/
- if (!insn->has_constraints)
+ if (!insn->has_constraints || is_Phi(irn))
goto end;
n_regs = env->cls->n_regs;
DBG((dbg, LEVEL_2, "\tsetting %+F to register %s\n", irn, reg->name));
}
- irn = (ir_node*)pmap_get(partners, alloc_nodes[i]);
+ irn = pmap_get(ir_node, partners, alloc_nodes[i]);
if (irn != NULL) {
arch_set_irn_register(irn, reg);
(void) pset_hinsert_ptr(alloc_env->pre_colored, irn);
DBG((dbg, LEVEL_2, "\tchecking reg of %+F: %s\n", proj, reg ? reg->name : "<none>"));
if (reg == NULL) {
- col = get_next_free_reg(alloc_env, bs);
+ size_t const col = get_next_free_reg(alloc_env, bs);
reg = arch_register_for_index(env->cls, col);
bitset_set(bs, reg->index);
arch_set_irn_register(proj, reg);
struct list_head *head = get_block_border_head(env, block);
be_lv_t *lv = be_get_irg_liveness(env->irg);
- const ir_node *irn;
- border_t *b;
- int idx;
-
bitset_clear_all(colors);
bitset_clear_all(live);
bitset_clear_all(in_colors);
* Since their colors have already been assigned (The dominators were
* allocated before), we have to mark their colors as used also.
*/
- be_lv_foreach(lv, block, be_lv_state_in, idx) {
- irn = be_lv_get_irn(lv, block, idx);
+ be_lv_foreach(lv, block, be_lv_state_in, irn) {
if (has_reg_class(env, irn)) {
const arch_register_t *reg = arch_get_irn_register(irn);
int col;
{
be_chordal_alloc_env_t env;
char buf[256];
- be_lv_t *lv;
const arch_register_class_t *cls = chordal_env->cls;
- int colors_n = arch_register_class_n_regs(cls);
- ir_graph *irg = chordal_env->irg;
-
- lv = be_assure_liveness(irg);
- be_liveness_assure_sets(lv);
- be_liveness_assure_chk(lv);
+ int colors_n = arch_register_class_n_regs(cls);
+ ir_graph *irg = chordal_env->irg;
+ be_assure_live_sets(irg);
assure_doms(irg);
env.chordal_env = chordal_env;
env.in_colors = bitset_alloca(colors_n);
env.pre_colored = pset_new_ptr_default();
+ be_timer_push(T_SPLIT);
+
+ if (chordal_env->opts->dump_flags & BE_CH_DUMP_SPLIT) {
+ snprintf(buf, sizeof(buf), "%s-split", chordal_env->cls->name);
+ dump_ir_graph(chordal_env->irg, buf);
+ }
+
+ be_timer_pop(T_SPLIT);
+
be_timer_push(T_CONSTR);
/* Handle register targeting constraints */
del_pset(env.pre_colored);
}
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_chordal);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_chordal)
void be_init_chordal(void)
{
static be_ra_chordal_coloring_t coloring = {