X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeprefalloc.c;h=338b7a4380f042b33abd5d4c2fcbd5860242f206;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=84d43b6569b423cfdcc23f3ae66fa7954629645b;hpb=7dd67de2496539d779c6e8981037b48d5a837269;p=libfirm diff --git a/ir/be/beprefalloc.c b/ir/be/beprefalloc.c index 84d43b656..338b7a438 100644 --- a/ir/be/beprefalloc.c +++ b/ir/be/beprefalloc.c @@ -22,7 +22,6 @@ * @brief Preference Guided Register Assignment * @author Matthias Braun * @date 14.2.2009 - * @version $Id$ * * The idea is to allocate registers in 2 passes: * 1. A first pass to determine "preferred" registers for live-ranges. This @@ -55,6 +54,7 @@ #include "irprintf.h" #include "irdump.h" #include "irtools.h" +#include "util.h" #include "obst.h" #include "raw_bitset.h" #include "unionfind.h" @@ -1245,6 +1245,13 @@ static void solve_lpp(ir_nodeset_t *live_nodes, ir_node *node, lpp_free(lpp); } +static bool is_aligned(unsigned num, unsigned alignment) +{ + unsigned mask = alignment-1; + assert(is_po2(alignment)); + return (num&mask) == 0; +} + /** * Enforce constraints at a node by live range splits. * @@ -1264,7 +1271,8 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node, /* construct a list of register occupied by live-through values */ unsigned *live_through_regs = NULL; - /* see if any use constraints are not met */ + /* see if any use constraints are not met and whether double-width + * values are involved */ bool double_width = false; bool good = true; for (i = 0; i < arity; ++i) { @@ -1281,16 +1289,22 @@ static void enforce_constraints(ir_nodeset_t *live_nodes, ir_node *node, req = arch_get_irn_register_req_in(node, i); if (req->width > 1) double_width = true; + reg = arch_get_irn_register(op); + reg_index = arch_register_get_index(reg); + if (req->type & arch_register_req_type_aligned) { + if (!is_aligned(reg_index, req->width)) { + good = false; + continue; + } + } if (!(req->type & arch_register_req_type_limited)) continue; limited = req->limited; - reg = arch_get_irn_register(op); - reg_index = arch_register_get_index(reg); if (!rbitset_is_set(limited, reg_index)) { /* found an assignment outside the limited set */ good = false; - break; + continue; } } @@ -1996,8 +2010,8 @@ static void be_pref_alloc_cls(void) { size_t i; - lv = be_assure_liveness(irg); - be_liveness_assure_sets(lv); + be_assure_live_sets(irg); + lv = be_get_irg_liveness(irg); ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); @@ -2095,8 +2109,7 @@ static void be_pref_alloc(ir_graph *new_irg) /* we most probably constructed new Phis so liveness info is invalid * now */ - /* TODO: test liveness_introduce */ - be_liveness_invalidate(lv); + be_invalidate_live_sets(irg); free(normal_regs); stat_ev_ctx_pop("regcls");