X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=6dfb528cc83b53471447ddc4ef6ac9a41537c659;hb=ab11945ab757f3f22a717a35d639be264b0f649c;hp=e14db568cdc3be9bc7e71eebf8778689afc9f907;hpb=a4360ad1c1ce12cf7258bdb564e28d26859e3729;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index e14db568c..6dfb528cc 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -1,20 +1,6 @@ /* - * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. - * * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. + * Copyright (C) 2012 University of Karlsruhe. */ /** @@ -28,7 +14,6 @@ #include #include "obst.h" -#include "irprintf_t.h" #include "irgraph.h" #include "irnode.h" #include "irmode.h" @@ -39,6 +24,7 @@ #include "irprintf.h" #include "irnodeset.h" #include "irtools.h" +#include "statev_t.h" #include "util.h" #include "beutil.h" @@ -89,7 +75,6 @@ static unsigned n_regs; static workset_t *ws; /**< the main workset used while processing a block. */ static be_uses_t *uses; /**< env for the next-use magic */ -static ir_node *instr; /**< current instruction */ static spill_env_t *senv; /**< see bespill.h */ static ir_node **blocklist; @@ -324,7 +309,7 @@ static unsigned get_distance(ir_node *from, const ir_node *def, int skip_from_us * @p is_usage indicates that the values in new_vals are used (not defined) * In this case reloads must be performed */ -static void displace(workset_t *new_vals, int is_usage) +static void displace(workset_t *const new_vals, int const is_usage, ir_node *const instr) { ir_node **to_insert = ALLOCAN(ir_node*, n_regs); bool *spilled = ALLOCAN(bool, n_regs); @@ -482,11 +467,6 @@ static loc_t to_take_or_not_to_take(ir_node* first, ir_node *node, loc.node = node; loc.spilled = false; - if (!arch_irn_consider_in_reg_alloc(cls, node)) { - loc.time = USES_INFINITY; - return loc; - } - /* We have to keep nonspillable nodes in the workingset */ if (arch_get_irn_flags(skip_Proj_const(node)) & arch_irn_flags_dont_spill) { loc.time = 0; @@ -536,17 +516,15 @@ static loc_t to_take_or_not_to_take(ir_node* first, ir_node *node, * beginning of a loop. We try to reload as much values as possible now so they * don't get reloaded inside the loop. */ -static void decide_start_workset(const ir_node *block) +static void decide_start_workset(ir_node *const block) { ir_loop *loop = get_irn_loop(block); ir_node *first; - ir_node *node; loc_t loc; loc_t *starters; loc_t *delayed; unsigned len; unsigned i; - int in; unsigned ws_count; int free_slots, free_pressure_slots; unsigned pressure; @@ -558,7 +536,7 @@ static void decide_start_workset(const ir_node *block) arity = get_irn_arity(block); pred_worksets = ALLOCAN(workset_t*, arity); all_preds_known = true; - for (in = 0; in < arity; ++in) { + for (int in = 0; in < arity; ++in) { ir_node *pred_block = get_Block_cfgpred_block(block, in); block_info_t *pred_info = get_block_info(pred_block); @@ -605,10 +583,8 @@ static void decide_start_workset(const ir_node *block) } /* check all Live-Ins */ - be_lv_foreach(lv, block, be_lv_state_in, in) { - ir_node *node = be_lv_get_irn(lv, block, in); + be_lv_foreach_cls(lv, block, be_lv_state_in, cls, node) { unsigned available; - if (all_preds_known) { available = available_in_all_preds(pred_worksets, arity, node, false); } else { @@ -761,7 +737,6 @@ static void decide_start_workset(const ir_node *block) static void process_block(ir_node *block) { workset_t *new_vals; - ir_node *irn; unsigned iter; block_info_t *block_info; int arity; @@ -793,9 +768,11 @@ static void process_block(ir_node *block) set_block_info(block, block_info); DB((dbg, DBG_WSETS, "Start workset for %+F:\n", block)); - workset_foreach(ws, irn, iter) { - DB((dbg, DBG_WSETS, " %+F (%u)\n", irn, - workset_get_time(ws, iter))); + { + ir_node *irn; + workset_foreach(ws, irn, iter) { + DB((dbg, DBG_WSETS, " %+F (%u)\n", irn, workset_get_time(ws, iter))); + } } block_info->start_workset = workset_clone(ws); @@ -806,8 +783,6 @@ static void process_block(ir_node *block) new_vals = new_workset(); sched_foreach(block, irn) { - int i, arity; - ir_node *value; assert(workset_get_length(ws) <= n_regs); /* Phis are no real instr (see insert_starters()) */ @@ -816,35 +791,31 @@ static void process_block(ir_node *block) } DB((dbg, DBG_DECIDE, " ...%+F\n", irn)); - /* set instruction in the workset */ - instr = irn; - /* allocate all values _used_ by this instruction */ workset_clear(new_vals); - for (i = 0, arity = get_irn_arity(irn); i < arity; ++i) { - ir_node *in = get_irn_n(irn, i); - if (!arch_irn_consider_in_reg_alloc(cls, in)) - continue; - + be_foreach_use(irn, cls, in_req_, in, in_req, /* (note that "spilled" is irrelevant here) */ workset_insert(new_vals, in, false); - } - displace(new_vals, 1); + ); + displace(new_vals, 1, irn); /* allocate all values _defined_ by this instruction */ workset_clear(new_vals); - be_foreach_definition(irn, cls, value, - assert(req_->width == 1); + be_foreach_definition(irn, cls, value, req, + assert(req->width == 1); workset_insert(new_vals, value, false); ); - displace(new_vals, 0); + displace(new_vals, 0, irn); } /* Remember end-workset for this block */ block_info->end_workset = workset_clone(ws); DB((dbg, DBG_WSETS, "End workset for %+F:\n", block)); - workset_foreach(ws, irn, iter) - DB((dbg, DBG_WSETS, " %+F (%u)\n", irn, workset_get_time(ws, iter))); + { + ir_node *irn; + workset_foreach(ws, irn, iter) + DB((dbg, DBG_WSETS, " %+F (%u)\n", irn, workset_get_time(ws, iter))); + } } /**