put timers in a global var for now, until this is solved cleaner
[libfirm] / ir / be / bechordal_main.c
index ff1de1c..eeb28d0 100644 (file)
@@ -211,6 +211,7 @@ static void memory_operand_walker(ir_node *irn, void *env) {
        if (get_irn_n_edges(irn) == 0) {
                sched_remove(irn);
                set_irn_n(irn, be_pos_Reload_mem, new_Bad());
+               set_irn_n(irn, be_pos_Reload_frame, new_Bad());
        }
 }
 
@@ -419,7 +420,7 @@ static void pre_spill(const arch_isa_t *isa, int cls_idx, post_spill_env_t *pse)
 /**
  * Perform things which need to be done per register class after spilling.
  */
-static void post_spill(post_spill_env_t *pse) {
+static void post_spill(post_spill_env_t *pse, int iteration) {
        be_chordal_env_t    *chordal_env = &pse->cenv;
        be_irg_t            *birg        = pse->birg;
        ir_graph            *irg         = birg->irg;
@@ -442,9 +443,15 @@ static void post_spill(post_spill_env_t *pse) {
        }
 #endif /* FIRM_STATISTICS */
 
-       check_for_memory_operands(chordal_env);
-
-       be_abi_fix_stack_nodes(birg->abi, birg->lv);
+       /*
+               If we have a backend provided spiller, post spill is
+               called in a loop after spilling for each register class.
+               But we only need to fix stack nodes once in this case.
+       */
+       if (iteration == 0) {
+               check_for_memory_operands(chordal_env);
+               be_abi_fix_stack_nodes(birg->abi, birg->lv);
+       }
 
        BE_TIMER_PUSH(ra_timer.t_verify);
 
@@ -574,12 +581,12 @@ static void be_ra_chordal_main(be_irg_t *birg)
                        pre_spill(isa, j, &pse);
 
                        BE_TIMER_PUSH(ra_timer.t_spill);
-                       be_do_spill(&pse.cenv);
+                       be_do_spill(birg, pse.cls);
                        BE_TIMER_POP(ra_timer.t_spill);
 
                        dump(BE_CH_DUMP_SPILL, irg, pse.cls, "-spill", dump_ir_block_graph_sched);
 
-                       post_spill(&pse);
+                       post_spill(&pse, 0);
                }
        }
        else {
@@ -602,7 +609,7 @@ static void be_ra_chordal_main(be_irg_t *birg)
                dump(BE_CH_DUMP_SPILL, irg, NULL, "-spill", dump_ir_block_graph_sched);
 
                for (j = 0; j < m; ++j) {
-                       post_spill(&pse[j]);
+                       post_spill(&pse[j], j);
                }
        }
 
@@ -630,6 +637,7 @@ static void be_ra_chordal_main(be_irg_t *birg)
        dump(BE_CH_DUMP_LOWER, irg, NULL, "-belower-after-ra", dump_ir_block_graph_sched);
 
        obstack_free(&chordal_env.obst, NULL);
+       be_invalidate_liveness(birg);
        BE_TIMER_POP(ra_timer.t_epilog);
 
        BE_TIMER_POP(ra_timer.t_other);