some bugifxes for alloca handling
[libfirm] / ir / be / bechordal_main.c
index a2d0392..30e3691 100644 (file)
@@ -140,6 +140,7 @@ static be_ra_timer_t ra_timer = {
        NULL,
        NULL,
        NULL,
+       NULL,
 };
 
 #ifdef WITH_LIBCORE
@@ -245,6 +246,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 */
 
@@ -378,6 +382,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");
@@ -389,6 +394,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);
@@ -480,8 +486,7 @@ 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_abi_fix_stack_nodes(bi->abi, chordal_env.lv);
 
                BE_TIMER_PUSH(ra_timer.t_verify);
 
@@ -575,9 +580,26 @@ 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(irg);
+       }
+       else if (options.vrfy_option == BE_CH_VRFY_ASSERT) {
+               assert(be_verify_spillslots(irg) && "Spillslot verification failed");
+       }
+       BE_TIMER_POP(ra_timer.t_verify);
+
+       check_for_memory_operands(&chordal_env);
+
        BE_TIMER_PUSH(ra_timer.t_epilog);
 
        dump(BE_CH_DUMP_LOWER, irg, NULL, "-spilloff", dump_ir_block_graph_sched);