From 9de3e5c0661ad5bb57c3d2f471425f47be1ca821 Mon Sep 17 00:00:00 2001 From: Adam Szalkowski Date: Wed, 30 Aug 2006 12:27:46 +0000 Subject: [PATCH] hopefully fixed registerhypertony at bb end --- ir/be/bespillremat.c | 73 ++------------------------------------------ 1 file changed, 2 insertions(+), 71 deletions(-) diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index bd50b975e..b57650981 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -1751,9 +1751,9 @@ luke_blockwalker(ir_node * bb, void * data) op->attr.live_range.op = bb; ir_snprintf(buf, sizeof(buf), "reg_out_%N_%N", bb, irn); - cst = lpp_add_cst_uniq(si->lpp, buf, lpp_less, 0.0); + cst = lpp_add_cst_uniq(si->lpp, buf, lpp_equal, 0.0); - /* reg_out - reload - remat - live_range <= 0 */ + /* reg_out = reload + remat + live_range */ lpp_set_factor_fast(si->lpp, cst, spill->reg_out, 1.0); if(reload != ILP_UNDEF) lpp_set_factor_fast(si->lpp, cst, reload, -1.0); lpp_set_factor_fast(si->lpp, cst, op->attr.live_range.ilp, -1.0); @@ -1763,46 +1763,11 @@ luke_blockwalker(ir_node * bb, void * data) lpp_set_factor_fast(si->lpp, cst, remat_op->attr.remat.ilp, -1.0); } } - /* maybe we should also assure that reg_out >= live_range etc. */ } if(opt_memcopies) insert_mem_copy_position(si, live, bb); - /* allow only one argument to die at pre remat. If two value die check_pre does - * not ensure a correct register pressure FIXME (verify this is really necessary!) */ - foreach_pre_remat(si, bb, tmp) { - pset *remat_args = pset_new_ptr(get_irn_arity(tmp)); - int n; - ir_node *remat_arg; - op_t *remat_op = get_irn_link(tmp); - - for(n=get_irn_arity(tmp)-1; n>=0; --n) { - remat_arg = get_irn_n(tmp, n); - - if(has_reg_class(si, remat_arg)) { - pset_insert_ptr(remat_args, remat_arg); - } - } - - if(pset_count(remat_args)) { - /* \sum_args reg_out >= #args * remat - 1 */ - ir_snprintf(buf, sizeof(buf), "one_may_die_%N", tmp); - cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, -1.0); - lpp_set_factor_fast(si->lpp, cst, remat_op->attr.remat.ilp, -pset_count(remat_args)); - - pset_foreach(remat_args, remat_arg) { - spill = set_find_spill(spill_bb->ilp, remat_arg); - - if(spill) { - lpp_set_factor_fast(si->lpp, cst, spill->reg_out, 1.0); - } - } - } - - del_pset(remat_args); - } - /* * start new live ranges for values used by remats at end of block * and assure the remat args are available @@ -2096,40 +2061,6 @@ skip_one_must_die: } } - /* allow only one argument to die at pre remat. If two value die check_pre does - * not ensure a correct register pressure FIXME (verify this is really necessary!) */ - foreach_pre_remat(si, irn, tmp) { - pset *remat_args = pset_new_ptr(get_irn_arity(tmp)); - int n; - ir_node *remat_arg; - op_t *remat_op = get_irn_link(tmp); - - for(n=get_irn_arity(tmp)-1; n>=0; --n) { - remat_arg = get_irn_n(tmp, n); - - if(has_reg_class(si, remat_arg)) { - pset_insert_ptr(remat_args, remat_arg); - } - } - - if(pset_count(remat_args)) { - /* \sum_args next(lr) >= #args * remat - 1 */ - ir_snprintf(buf, sizeof(buf), "one_may_die_%N", tmp); - cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, -1.0); - lpp_set_factor_fast(si->lpp, cst, remat_op->attr.remat.ilp, -pset_count(remat_args)); - - pset_foreach(remat_args, remat_arg) { - op_t *arg_op = get_irn_link(remat_arg); - - if(arg_op->attr.live_range.ilp != ILP_UNDEF) { - lpp_set_factor_fast(si->lpp, cst, arg_op->attr.live_range.ilp, 1.0); - } - } - } - - del_pset(remat_args); - } - /*********************************************************** * I T E R A T I O N O V E R U S E S F O R E P I L O G **********************************************************/ -- 2.20.1