X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbecopyopt.c;h=8b0f6d000282c7e20bb6fb22fce923370fe61552;hb=71dc2f5649c2c7024756568d87e8aa19a0136cf3;hp=1b1c52b0274998812e91cbb5c58e826ba55c3fdd;hpb=4794cb5f95f18ed6afee5c1cc33aaf5f39d3e4a2;p=libfirm diff --git a/ir/be/becopyopt.c b/ir/be/becopyopt.c index 1b1c52b02..8b0f6d000 100644 --- a/ir/be/becopyopt.c +++ b/ir/be/becopyopt.c @@ -31,7 +31,7 @@ #include "becopystat.h" -#define QUICK_AND_DIRTY_HACK +#undef QUICK_AND_DIRTY_HACK /****************************************************************************** _____ _ @@ -43,7 +43,7 @@ ******************************************************************************/ -static firm_dbg_module_t *dbg = NULL; +DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) void be_copy_opt_init(void) { } @@ -53,7 +53,7 @@ copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, int (*get_costs)(ir_node int len; copy_opt_t *co; - dbg = firm_dbg_register("ir.be.copyopt"); + FIRM_DBG_REGISTER(dbg, "ir.be.copyopt"); co = xcalloc(1, sizeof(*co)); co->cenv = chordal_env; @@ -390,10 +390,12 @@ static int compare_ous(const void *k1, const void *k2) { return u2_has_constr - u1_has_constr; /* Now check, whether the two units are connected */ +#if 0 for (i=0; inode_count; ++i) for (o=0; onode_count; ++o) if (u1->nodes[i] == u2->nodes[o]) return 0; +#endif /* After all, the sort key decides. Greater keys come first. */ return u2->sort_key - u1->sort_key; @@ -404,27 +406,38 @@ static int compare_ous(const void *k1, const void *k2) { * Sort the ou's according to constraints and their sort_key */ static void co_sort_units(copy_opt_t *co) { - int i, count = 0; - unit_t *tmp, *ou, **ous; + int i, count = 0, costs; + unit_t *ou, **ous; /* get the number of ous, remove them form the list and fill the array */ list_for_each_entry(unit_t, ou, &co->units, units) count++; ous = alloca(count * sizeof(*ous)); + costs = co_get_max_copy_costs(co); + i = 0; - list_for_each_entry_safe(unit_t, ou, tmp, &co->units, units) { + list_for_each_entry(unit_t, ou, &co->units, units) ous[i++] = ou; - list_del(&ou->units); - } - assert(count == i); + INIT_LIST_HEAD(&co->units); + + assert(count == i && list_empty(&co->units)); + + for (i=0; inodes[0]); qsort(ous, count, sizeof(*ous), compare_ous); + ir_printf("\n\n"); + for (i=0; inodes[0]); + /* reinsert into list in correct order */ for (i=0; iunits, &co->units); + + assert(costs == co_get_max_copy_costs(co)); } #endif