#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
static int do_stats = 0;
static cost_fct_t cost_func = co_get_costs_exec_freq;
static int algo = CO_ALGO_HEUR2;
+static int improve = 1;
#ifdef WITH_LIBCORE
static const lc_opt_enum_mask_items_t dump_items[] = {
};
static const lc_opt_table_entry_t options[] = {
- LC_OPT_ENT_ENUM_INT ("algo", "select copy optimization algo (heur, heur2, heur3, ilp)", &algo_var),
- LC_OPT_ENT_ENUM_FUNC_PTR ("cost", "select a cost function (freq, loop, one)", &cost_func_var),
- LC_OPT_ENT_ENUM_MASK ("dump", "dump ifg before or after copy optimization", &dump_var),
- LC_OPT_ENT_ENUM_MASK ("style", "dump style for ifg dumping", &style_var),
- LC_OPT_ENT_BOOL ("stats", "dump statistics after each optimization", &do_stats),
+ LC_OPT_ENT_ENUM_INT ("algo", "select copy optimization algo (heur, heur2, heur3, ilp)", &algo_var),
+ LC_OPT_ENT_ENUM_FUNC_PTR ("cost", "select a cost function (freq, loop, one)", &cost_func_var),
+ LC_OPT_ENT_ENUM_MASK ("dump", "dump ifg before or after copy optimization", &dump_var),
+ LC_OPT_ENT_ENUM_MASK ("style", "dump style for ifg dumping", &style_var),
+ LC_OPT_ENT_BOOL ("stats", "dump statistics after each optimization", &do_stats),
+ LC_OPT_ENT_BOOL ("improve", "run heur3 before if algo can exploit start solutions", &improve),
{ NULL }
};
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
+
void be_copy_opt_init(void) {
}
|___/
*/
-static co_algo_t *algos[] = {
- void_algo,
- co_solve_heuristic,
- co_solve_heuristic_new,
- co_solve_heuristic_java,
+typedef struct {
+ co_algo_t *algo;
+ const char *name;
+ int can_improve_existing;
+} co_algo_info_t;
+
+static co_algo_info_t algos[] = {
+ { void_algo, "none", 0 },
+ { co_solve_heuristic, "heur1", 0 },
+ { co_solve_heuristic_new, "heur2", 0 },
+ { co_solve_heuristic_java, "heur3", 0 },
#ifdef WITH_ILP
- co_solve_ilp2
+ { co_solve_ilp2, "ilp", 1 },
#endif
+ { NULL, "", 0 }
};
/*
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) {
fclose(f);
}
- algo_func = algos[algo];
+ /* if the algo can improve results, provide an initial solution with heur3 */
+ if(improve && algos[algo].can_improve_existing) {
+ co_complete_stats_t stats;
+
+ /* produce a heuristical solution */
+ co_solve_heuristic_java(co);
+
+ /* do the stats and provide the current costs */
+ co_complete_stats(co, &stats);
+ 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");
int optimizable_costs = after.max_costs - after.inevit_costs;
int 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 %10llu%10llu%10llu", 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("%10llu %5.2f\n", after.costs, (evitable * 100.0) / optimizable_costs);
else
- printf("%10d %5s\n", after.costs, "-");
+ printf("%10llu %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);