sparc: floatingpoint flags producing nodes have 1 cycle delay, add an ad-hoc fix...
[libfirm] / ir / be / bestate.c
index 2a9b067..7f831ea 100644 (file)
@@ -47,6 +47,7 @@
 #include "belive_t.h"
 #include "bemodule.h"
 #include "benode.h"
+#include "beirgmod.h"
 #include "bessaconstr.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
@@ -160,7 +161,7 @@ static void spill_phi(minibelady_env_t *env, ir_node *phi)
        ir_graph     *irg           = get_irn_irg(phi);
        ir_node      *block         = get_nodes_block(phi);
        int           arity         = get_irn_arity(phi);
-       ir_node     **in            = ALLOCAN(ir_node*, arity);
+       ir_node     **phi_in        = ALLOCAN(ir_node*, arity);
        ir_node      *dummy         = new_r_Dummy(irg, mode_M);
        ir_node      *spill_to_kill = NULL;
        spill_info_t *spill_info;
@@ -176,13 +177,14 @@ static void spill_phi(minibelady_env_t *env, ir_node *phi)
 
        /* create a new phi-M with bad preds */
        for (i = 0; i < arity; ++i) {
-               in[i] = dummy;
+               phi_in[i] = dummy;
        }
 
        DBG((dbg, LEVEL_2, "\tcreate Phi-M for %+F\n", phi));
 
        /* create a Phi-M */
-       spill_info->spill = new_r_Phi(block, arity, in, mode_M);
+       spill_info->spill = be_new_Phi(block, arity, phi_in, mode_M, NULL);
+       sched_add_after(block, spill_info->spill);
 
        if (spill_to_kill != NULL) {
                exchange(spill_to_kill, spill_info->spill);
@@ -405,8 +407,9 @@ static void belady(minibelady_env_t *env, ir_node *block)
                }
                /* create a reload to match state if necessary */
                if (need_val != NULL && need_val != current_state) {
+                       ir_node *before = node;
                        DBG((dbg, LEVEL_3, "\t... reloading %+F\n", need_val));
-                       create_reload(env, need_val, node, current_state);
+                       create_reload(env, need_val, before, current_state);
                        current_state = need_val;
                }
 
@@ -599,7 +602,7 @@ void be_assure_state(ir_graph *irg, const arch_register_t *reg, void *func_env,
        obstack_free(&env.obst, NULL);
 }
 
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_state);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_state)
 void be_init_state(void)
 {
        FIRM_DBG_REGISTER(dbg, "firm.be.state");