values may die at every use
[libfirm] / ir / be / belistsched.c
index aecf320..b172575 100644 (file)
@@ -138,12 +138,12 @@ static void *trivial_init_block(void *graph_env, ir_node *bl)
 
 static INLINE int must_appear_in_schedule(const list_sched_selector_t *sel, void *block_env, const ir_node *irn)
 {
-       int res = 0;
+       int res = -1;
 
        if(sel->to_appear_in_schedule)
                res = sel->to_appear_in_schedule(block_env, irn);
 
-       return res || to_appear_in_schedule(irn) || be_is_Keep(irn) || be_is_RegParams(irn);
+       return res >= 0 ? res : (to_appear_in_schedule(irn) || be_is_Keep(irn) || be_is_RegParams(irn));
 }
 
 static const list_sched_selector_t trivial_selector_struct = {
@@ -654,6 +654,9 @@ static void add_tuple_projs(block_sched_env_t *env, ir_node *irn)
 
        assert(get_irn_mode(irn) == mode_T && "Mode of node must be tuple");
 
+       if(is_Bad(irn))
+               return;
+
        foreach_out_edge(irn, edge) {
                ir_node *out = edge->src;
 
@@ -696,6 +699,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;
        }
@@ -991,7 +997,7 @@ 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 be_irg_t *birg, int disable_mris)
+void list_sched(const be_irg_t *birg, int enable_mris)
 {
        const arch_env_t *arch_env = birg->main_env->arch_env;
        ir_graph *irg              = birg->irg;
@@ -1003,7 +1009,7 @@ void list_sched(const be_irg_t *birg, int disable_mris)
        /* Assure, that the out edges are computed */
        edges_assure(irg);
 
-       if(!disable_mris)
+       if(enable_mris)
                mris = be_sched_mris_preprocess(birg);
 
        num_nodes = get_irg_last_idx(irg);
@@ -1025,7 +1031,7 @@ void list_sched(const be_irg_t *birg, int disable_mris)
        if (env.selector->finish_graph)
                env.selector->finish_graph(env.selector_env);
 
-       if(!disable_mris)
+       if(enable_mris)
                be_sched_mris_free(mris);
 
        DEL_ARR_F(env.sched_info);