#include "becopystat.h"
-#define QUICK_AND_DIRTY_HACK
+#undef QUICK_AND_DIRTY_HACK
/******************************************************************************
_____ _
******************************************************************************/
-static firm_dbg_module_t *dbg = NULL;
+DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
void be_copy_opt_init(void) {
}
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;
return u2_has_constr - u1_has_constr;
/* Now check, whether the two units are connected */
+#if 0
for (i=0; i<u1->node_count; ++i)
for (o=0; o<u2->node_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;
* 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; i<count; ++i)
+ ir_printf("%+F\n", ous[i]->nodes[0]);
qsort(ous, count, sizeof(*ous), compare_ous);
+ ir_printf("\n\n");
+ for (i=0; i<count; ++i)
+ ir_printf("%+F\n", ous[i]->nodes[0]);
+
/* reinsert into list in correct order */
for (i=0; i<count; ++i)
list_add_tail(&ous[i]->units, &co->units);
+
+ assert(costs == co_get_max_copy_costs(co));
}
#endif
} else
return 0;
}
+
+void co_dump_appel_graph(const copy_opt_t *co, FILE *f)
+{
+ be_ifg_t *ifg = co->cenv->ifg;
+
+ ir_node *irn;
+ void *it, *nit;
+ int n;
+
+ it = be_ifg_nodes_iter_alloca(ifg);
+ nit = be_ifg_neighbours_iter_alloca(ifg);
+
+ n = 0;
+ be_ifg_foreach_node(ifg, it, irn) {
+ set_irn_link(irn, INT_TO_PTR(n++));
+ }
+
+ fprintf(f, "%d %d\n", n, co->cls->n_regs);
+
+ be_ifg_foreach_node(ifg, it, irn) {
+ int idx = PTR_TO_INT(get_irn_link(irn));
+ affinity_node_t *a = get_affinity_info(co, irn);
+
+ ir_node *adj;
+
+ be_ifg_foreach_neighbour(ifg, nit, irn, adj) {
+ int adj_idx = PTR_TO_INT(get_irn_link(adj));
+ if(idx < adj_idx)
+ fprintf(f, "%d %d -1\n", idx, adj_idx);
+ }
+
+ if(a) {
+ neighb_t *n;
+
+ co_gs_foreach_neighb(a, n) {
+ int n_idx = PTR_TO_INT(get_irn_link(n->irn));
+ if(idx < n_idx)
+ fprintf(f, "%d %d %d\n", idx, n_idx, n->costs);
+ }
+ }
+ }
+}