#include "beinsn_t.h"
#include "besched_t.h"
#include "benodesets.h"
+#include "bejavacoal.h"
#include "bestatevent.h"
+#ifdef WITH_LIBCORE
+#include <libcore/lc_timing.h>
+#include <libcore/lc_opts.h>
+#endif /* WITH_LIBCORE */
+
#define DUMP_BEFORE 1
#define DUMP_AFTER 2
#define DUMP_APPEL 4
{ NULL, 0 }
};
+typedef int (*opt_funcptr)(void);
+
static const lc_opt_enum_func_ptr_items_t cost_func_items[] = {
- { "freq", co_get_costs_exec_freq },
- { "loop", co_get_costs_loop_depth },
- { "one", co_get_costs_all_one },
- { NULL, 0 }
+ { "freq", (opt_funcptr) co_get_costs_exec_freq },
+ { "loop", (opt_funcptr) co_get_costs_loop_depth },
+ { "one", (opt_funcptr) co_get_costs_all_one },
+ { NULL, NULL }
};
static lc_opt_enum_mask_var_t dump_var = {
};
static lc_opt_enum_func_ptr_var_t cost_func_var = {
- &cost_func, cost_func_items
+ (opt_funcptr*) &cost_func, cost_func_items
};
static const lc_opt_table_entry_t options[] = {
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
+
void be_copy_opt_init(void) {
}
void co_driver(be_chordal_env_t *cenv)
{
+#ifdef WITH_LIBCORE
+ lc_timer_t *timer = lc_timer_register("firm.be.copyopt", "runtime");
+#endif
co_complete_stats_t before, after;
copy_opt_t *co;
co_algo_t *algo_func;
co_complete_stats(co, &before);
- be_stat_ev("co_aff_nodes", before.aff_nodes);
- be_stat_ev("co_aff_edges", before.aff_edges);
- be_stat_ev("co_max_costs", before.max_costs);
- be_stat_ev("co_inevit_costs", before.inevit_costs);
- be_stat_ev("co_aff_int", before.aff_int);
+ be_stat_ev_ull("co_aff_nodes", before.aff_nodes);
+ be_stat_ev_ull("co_aff_edges", before.aff_edges);
+ be_stat_ev_ull("co_max_costs", before.max_costs);
+ be_stat_ev_ull("co_inevit_costs", before.inevit_costs);
+ be_stat_ev_ull("co_aff_int", before.aff_int);
- be_stat_ev("co_init_costs", before.costs);
- be_stat_ev("co_init_unsat", before.unsatisfied_edges);
+ be_stat_ev_ull("co_init_costs", before.costs);
+ be_stat_ev_ull("co_init_unsat", before.unsatisfied_edges);
/* Dump the interference graph in Appel's format. */
if(dump_flags & DUMP_APPEL) {
/* do the stats and provide the current costs */
co_complete_stats(co, &stats);
- be_stat_ev("co_prepare_costs", stats.costs);
+ be_stat_ev_ull("co_prepare_costs", stats.costs);
}
+ /* start the JVM here so that it does not tamper the timing. */
+ if(algo == CO_ALGO_HEUR3)
+ be_java_coal_start_jvm();
+
algo_func = algos[algo].algo;
+
+#ifdef WITH_LIBCORE
+ lc_timer_reset_and_start(timer);
+#endif
+
was_optimal = algo_func(co);
- be_stat_ev("co_optimal", was_optimal);
+
+#ifdef WITH_LIBCORE
+ lc_timer_stop(timer);
+ be_stat_ev("co_time", lc_timer_elapsed_msec(timer));
+#endif
+
+ be_stat_ev_ull("co_optimal", was_optimal);
if(dump_flags & DUMP_AFTER) {
FILE *f = be_chordal_open(cenv, "", "-after.dot");
co_complete_stats(co, &after);
if(do_stats) {
- int optimizable_costs = after.max_costs - after.inevit_costs;
- int evitable = after.costs - after.inevit_costs;
+ ulong64 optimizable_costs = after.max_costs - after.inevit_costs;
+ ulong64 evitable = after.costs - after.inevit_costs;
- ir_printf("%30F %10s %10d%10d%10d", cenv->irg, cenv->cls->name, after.max_costs, before.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);
if(optimizable_costs > 0)
- printf("%10d %5.2f\n", after.costs, (evitable * 100.0) / optimizable_costs);
+ printf("%10" ULL_FMT " %5.2f\n", after.costs, (evitable * 100.0) / optimizable_costs);
else
- printf("%10d %5s\n", after.costs, "-");
+ printf("%10" ULL_FMT " %5s\n", after.costs, "-");
}
- be_stat_ev("co_after_costs", after.costs);
- be_stat_ev("co_after_unsat", after.unsatisfied_edges);
+ be_stat_ev_ull("co_after_costs", after.costs);
+ be_stat_ev_ull("co_after_unsat", after.unsatisfied_edges);
co_free_graph_structure(co);
co_free_ou_structure(co);