X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespill.c;h=4cc4ad0360e713bdcf48f120735d54029acb9f94;hb=bb1d428852c9b62adc4675190c974c1333ce5bfa;hp=2d659658827260f59855beca7793c75d35846cb4;hpb=d016265fdff42dfaf0c2e3875203a9a94177a254;p=libfirm diff --git a/ir/be/bespill.c b/ir/be/bespill.c index 2d6596588..4cc4ad036 100644 --- a/ir/be/bespill.c +++ b/ir/be/bespill.c @@ -69,6 +69,7 @@ DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) typedef struct reloader_t reloader_t; struct reloader_t { reloader_t *next; + ir_node *can_spill_after; ir_node *reloader; ir_node *rematted_node; int remat_cost_delta; /** costs needed for rematerialization, @@ -209,7 +210,7 @@ void be_add_remat(spill_env_t *env, ir_node *to_spill, ir_node *before, to_spill, before)); } -void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before, +void be_add_reload2(spill_env_t *env, ir_node *to_spill, ir_node *before, ir_node *can_spill_after, const arch_register_class_t *reload_cls, int allow_remat) { spill_info_t *info; @@ -244,15 +245,12 @@ void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before, assert(!is_Proj(before) && !be_is_Keep(before)); /* put reload into list */ - rel = obstack_alloc(&env->obst, sizeof(rel[0])); - rel->next = info->reloaders; - rel->reloader = before; - rel->rematted_node = NULL; - if(!allow_remat) { - rel->remat_cost_delta = REMAT_COST_INFINITE; - } else { - rel->remat_cost_delta = 0; - } + rel = obstack_alloc(&env->obst, sizeof(rel[0])); + rel->next = info->reloaders; + rel->reloader = before; + rel->rematted_node = NULL; + rel->can_spill_after = can_spill_after; + rel->remat_cost_delta = allow_remat ? 0 : REMAT_COST_INFINITE; info->reloaders = rel; assert(info->reload_cls == NULL || info->reload_cls == reload_cls); @@ -262,6 +260,13 @@ void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before, to_spill, before, allow_remat ? "" : " not")); } +void be_add_reload(spill_env_t *senv, ir_node *to_spill, ir_node *before, + const arch_register_class_t *reload_cls, int allow_remat) +{ + be_add_reload2(senv, to_spill, before, to_spill, reload_cls, allow_remat); + +} + ir_node *be_get_end_of_block_insertion_point(const ir_node *block) { ir_node *last = sched_last(block); @@ -463,8 +468,9 @@ void spill_phi(spill_env_t *env, spill_info_t *spillinfo) /* build a new PhiM */ ins = alloca(sizeof(ir_node*) * arity); for(i = 0; i < arity; ++i) { - ins[i] = get_irg_bad(env->irg); + ins[i] = new_r_Unknown(env->irg, mode_M); } + assert(!get_opt_cse()); spillinfo->spill = new_r_Phi(env->irg, block, arity, ins, mode_M); #ifdef FIRM_STATISTICS env->spilled_phi_count++; @@ -635,6 +641,9 @@ int check_remat_conditions_costs(spill_env_t *env, const ir_node *spilled, if(parentcosts + costs >= env->reload_cost + env->spill_cost) { return REMAT_COST_INFINITE; } + if(arch_irn_is(env->arch_env, spilled, modify_flags)) { + return REMAT_COST_INFINITE; + } argremats = 0; for(i = 0, arity = get_irn_arity(spilled); i < arity; ++i) {