X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelistsched.c;h=47b510a53d8d795633a6619fee29c3b92b3ecd19;hb=1161999117f5c0f56b3af2dc9bb7150e03761905;hp=7972a12192a56ed5d4a11a7b9b3403768ffad3f3;hpb=699ae70aa0321bf98d6dfb5af97a57b14d8bcbb6;p=libfirm diff --git a/ir/be/belistsched.c b/ir/be/belistsched.c index 7972a1219..47b510a53 100644 --- a/ir/be/belistsched.c +++ b/ir/be/belistsched.c @@ -28,17 +28,16 @@ #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 = ®_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); }