X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=c5e58b727dc4f628439b472e7fd9eed32e22ba14;hb=205396c4f4f5abe7abd6dc2350c8c398a7623afc;hp=b91c645f9f84faa9eebd5911834c70439c63e1c8;hpb=895edce679ee6434eb0c4f8b976e3f668bf2d48b;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index b91c645f9..c5e58b727 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -9,14 +9,6 @@ #include "config.h" #endif -#ifdef HAVE_ALLOCA_H -#include -#endif - -#ifdef HAVE_MALLOC_H -#include -#endif - #include "obst.h" #include "set.h" #include "pset.h" @@ -29,9 +21,10 @@ #include "iredges_t.h" #include "ircons_t.h" #include "irprintf.h" +#include "xmalloc.h" #include "beutil.h" -#include "bearch.h" +#include "bearch_t.h" #include "bespillbelady.h" #include "beuses_t.h" #include "besched_t.h" @@ -673,13 +666,27 @@ next_value: } } -void be_spill_belady(be_irg_t *birg, const arch_register_class_t *cls) { +/** + * Do spilling for a register class on a graph using the belady heuristic. + * In the transformed graph, the register pressure never exceeds the number + * of available registers. + * + * @param birg The backend graph + * @param cls The register class to spill + */ +static void be_spill_belady(be_irg_t *birg, const arch_register_class_t *cls) { be_spill_belady_spill_env(birg, cls, NULL); } void be_spill_belady_spill_env(be_irg_t *birg, const arch_register_class_t *cls, spill_env_t *spill_env) { belady_env_t env; ir_graph *irg = be_get_birg_irg(birg); + int n_regs; + + /* some special classes contain only ignore regs, nothing to do then */ + n_regs = cls->n_regs - be_put_ignore_regs(birg, cls, NULL); + if(n_regs == 0) + return; be_invalidate_liveness(birg); be_assure_liveness(birg); @@ -693,7 +700,7 @@ void be_spill_belady_spill_env(be_irg_t *birg, const arch_register_class_t *cls, env.arch = birg->main_env->arch_env; env.cls = cls; env.lv = be_get_birg_liveness(birg); - env.n_regs = env.cls->n_regs - be_put_ignore_regs(birg, cls, NULL); + env.n_regs = n_regs; env.ws = new_workset(&env, &env.ob); env.uses = be_begin_uses(irg, env.lv); env.loop_ana = be_new_loop_pressure(birg);