X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelistsched.c;h=20642a7522ed8406c48f6c24ead725f5c0eae7f9;hb=904ce4d595c733b7fdfe19a3245fa115f5c1d97f;hp=bffc8855ad5bab2fc37ce80523dc865a805abb47;hpb=1a90f19861b54e47085c18f644260aab97239b32;p=libfirm diff --git a/ir/be/belistsched.c b/ir/be/belistsched.c index bffc8855a..20642a752 100644 --- a/ir/be/belistsched.c +++ b/ir/be/belistsched.c @@ -28,6 +28,7 @@ #include "irprintf_t.h" #include "array.h" #include "debug.h" +#include "irtools.h" #include "besched_t.h" #include "beutil.h" @@ -37,9 +38,6 @@ #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. */ @@ -140,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 = { @@ -656,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; @@ -698,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; } @@ -708,6 +712,8 @@ static int is_root(ir_node *root, ir_node *block) { static char _mark; #define MARK &_mark +static firm_dbg_module_t *xxxdbg; + /** * descent into a dag and create a pre-order list. */ @@ -719,6 +725,7 @@ static void descent(ir_node *root, ir_node *block, ir_node **list) { for (i = get_irn_arity(root) - 1; i >= 0; --i) { ir_node *pred = get_irn_n(root, i); + DBG((xxxdbg, LEVEL_3, " node %+F\n", pred)); /* Blocks may happen as predecessors of End nodes */ if (is_Block(pred)) continue; @@ -731,6 +738,8 @@ static void descent(ir_node *root, ir_node *block, ir_node **list) { if (get_nodes_block(pred) != block) continue; + set_irn_link(pred, NULL); + descent(pred, block, list); } } @@ -775,6 +784,7 @@ static void list_sched_block(ir_node *block, void *env_ptr) be.selector = selector; be.sched_env = env; FIRM_DBG_REGISTER(be.dbg, "firm.be.sched"); + FIRM_DBG_REGISTER(xxxdbg, "firm.be.sched"); // firm_dbg_set_mask(be.dbg, SET_LEVEL_3); @@ -800,6 +810,7 @@ static void list_sched_block(ir_node *block, void *env_ptr) preord = NULL; for (curr = root; curr; curr = irn) { irn = get_irn_link(curr); + DBG((be.dbg, LEVEL_2, " DAG root %+F\n", curr)); descent(curr, block, &preord); } root = preord; @@ -993,7 +1004,7 @@ static const list_sched_selector_t reg_pressure_selector_struct = { const list_sched_selector_t *reg_pressure_selector = ®_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; @@ -1005,7 +1016,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); @@ -1027,7 +1038,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);