* @brief Copy minimization driver.
* @author Daniel Grund
* @date 12.04.2005
- * @version $Id$
*
* Main file for the optimization reducing the copies needed for:
* - Phi coalescing
#include "irprog.h"
#include "irloop_t.h"
#include "iredges_t.h"
-#include "irbitset.h"
-#include "irphase_t.h"
#include "irprintf_t.h"
+#include "irtools.h"
+#include "util.h"
#include "bemodule.h"
#include "bearch.h"
static unsigned dump_flags = 0;
static unsigned style_flags = 0;
-static unsigned do_stats = 0;
+static int do_stats = 0;
static cost_fct_t cost_func = co_get_costs_exec_freq;
static int improve = 1;
{ NULL, 0 }
};
+/**
+ * Flags for dumping the IFG.
+ */
+enum {
+ CO_IFG_DUMP_COLORS = 1 << 0, /**< Dump the graph colored. */
+ CO_IFG_DUMP_LABELS = 1 << 1, /**< Dump node/edge labels. */
+ CO_IFG_DUMP_SHAPE = 1 << 2, /**< Give constrained nodes special shapes. */
+ CO_IFG_DUMP_CONSTR = 1 << 3, /**< Dump the node constraints in the label. */
+};
+
static const lc_opt_enum_mask_items_t style_items[] = {
{ "color", CO_IFG_DUMP_COLORS },
{ "labels", CO_IFG_DUMP_LABELS },
be_add_module_to_list(©opts, name, copyopt);
}
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyopt);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copyopt)
void be_init_copyopt(void)
{
lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
return 0;
}
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copynone);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copynone)
void be_init_copynone(void)
{
static co_algo_info copyheur = {
copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, cost_fct_t get_costs)
{
const char *s1, *s2, *s3;
- int len;
+ size_t len;
copy_opt_t *co;
FIRM_DBG_REGISTER(dbg, "ir.be.copyopt");
if (is_Reg_Phi(irn) || is_Perm_Proj(irn))
return 1;
- req = arch_get_register_req_out(irn);
+ req = arch_get_irn_register_req(irn);
if (is_2addr_code(req))
return 1;
ir_node **safe, **unsafe;
int i, o, safe_count, safe_costs, unsafe_count, *unsafe_costs;
bitset_t *curr;
- unsigned pos;
+ size_t pos;
int curr_weight, best_weight = 0;
/* assign the nodes into two groups.
/* now compute the best set out of the unsafe nodes*/
if (unsafe_count > MIS_HEUR_TRIGGER) {
bitset_t *best = bitset_alloca(unsafe_count);
- /* Heuristik: Greedy trial and error form index 0 to unsafe_count-1 */
+ /* Heuristic: Greedy trial and error form index 0 to unsafe_count-1 */
for (i=0; i<unsafe_count; ++i) {
bitset_set(best, i);
/* check if it is a stable set */
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];
if (get_irn_mode(irn) == mode_T)
return;
- req = arch_get_register_req_out(irn);
+ req = arch_get_irn_register_req(irn);
if (req->cls != co->cls)
return;
if (!co_is_optimizable_root(irn))
int o, arg_pos;
ir_node *arg = get_irn_n(irn, i);
- assert(arch_get_irn_reg_class_out(arg) == co->cls && "Argument not in same register class.");
+ assert(arch_get_irn_reg_class(arg) == co->cls && "Argument not in same register class.");
if (arg == irn)
continue;
if (nodes_interfere(co->cenv, irn, arg)) {
/* Units with constraints come first */
u1_has_constr = 0;
for (i=0; i<u1->node_count; ++i) {
- arch_get_register_req_out(&req, u1->nodes[i]);
+ arch_get_irn_register_req(&req, u1->nodes[i]);
if (arch_register_req_is(&req, limited)) {
u1_has_constr = 1;
break;
u2_has_constr = 0;
for (i=0; i<u2->node_count; ++i) {
- arch_get_register_req_out(&req, u2->nodes[i]);
+ arch_get_irn_register_req(&req, u2->nodes[i]);
if (arch_register_req_is(&req, limited)) {
u2_has_constr = 1;
break;
void co_complete_stats(const copy_opt_t *co, co_complete_stats_t *stat)
{
- bitset_t *seen = bitset_irg_malloc(co->irg);
+ bitset_t *seen = bitset_malloc(get_irg_last_idx(co->irg));
affinity_node_t *an;
memset(stat, 0, sizeof(stat[0]));
co_gs_foreach_aff_node(co, an) {
neighb_t *neigh;
stat->aff_nodes += 1;
- bitset_add_irn(seen, an->irn);
+ bitset_set(seen, get_irn_idx(an->irn));
co_gs_foreach_neighb(an, neigh) {
- if (!bitset_contains_irn(seen, neigh->irn)) {
+ if (!bitset_is_set(seen, get_irn_idx(neigh->irn))) {
stat->aff_edges += 1;
stat->max_costs += neigh->costs;
if (get_irn_mode(irn) == mode_T)
return;
- req = arch_get_register_req_out(irn);
+ req = arch_get_irn_register_req(irn);
if (req->cls != co->cls || arch_irn_is_ignore(irn))
return;
constr[1] = bitset_alloca(co->cls->n_regs);
for (j = 0; j < 2; ++j) {
- const arch_register_req_t *req = arch_get_register_req_out(nodes[j]);
+ const arch_register_req_t *req = arch_get_irn_register_req(nodes[j]);
if (arch_register_req_is(req, limited))
rbitset_copy_to_bitset(req->limited, constr[j]);
else
if (!arch_irn_is_ignore(irn)) {
int idx = node_map[get_irn_idx(irn)];
affinity_node_t *a = get_affinity_info(co, irn);
- const arch_register_req_t *req = arch_get_register_req_out(irn);
+ const arch_register_req_t *req = arch_get_irn_register_req(irn);
ir_node *adj;
if (arch_register_req_is(req, limited)) {
{
co_ifg_dump_t *env = (co_ifg_dump_t*)self;
const arch_register_t *reg = arch_get_irn_register(irn);
- const arch_register_req_t *req = arch_get_register_req_out(irn);
+ const arch_register_req_t *req = arch_get_irn_register_req(irn);
int limited = arch_register_req_is(req, limited);
if (env->flags & CO_IFG_DUMP_LABELS) {
be_ifg_dump_dot(co->cenv->ifg, co->irg, f, &ifg_dot_cb, &cod);
}
-
-void co_solve_park_moon(copy_opt_t *opt)
-{
- (void) opt;
-}
-
/*
__ __ _ ____ _
| \/ | __ _(_)_ __ | _ \ _ __(_)_ _____ _ __
co_complete_stats(co, &after);
if (do_stats) {
- ulong64 optimizable_costs = after.max_costs - after.inevit_costs;
- ulong64 evitable = after.costs - after.inevit_costs;
+ unsigned long long optimizable_costs = after.max_costs - after.inevit_costs;
+ unsigned long long evitable = after.costs - after.inevit_costs;
ir_printf("%30F ", cenv->irg);
- printf("%10s %10" ULL_FMT "%10" ULL_FMT "%10" ULL_FMT, cenv->cls->name, after.max_costs, before.costs, after.inevit_costs);
+ printf("%10s %10llu%10llu%10llu", cenv->cls->name, after.max_costs, before.costs, after.inevit_costs);
if (optimizable_costs > 0)
- printf("%10" ULL_FMT " %5.2f\n", after.costs, (evitable * 100.0) / optimizable_costs);
+ printf("%10llu %5.2f\n", after.costs, (evitable * 100.0) / optimizable_costs);
else
- printf("%10" ULL_FMT " %5s\n", after.costs, "-");
+ printf("%10llu %5s\n", after.costs, "-");
}
/* Dump the interference graph in Appel's format. */