X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fberaextern.c;h=74a2b54a8e3101310760642456b8defe269eae10;hb=3c5deb9481abe11a876ea84bd55b0606596b9bd4;hp=b70cc2dd0b61223812f6d077b29110c750f45a80;hpb=6981dd3274e6753e50f66c8cbe17b37bd41708e5;p=libfirm diff --git a/ir/be/beraextern.c b/ir/be/beraextern.c index b70cc2dd0..74a2b54a8 100644 --- a/ir/be/beraextern.c +++ b/ir/be/beraextern.c @@ -1,10 +1,28 @@ -/** - * Author: Daniel Grund - * Date: 17.01.2006 - * Copyright: (c) Universitaet Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. +/* + * 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. * - * Implementation of the RA-Interface for an external, (non-SSA) register allocator. + * 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. + */ + +/** + * @file + * @brief Implementation of the RA-Interface for an external, (non-SSA) register allocator. + * @author Daniel Grund + * @date 17.01.2006 + * @version $Id$ * * The external register allocator is a program: * PROG -i INPUTFILE -o OUTPUTFILE @@ -51,30 +69,24 @@ allocs ::= 'allocs' alloc* . alloc ::= node-nr reg-nr . - -******** End of file format docu ********/ - +*/ +#ifdef NOT_PORTED #ifdef HAVE_CONFIG_H #include "config.h" #endif -#ifdef HAVE_MALLOC_H - #include -#endif -#ifdef HAVE_ALLOCA_H - #include -#endif - #include #include #include -#include -#include +#include "lc_opts.h" +#include "lc_opts_enum.h" #include "set.h" #include "pset.h" #include "pmap.h" #include "bitset.h" +#include "raw_bitset.h" +#include "xmalloc.h" #include "irprintf_t.h" #include "irnode_t.h" @@ -85,9 +97,8 @@ alloc ::= node-nr reg-nr . #include "phiclass.h" #include "bemodule.h" -#include "beraextern.h" #include "beabi.h" -#include "bearch.h" +#include "bearch_t.h" #include "benode_t.h" #include "beirgmod.h" #include "besched_t.h" @@ -202,7 +213,7 @@ static void handle_constraints_insn(be_raext_env_t *env, be_insn_t *insn) be_operand_t *op = &insn->ops[i]; if(op->has_constraints) { - ir_node *cpy = be_new_Copy(op->req.cls, env->irg, bl, op->carrier); + ir_node *cpy = be_new_Copy(op->req->cls, env->irg, bl, op->carrier); sched_add_before(insn->next_insn, cpy); edges_reroute(op->carrier, cpy, env->irg); } @@ -212,10 +223,10 @@ static void handle_constraints_insn(be_raext_env_t *env, be_insn_t *insn) be_operand_t *op = &insn->ops[i]; if(op->has_constraints) { - ir_node *cpy = be_new_Copy(op->req.cls, env->irg, bl, op->carrier); + ir_node *cpy = be_new_Copy(op->req->cls, env->irg, bl, op->carrier); sched_add_before(insn->irn, cpy); set_irn_n(insn->irn, op->pos, cpy); - be_set_constr_limited(cpy, BE_OUT_POS(0), &op->req); + be_set_constr_limited(cpy, BE_OUT_POS(0), op->req); } } } @@ -292,16 +303,16 @@ static void extract_vars_of_cls(be_raext_env_t *raenv) { * If yes, dump it to FILE raenv->f */ static INLINE void dump_constraint(be_raext_env_t *raenv, ir_node *irn, int pos) { - bitset_t *bs = bitset_alloca(raenv->cls->n_regs); - arch_register_req_t req; - - arch_get_register_req(raenv->aenv, &req, irn, pos); - if (arch_register_req_is(&req, limited)) { - int reg_nr; - req.limited(req.limited_env, bs); - reg_nr = bitset_next_set(bs, 0); + const arch_register_req_t *req; + + req = arch_get_register_req(raenv->aenv, irn, pos); + if (arch_register_req_is(req, limited)) { + unsigned reg_nr; + + reg_nr = rbitset_next(req->limited, 0, 1); fprintf(raenv->f, "<%d>", reg_nr); - assert(-1 == bitset_next_set(bs, reg_nr+1) && "Constraints with more than 1 possible register are not supported"); + assert(rbitset_popcnt(req->limited, raenv->cls->n_regs) <= 1 + && "Constraints with more than 1 possible register are not supported"); } } @@ -392,7 +403,7 @@ NextVar: ; static void dump_affinities_walker(ir_node *irn, void *env) { be_raext_env_t *raenv = env; - arch_register_req_t req; + const arch_register_req_t *req; int pos, max; be_var_info_t *vi1, *vi2; @@ -415,12 +426,20 @@ static void dump_affinities_walker(ir_node *irn, void *env) { /* should_be_equal constraints are affinites */ for (pos = 0, max = get_irn_arity(irn); posaenv, &req, irn, pos); - - if (arch_register_req_is(&req, should_be_same) && arch_irn_is(raenv->aenv, req.other_same, ignore)) { - vi2 = be_get_var_info(req.other_same); - - fprintf(raenv->f, "(%d, %d, %d)\n", vi1->var_nr, vi2->var_nr, get_affinity_weight(irn)); + req = arch_get_register_req(raenv->aenv, irn, pos); + if (arch_register_req_is(req, should_be_same)) { + const int* i; + for (i = req->other_same; i != ENDOF(req->other_same); ++i) { + ir_node *other; + + if (*i == -1) break; + + other = get_irn_n(skip_Proj(irn), *i); + if(arch_irn_is(raenv->aenv, other, ignore)) { + vi2 = be_get_var_info(other); + fprintf(raenv->f, "(%d, %d, %d)\n", vi1->var_nr, vi2->var_nr, get_affinity_weight(irn)); + } + } } } } @@ -540,7 +559,7 @@ static INLINE void var_add_spills_and_reloads(be_raext_env_t *raenv, int var_nr) mode = get_irn_mode(get_irn_n(spill, be_pos_Spill_val)); /* insert reloads and wire them arbitrary*/ - pset_foreach(vi->values, irn) + pset_foreach(vi->values, irn) { foreach_out_edge_safe(irn, edge, ne) { ir_node *reload, *src = edge->src; if (is_Phi(src) || be_is_Spill(src)) @@ -554,9 +573,10 @@ static INLINE void var_add_spills_and_reloads(be_raext_env_t *raenv, int var_nr) /* remember the reload */ pset_insert_ptr(reloads, reload); } + } /* correct the reload->spill pointers... */ - be_ssa_constr_set(dom_front, lv, spills); + be_ssa_constr_set_ignore(dom_front, lv, spills, NULL); /****** correct the variable <--> values mapping: ****** @@ -750,7 +770,7 @@ static void be_ra_extern_main(be_irg_t *birg) { dump_to_file(&raenv, out); execute(callee, out, in); done = read_and_apply_results(&raenv, in); - be_abi_fix_stack_nodes(birg->abi, birg->lv); + be_abi_fix_stack_nodes(birg->abi); ir_snprintf(in, sizeof(in), "-extern-%s-round-%d", raenv.cls->name, round); be_dump(irg, in, dump_ir_block_graph_sched); @@ -768,7 +788,7 @@ static void be_ra_extern_main(be_irg_t *birg) { /* Clean up */ free_ssa_destr_simple(raenv.vars); - be_invalidate_liveness(birg); + be_liveness_invalidate(be_get_birg_liveness(birg)); } /****************************************************************************** @@ -813,3 +833,5 @@ void be_init_raextern(void) { be_register_allocator("ext", &be_ra_external_allocator); } BE_REGISTER_MODULE_CONSTRUCTOR(be_init_raextern); + +#endif /* NOT_PORTED */