From a1e68eec23322c45c678083ca14f5a82a84aef19 Mon Sep 17 00:00:00 2001 From: Adam Szalkowski Date: Mon, 28 Aug 2006 07:49:24 +0000 Subject: [PATCH] keine Ahnung --- ir/be/bespillremat.c | 76 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index c19606732..bd50b975e 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -1769,6 +1769,40 @@ luke_blockwalker(ir_node * bb, void * data) 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 @@ -2062,6 +2096,40 @@ 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 **********************************************************/ @@ -2153,8 +2221,6 @@ skip_one_must_die: lpp_set_factor_fast(si->lpp, cst, memoperand, 1.0); lpp_set_factor_fast(si->lpp, cst, post_use, 1.0); -// if(arg_op->attr.live_range.ilp != ILP_UNDEF) -// lpp_set_factor_fast(si->lpp, cst, arg_op->attr.live_range.ilp, 1.0); } } } @@ -2163,12 +2229,7 @@ skip_one_must_die: arg_op->attr.live_range.ilp = prev_lr; arg_op->attr.live_range.op = irn; - /*if(!pset_find_ptr(live, arg)) { - pset_insert_ptr(live, arg); - add_to_spill_bb(si, bb, arg); - }*/ pset_insert_ptr(live, arg); - } /* just to be sure */ @@ -2277,7 +2338,6 @@ skip_one_must_die: /* requirements for remats */ - /* start new live ranges for values used by remats */ foreach_pre_remat(si, irn, tmp) { op_t *remat_op = get_irn_link(tmp); int n; -- 2.20.1