register slots are now automatically allocated together with the $ARCH_attribute
[libfirm] / ir / be / belistsched.c
index 7972a12..47b510a 100644 (file)
 #include "irprintf_t.h"
 #include "array.h"
 #include "debug.h"
+#include "irtools.h"
 
 #include "besched_t.h"
 #include "beutil.h"
 #include "belive_t.h"
 #include "belistsched.h"
+#include "beschedmris.h"
 #include "bearch.h"
 #include "bestat.h"
 
-#define MAX(x,y) ((x) > (y) ? (x) : (y))
-#define MIN(x,y) ((x) < (y) ? (x) : (y))
-
 /**
  * All scheduling info needed per node.
  */
@@ -697,6 +696,9 @@ static int is_root(ir_node *root, ir_node *block) {
 
                if (is_Block(succ))
                        continue;
+               /* Phi nodes are always in "another block */
+               if (is_Phi(succ))
+                       continue;
                if (get_nodes_block(succ) == block)
                        return 0;
        }
@@ -992,10 +994,22 @@ static const list_sched_selector_t reg_pressure_selector_struct = {
 const list_sched_selector_t *reg_pressure_selector = &reg_pressure_selector_struct;
 
 /* List schedule a graph. */
-void list_sched(const arch_env_t *arch_env, ir_graph *irg)
+void list_sched(const be_irg_t *birg, int disable_mris)
 {
+       const arch_env_t *arch_env = birg->main_env->arch_env;
+       ir_graph *irg              = birg->irg;
+
+       int num_nodes;
        sched_env_t env;
-       int num_nodes = get_irg_last_idx(irg);
+       mris_env_t *mris;
+
+       /* Assure, that the out edges are computed */
+       edges_assure(irg);
+
+       if(!disable_mris)
+               mris = be_sched_mris_preprocess(birg);
+
+       num_nodes = get_irg_last_idx(irg);
 
        memset(&env, 0, sizeof(env));
        env.selector   = arch_env->isa->impl->get_list_sched_selector(arch_env->isa);
@@ -1008,14 +1022,14 @@ void list_sched(const arch_env_t *arch_env, ir_graph *irg)
        if (env.selector->init_graph)
                env.selector_env = env.selector->init_graph(env.selector, arch_env, irg);
 
-       /* Assure, that the out edges are computed */
-       edges_assure(irg);
-
        /* Schedule each single block. */
        irg_block_walk_graph(irg, list_sched_block, NULL, &env);
 
        if (env.selector->finish_graph)
                env.selector->finish_graph(env.selector_env);
 
+       if(!disable_mris)
+               be_sched_mris_free(mris);
+
        DEL_ARR_F(env.sched_info);
 }