fixed debug output of unary x87 nodes
[libfirm] / ir / be / bechordal_main.c
index f31f097..a7159f9 100644 (file)
@@ -140,6 +140,7 @@ static be_ra_timer_t ra_timer = {
        NULL,
        NULL,
        NULL,
+       NULL,
 };
 
 #ifdef WITH_LIBCORE
@@ -173,16 +174,17 @@ static const lc_opt_enum_int_items_t lower_perm_stat_items[] = {
 };
 
 static const lc_opt_enum_int_items_t dump_items[] = {
-       { "spill",    BE_CH_DUMP_SPILL     },
-       { "live",     BE_CH_DUMP_LIVE      },
-       { "color",    BE_CH_DUMP_COLOR     },
-       { "copymin",  BE_CH_DUMP_COPYMIN   },
-       { "ssadestr", BE_CH_DUMP_SSADESTR  },
-       { "tree",     BE_CH_DUMP_TREE_INTV },
-       { "constr",   BE_CH_DUMP_CONSTR    },
-       { "lower",    BE_CH_DUMP_LOWER     },
-       { "appel",    BE_CH_DUMP_APPEL     },
-       { "all",      BE_CH_DUMP_ALL       },
+       { "spill",      BE_CH_DUMP_SPILL      },
+       { "live",       BE_CH_DUMP_LIVE       },
+       { "color",      BE_CH_DUMP_COLOR      },
+       { "copymin",    BE_CH_DUMP_COPYMIN    },
+       { "ssadestr",   BE_CH_DUMP_SSADESTR   },
+       { "tree",       BE_CH_DUMP_TREE_INTV  },
+       { "constr",     BE_CH_DUMP_CONSTR     },
+       { "lower",      BE_CH_DUMP_LOWER      },
+       { "spillslots", BE_CH_DUMP_SPILLSLOTS },
+       { "appel",      BE_CH_DUMP_APPEL      },
+       { "all",        BE_CH_DUMP_ALL        },
        { NULL, 0 }
 };
 
@@ -230,6 +232,9 @@ static const lc_opt_table_entry_t be_chordal_options[] = {
        { NULL }
 };
 
+extern void be_spill_remat_register_options(lc_opt_entry_t *ent);
+
+
 static void be_ra_chordal_register_options(lc_opt_entry_t *grp)
 {
        static int run_once = 0;
@@ -244,6 +249,9 @@ static void be_ra_chordal_register_options(lc_opt_entry_t *grp)
 
        co_register_options(chordal_grp);
        be_java_coal_register_options(chordal_grp);
+#ifdef WITH_ILP
+       be_spill_remat_register_options(chordal_grp);
+#endif
 }
 #endif /* WITH_LIBCORE */
 
@@ -377,6 +385,7 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                ra_timer.t_epilog  = lc_timer_register("ra_epilog",   "regalloc epilog");
                ra_timer.t_live    = lc_timer_register("ra_liveness", "be liveness");
                ra_timer.t_spill   = lc_timer_register("ra_spill",    "spiller");
+               ra_timer.t_spillslots = lc_timer_register("ra_spillslots",    "spillslots");
                ra_timer.t_color   = lc_timer_register("ra_color",    "graph coloring");
                ra_timer.t_ifg     = lc_timer_register("ra_ifg",      "interference graph");
                ra_timer.t_copymin = lc_timer_register("ra_copymin",  "copy minimization");
@@ -388,6 +397,7 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                LC_STOP_AND_RESET_TIMER(ra_timer.t_epilog);
                LC_STOP_AND_RESET_TIMER(ra_timer.t_live);
                LC_STOP_AND_RESET_TIMER(ra_timer.t_spill);
+               LC_STOP_AND_RESET_TIMER(ra_timer.t_spillslots);
                LC_STOP_AND_RESET_TIMER(ra_timer.t_color);
                LC_STOP_AND_RESET_TIMER(ra_timer.t_ifg);
                LC_STOP_AND_RESET_TIMER(ra_timer.t_copymin);
@@ -435,9 +445,6 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
 
        /* Perform the following for each register class. */
        for (j = 0, m = arch_isa_get_n_reg_class(isa); j < m; ++j) {
-               //FILE *f;
-               copy_opt_t *co = NULL;
-
                chordal_env.cls           = arch_isa_get_reg_class(isa, j);
                chordal_env.border_heads  = pmap_create();
                chordal_env.ignore_colors = bitset_malloc(chordal_env.cls->n_regs);
@@ -482,7 +489,9 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                    );
 
                dump(BE_CH_DUMP_SPILL, irg, chordal_env.cls, "-spill", dump_ir_block_graph_sched);
+
                check_for_memory_operands(&chordal_env);
+
                be_abi_fix_stack_nodes(bi->abi, chordal_env.lv);
 
                BE_TIMER_PUSH(ra_timer.t_verify);
@@ -577,7 +586,23 @@ static be_ra_timer_t *be_ra_chordal_main(const be_irg_t *bi)
                bitset_free(chordal_env.ignore_colors);
        }
 
+       BE_TIMER_PUSH(ra_timer.t_spillslots);
+
        be_coalesce_spillslots(&chordal_env);
+       dump(BE_CH_DUMP_SPILLSLOTS, irg, NULL, "-spillslots", dump_ir_block_graph_sched);
+
+       BE_TIMER_POP(ra_timer.t_spillslots);
+
+       BE_TIMER_PUSH(ra_timer.t_verify);
+
+       /* verify spillslots */
+       if (options.vrfy_option == BE_CH_VRFY_WARN) {
+               be_verify_spillslots(main_env->arch_env, irg);
+       }
+       else if (options.vrfy_option == BE_CH_VRFY_ASSERT) {
+               assert(be_verify_spillslots(main_env->arch_env, irg) && "Spillslot verification failed");
+       }
+       BE_TIMER_POP(ra_timer.t_verify);
 
        BE_TIMER_PUSH(ra_timer.t_epilog);