From: Adam Szalkowski Date: Tue, 5 Sep 2006 07:18:42 +0000 (+0000) Subject: improved repairing of schedule X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;ds=sidebyside;h=1a17ce1b27aa55ac4037e2317a9d017fe6fa45c3;hp=019a715fe23b8a13b5f8bcddd16ed61b2ea21353;p=libfirm improved repairing of schedule --- diff --git a/ir/be/bespillremat.c b/ir/be/bespillremat.c index 5a06334ce..180d0c56f 100644 --- a/ir/be/bespillremat.c +++ b/ir/be/bespillremat.c @@ -2219,23 +2219,59 @@ skip_one_must_die: if(opt_repair_schedule) { pset_foreach(defs, tmp) { op_t *tmp_op = get_irn_link(tmp); - ilp_var_t keep; spill_t *spill = set_find_spill(spill_bb->ilp, tmp); +#if 1 + ilp_var_t delete; + assert(spill); + + ir_snprintf(buf, sizeof(buf), "delete_%N", tmp); + delete = lpp_add_var_default(si->lpp, buf, lpp_binary, -1.0*get_cost(si, irn)*execution_frequency(si, bb), 0.0); + + /* op may not be killed if its first live_range is 1 */ + ir_snprintf(buf, sizeof(buf), "killorig-lr_%N", tmp); + cst = lpp_add_cst_uniq(si->lpp, buf, lpp_less, 1.0); + lpp_set_factor_fast(si->lpp, cst, delete, 1.0); + lpp_set_factor_fast(si->lpp, cst, tmp_op->attr.live_range.ilp, 1.0); + + /* op may not be killed if it is spilled after the definition */ + ir_snprintf(buf, sizeof(buf), "killorig-spill_%N", tmp); + cst = lpp_add_cst_uniq(si->lpp, buf, lpp_less, 1.0); + lpp_set_factor_fast(si->lpp, cst, delete, 1.0); + lpp_set_factor_fast(si->lpp, cst, spill->spill, 1.0); +#else + ilp_var_t keep; assert(spill); ir_snprintf(buf, sizeof(buf), "keep_%N", tmp); keep = lpp_add_var_default(si->lpp, buf, lpp_binary, get_cost(si, irn)*execution_frequency(si, bb), 1.0); + /* op may not be killed if its first live_range is 1 */ ir_snprintf(buf, sizeof(buf), "killorig-lr_%N", tmp); cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, 0.0); lpp_set_factor_fast(si->lpp, cst, keep, 1.0); lpp_set_factor_fast(si->lpp, cst, tmp_op->attr.live_range.ilp, -1.0); + /* op may not be killed if it is spilled after the definition */ ir_snprintf(buf, sizeof(buf), "killorig-spill_%N", tmp); cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, 0.0); lpp_set_factor_fast(si->lpp, cst, keep, 1.0); lpp_set_factor_fast(si->lpp, cst, spill->spill, -1.0); +#endif } + } else { + pset_foreach(defs, tmp) { + op_t *tmp_op = get_irn_link(tmp); + spill_t *spill = set_find_spill(spill_bb->ilp, tmp); + assert(spill); + + /* live_range or spill should be 1 + TODO: lr should be live until first use */ + ir_snprintf(buf, sizeof(buf), "nokillorig_%N", tmp); + cst = lpp_add_cst_uniq(si->lpp, buf, lpp_greater, 1.0); + lpp_set_factor_fast(si->lpp, cst, tmp_op->attr.live_range.ilp, 1.0); + lpp_set_factor_fast(si->lpp, cst, spill->spill, 1.0); + } + }