X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbechordal_common.c;h=5a9c0c7516ba1560bd144d65c447d8dd516e740f;hb=34e3b8d50bce639e760da7233524a4db85c80290;hp=7e7f84e6323373e59712aa5f0c02bc48b51c9511;hpb=1376e7ac003f5d209b72056c62798cbb6d928de3;p=libfirm diff --git a/ir/be/bechordal_common.c b/ir/be/bechordal_common.c index 7e7f84e63..5a9c0c751 100644 --- a/ir/be/bechordal_common.c +++ b/ir/be/bechordal_common.c @@ -1,20 +1,6 @@ /* - * Copyright (C) 1995-2008 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. */ /** @@ -43,58 +29,19 @@ #include "bemodule.h" #include "belive.h" #include "belive_t.h" -#include "fourcc.h" DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) -/* Make a fourcc for border checking. */ -#define BORDER_FOURCC FOURCC('B', 'O', 'R', 'D') - -static inline border_t *border_add(be_chordal_env_t *env, struct list_head *head, - ir_node *irn, unsigned step, unsigned pressure, - unsigned is_def, unsigned is_real) +static inline border_t *border_add(be_chordal_env_t *const env, struct list_head *const head, ir_node *const irn, unsigned const step, unsigned const is_def, unsigned const is_real) { - border_t *b; - - if (!is_def) { - border_t *def; - - b = OALLOC(&env->obst, border_t); - - /* also allocate the def and tie it to the use. */ - def = OALLOCZ(&env->obst, border_t); - b->other_end = def; - def->other_end = b; - - /* - * Set the link field of the irn to the def. - * This strongly relies on the fact, that the use is always - * made before the def. - */ - set_irn_link(irn, def); - - DEBUG_ONLY(b->magic = BORDER_FOURCC;) - DEBUG_ONLY(def->magic = BORDER_FOURCC;) - } else { - /* - * If the def is encountered, the use was made and so was the - * the def node (see the code above). It was placed into the - * link field of the irn, so we can get it there. - */ - b = (border_t*)get_irn_link(irn); - - DEBUG_ONLY(assert(b && b->magic == BORDER_FOURCC && "Illegal border encountered");) - } - - b->pressure = pressure; - b->is_def = is_def; + border_t *const b = OALLOC(&env->obst, border_t); + b->is_def = is_def; b->is_real = is_real; - b->irn = irn; - b->step = step; + b->irn = irn; + b->step = step; list_add_tail(&b->list, head); DBG((dbg, LEVEL_5, "\t\t%s adding %+F, step: %d\n", is_def ? "def" : "use", irn, step)); - return b; } @@ -102,35 +49,35 @@ void create_borders(ir_node *block, void *env_ptr) { /* Convenience macro for a def */ #define border_def(irn, step, real) \ - border_add(env, head, irn, step, pressure--, 1, real) + border_add(env, head, irn, step, 1, real) /* Convenience macro for a use */ #define border_use(irn, step, real) \ - border_add(env, head, irn, step, ++pressure, 0, real) + border_add(env, head, irn, step, 0, real) - be_chordal_env_t *env = (be_chordal_env_t*)env_ptr; - bitset_t *live = bitset_malloc(get_irg_last_idx(env->irg)); - be_lv_t *lv = be_get_irg_liveness(env->irg); + be_chordal_env_t *const env = (be_chordal_env_t*)env_ptr; unsigned step = 0; - unsigned pressure = 0; struct list_head *head; - bitset_clear_all(live); - /* Set up the border list in the block info */ head = OALLOC(&env->obst, struct list_head); INIT_LIST_HEAD(head); assert(pmap_get(struct list_head, env->border_heads, block) == NULL); pmap_insert(env->border_heads, block, head); + ir_nodeset_t live; + ir_nodeset_init(&live); + + be_lv_t *const lv = be_get_irg_liveness(env->irg); + /* * Make final uses of all values live out of the block. * They are necessary to build up real intervals. */ be_lv_foreach_cls(lv, block, be_lv_state_end, env->cls, irn) { - DB((dbg, LEVEL_3, "\tMaking live: %+F/%d\n", irn, get_irn_idx(irn))); - bitset_set(live, get_irn_idx(irn)); + DB((dbg, LEVEL_3, "\tMaking live: %+F\n", irn)); + ir_nodeset_insert(&live, irn); border_use(irn, step, 0); } ++step; @@ -140,30 +87,24 @@ void create_borders(ir_node *block, void *env_ptr) * relevant for the interval borders. */ sched_foreach_reverse(block, irn) { - DB((dbg, LEVEL_1, "\tinsn: %+F, pressure: %d\n", irn, pressure)); - DB((dbg, LEVEL_2, "\tlive: %B\n", live)); + DB((dbg, LEVEL_1, "\tinsn: %+F\n", irn)); - be_foreach_definition(irn, env->cls, def, + be_foreach_definition(irn, env->cls, def, req, /* * If the node defines some value, which can put into a * register of the current class, make a border for it. */ - unsigned idx = get_irn_idx(def); - bitset_clear(live, idx); + ir_nodeset_remove(&live, def); border_def(def, step, 1); ); - /* - * If the node is no phi node we can examine the uses. - */ + /* If the node is no phi node we can examine the uses. */ if (!is_Phi(irn)) { be_foreach_use(irn, env->cls, in_req_, op, op_req_, - unsigned idx = get_irn_idx(op); const char *msg = "-"; - if (!bitset_is_set(live, idx)) { + if (ir_nodeset_insert(&live, op)) { border_use(op, step, 1); - bitset_set(live, idx); msg = "X"; } @@ -173,13 +114,14 @@ void create_borders(ir_node *block, void *env_ptr) ++step; } - bitset_foreach(live, elm) { - ir_node *irn = get_idx_irn(env->irg, elm); - if (be_is_live_in(lv, block, irn)) - border_def(irn, step, 0); + /* Process live-ins last. In particular all Phis are handled before, so when + * iterating the borders the live-ins come before all Phis ("live-start"). */ + foreach_ir_nodeset(&live, irn, iter) { + assert(be_is_live_in(lv, block, irn)); + border_def(irn, step, 0); } - bitset_free(live); + ir_nodeset_destroy(&live); } ir_node *pre_process_constraints(be_chordal_env_t *env, be_insn_t **the_insn)