fixed precedence constraint
[libfirm] / ir / be / becopyopt.c
index 582c4e2..0001f7f 100644 (file)
@@ -7,6 +7,7 @@
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+
 #ifdef HAVE_ALLOCA_H
 #include <alloca.h>
 #endif
@@ -28,7 +29,7 @@
 #include "irphase_t.h"
 #include "irprintf_t.h"
 
-
+#include "bemodule.h"
 #include "bearch.h"
 #include "benode_t.h"
 #include "beutil.h"
 #include "benodesets.h"
 #include "bejavacoal.h"
 #include "bestatevent.h"
+#include "beirg_t.h"
+#include "error.h"
 
-#ifdef WITH_LIBCORE
 #include <libcore/lc_timing.h>
 #include <libcore/lc_opts.h>
-#endif /* WITH_LIBCORE */
+#include <libcore/lc_opts_enum.h>
 
 #define DUMP_BEFORE 1
 #define DUMP_AFTER  2
@@ -63,7 +65,6 @@ static cost_fct_t cost_func   = co_get_costs_exec_freq;
 static unsigned algo          = CO_ALGO_HEUR2;
 static int improve            = 1;
 
-#ifdef WITH_LIBCORE
 static const lc_opt_enum_mask_items_t dump_items[] = {
        { "before",  DUMP_BEFORE },
        { "after",   DUMP_AFTER  },
@@ -134,22 +135,29 @@ extern void be_co_ilp_register_options(lc_opt_entry_t *grp);
 extern void be_co2_register_options(lc_opt_entry_t *grp);
 extern void be_co3_register_options(lc_opt_entry_t *grp);
 
-void co_register_options(lc_opt_entry_t *grp)
+void be_init_copycoal(void)
 {
-       lc_opt_entry_t *co_grp = lc_opt_get_grp(grp, "co");
-       lc_opt_add_table(co_grp, options);
+       lc_opt_entry_t *be_grp = lc_opt_get_grp(firm_opt_get_root(), "be");
+       lc_opt_entry_t *ra_grp = lc_opt_get_grp(be_grp, "ra");
+       lc_opt_entry_t *chordal_grp = lc_opt_get_grp(ra_grp, "chordal");
+       lc_opt_entry_t *co_grp = lc_opt_get_grp(chordal_grp, "co");
 
-       be_co2_register_options(co_grp);
-       be_co3_register_options(co_grp);
-#ifdef WITH_ILP
-       be_co_ilp_register_options(co_grp);
-#endif
+       lc_opt_add_table(co_grp, options);
 }
-#endif
 
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_copycoal);
 
 #undef QUICK_AND_DIRTY_HACK
 
+static int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b)
+{
+       if(env->ifg)
+               return be_ifg_connected(env->ifg, a, b);
+       else
+               return values_interfere(env->birg->lv, a, b);
+}
+
+
 /******************************************************************************
     _____                           _
    / ____|                         | |
@@ -163,9 +171,6 @@ void co_register_options(lc_opt_entry_t *grp)
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
 
-void be_copy_opt_init(void) {
-}
-
 copy_opt_t *new_copy_opt(be_chordal_env_t *chordal_env, cost_fct_t get_costs)
 {
        const char *s1, *s2, *s3;
@@ -1390,11 +1395,23 @@ static co_algo_info_t algos[] = {
 
 */
 
+static FILE *my_open(const be_chordal_env_t *env, const char *prefix, const char *suffix)
+{
+       FILE *result;
+       char buf[1024];
+
+       ir_snprintf(buf, sizeof(buf), "%s%F_%s%s", prefix, env->irg, env->cls->name, suffix);
+       result = fopen(buf, "wt");
+       if(result == NULL) {
+               panic("Couldn't open '%s' for writing.", buf);
+       }
+
+       return result;
+}
+
 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;
@@ -1420,13 +1437,13 @@ void co_driver(be_chordal_env_t *cenv)
 
        /* Dump the interference graph in Appel's format. */
        if(dump_flags & DUMP_APPEL) {
-               FILE *f = be_chordal_open(cenv, "", ".apl");
+               FILE *f = my_open(cenv, "", ".apl");
                co_dump_appel_graph(co, f);
                fclose(f);
        }
 
        if(dump_flags & DUMP_BEFORE) {
-               FILE *f = be_chordal_open(cenv, "", "-before.dot");
+               FILE *f = my_open(cenv, "", "-before.dot");
                co_dump_ifg_dot(co, f, style_flags);
                fclose(f);
        }
@@ -1451,21 +1468,17 @@ void co_driver(be_chordal_env_t *cenv)
 
        algo_func = algos[algo].algo;
 
-#ifdef WITH_LIBCORE
        lc_timer_reset_and_start(timer);
-#endif
 
        was_optimal = algo_func(co);
 
-#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");
+               FILE *f = my_open(cenv, "", "-after.dot");
                co_dump_ifg_dot(co, f, style_flags);
                fclose(f);
        }