X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespill.c;h=2746cb042f720e34510148de38fd997bf63eb7d2;hb=6e96ec2cff42d9e59757d486e9b64b8f3bdb1704;hp=6feadd91c6bef01d8a94f844fcc8d10c0eca091f;hpb=3b0e3f49355079844d87dc1ccb46a39adbc2bd95;p=libfirm diff --git a/ir/be/bespill.c b/ir/be/bespill.c index 6feadd91c..2746cb042 100644 --- a/ir/be/bespill.c +++ b/ir/be/bespill.c @@ -24,9 +24,7 @@ * @date 29.09.2005 * @version $Id$ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include @@ -485,7 +483,7 @@ static void spill_phi(spill_env_t *env, spill_info_t *spillinfo) /* build a new PhiM */ arity = get_irn_arity(phi); - ins = alloca(sizeof(ir_node*) * arity); + ins = ALLOCAN(ir_node*, arity); unknown = new_r_Unknown(irg, mode_M); for(i = 0; i < arity; ++i) { ins[i] = unknown; @@ -564,39 +562,19 @@ static int is_value_available(spill_env_t *env, const ir_node *arg, if(arg == get_irg_frame(env->irg)) return 1; +#if 0 /* hack for now (happens when command should be inserted at end of block) */ - if(is_Block(reloader)) { + if(is_Block(reloader)) return 0; - } +#else + (void)reloader; +#endif /* * Ignore registers are always available */ - if (arch_irn_is(arg, ignore)) { - return 1; - } - - /* the following test does not work while spilling, - * because the liveness info is not adapted yet to the effects of the - * additional spills/reloads. - */ -#if 0 - /* we want to remat before the insn reloader - * thus an arguments is alive if - * - it interferes with the reloaders result - * - or it is (last-) used by reloader itself - */ - if (values_interfere(env->birg->lv, reloader, arg)) { + if (arch_irn_is_ignore(arg)) return 1; - } - - arity = get_irn_arity(reloader); - for (i = 0; i < arity; ++i) { - ir_node *rel_arg = get_irn_n(reloader, i); - if (rel_arg == arg) - return 1; - } -#endif return 0; } @@ -642,6 +620,10 @@ static int check_remat_conditions_costs(spill_env_t *env, if(parentcosts + costs >= env->reload_cost + env->spill_cost) { return REMAT_COST_INFINITE; } + /* never rematerialize a node which modifies the flags. + * (would be better to test wether the flags are actually live at point + * reloader...) + */ if (arch_irn_is(spilled, modify_flags)) { return REMAT_COST_INFINITE; } @@ -691,7 +673,7 @@ static ir_node *do_remat(spill_env_t *env, ir_node *spilled, ir_node *reloader) bl = get_nodes_block(reloader); } - ins = alloca(get_irn_arity(spilled) * sizeof(ins[0])); + ins = ALLOCAN(ir_node*, get_irn_arity(spilled)); for(i = 0, arity = get_irn_arity(spilled); i < arity; ++i) { ir_node *arg = get_irn_n(spilled, i); @@ -837,7 +819,7 @@ static void determine_spill_costs(spill_env_t *env, spill_info_t *spillinfo) spill_t *s; double spills_execfreq; - /* calculate sum of executaion frequencies of individual spills */ + /* calculate sum of execution frequencies of individual spills */ spills_execfreq = 0; s = spillinfo->spills; for( ; s != NULL; s = s->next) {