X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillslots.c;h=fe4df32f4a1548b953a5f942430582afc6d0371d;hb=5474a1c188c9d59eea2c915515980cd9cbab58d8;hp=2239e2913302bbc1575422662121151e4fd0f12c;hpb=16fc4cdb8f7bc9d203f4e024d0bad50f79867c4f;p=libfirm diff --git a/ir/be/bespillslots.c b/ir/be/bespillslots.c index 2239e2913..fe4df32f4 100644 --- a/ir/be/bespillslots.c +++ b/ir/be/bespillslots.c @@ -22,7 +22,6 @@ * @brief Spillslot coalescer. * @author Matthias Braun * @date 26.07.2006 - * @version $Id$ */ #include "config.h" @@ -74,6 +73,8 @@ struct be_fec_env_t { affinity_edge_t **affinity_edges; set *memperms; set_frame_entity_func set_frame_entity; + bool at_begin; /**< frame entities should be allocate at + the beginning of the stackframe */ }; /** Compare 2 affinity edges (used in quicksort) */ @@ -197,15 +198,14 @@ void be_node_needs_frame_entity(be_fec_env_t *env, ir_node *node, const ir_mode *mode, int align) { ir_node *spillnode = get_memory_edge(node); - spill_t *spill; assert(spillnode != NULL); /* walk upwards and collect all phis and spills on this way */ if (is_Phi(spillnode)) { - spill = collect_memphi(env, spillnode, mode, align); + collect_memphi(env, spillnode, mode, align); } else { - spill = collect_spill(env, spillnode, mode, align); + collect_spill(env, spillnode, mode, align); } ARR_APP1(ir_node *, env->reloads, node); @@ -367,7 +367,7 @@ static void do_greedy_coalescing(be_fec_env_t *env) DEBUG_ONLY( memset(spilllist, 0, spillcount * sizeof(spilllist[0])); - ); + ) i = 0; foreach_set(env->spills, spill_t*, spill) { @@ -522,17 +522,10 @@ static memperm_t *get_memperm(be_fec_env_t *env, ir_node *block) static ir_entity* create_stack_entity(be_fec_env_t *env, spill_slot_t *slot) { - ir_graph *irg = env->irg; - ir_type *frame = get_irg_frame_type(irg); - /* TODO: backend should be able to specify wether we want spill slots - * at begin or end of frame */ - int at_start = 1; - ir_entity *res = frame_alloc_area(frame, slot->size, slot->align, at_start); - - /* adjust size of the entity type... */ - ir_type *enttype = get_entity_type(res); - set_type_size_bytes(enttype, slot->size); - + ir_graph *irg = env->irg; + ir_type *frame = get_irg_frame_type(irg); + ir_entity *res = frame_alloc_area(frame, slot->size, slot->align, + env->at_begin); slot->entity = res; return res; @@ -624,7 +617,7 @@ static void assign_spillslots(be_fec_env_t *env) ir_node *block = get_nodes_block(node); /* should be a PhiM */ - assert(is_Phi(node)); + assert(get_irn_mode(node) == mode_M); for (i = 0, arity = get_irn_arity(node); i < arity; ++i) { ir_node *arg = get_irn_n(node, i); @@ -759,7 +752,7 @@ be_fec_env_t *be_new_frame_entity_coalescer(ir_graph *irg) { be_fec_env_t *env = XMALLOCZ(be_fec_env_t); - be_liveness_assure_chk(be_assure_liveness(irg)); + be_assure_live_chk(irg); obstack_init(&env->obst); env->irg = irg; @@ -783,9 +776,11 @@ void be_free_frame_entity_coalescer(be_fec_env_t *env) } void be_assign_entities(be_fec_env_t *env, - set_frame_entity_func set_frame_entity) + set_frame_entity_func set_frame_entity, + bool alloc_entities_at_begin) { env->set_frame_entity = set_frame_entity; + env->at_begin = alloc_entities_at_begin; stat_ev_dbl("spillslots", set_count(env->spills)); @@ -800,44 +795,7 @@ void be_assign_entities(be_fec_env_t *env, create_memperms(env); } -/** - * This walker function searches for reloads and collects all the spills - * and memphis attached to them. - */ -static void collect_spills_walker(ir_node *node, void *data) -{ - be_fec_env_t *env = (be_fec_env_t*)data; - const ir_mode *mode; - const arch_register_class_t *cls; - int align; - ir_graph *irg; - const arch_env_t *arch_env; - - if (! (arch_irn_classify(node) & arch_irn_class_reload)) - return; - - mode = get_irn_mode(node); - cls = arch_get_irn_reg_class_out(node); - irg = get_irn_irg(node); - arch_env = be_get_irg_arch_env(irg); - align = arch_env_get_reg_class_alignment(arch_env, cls); - - be_node_needs_frame_entity(env, node, mode, align); -} - -void be_coalesce_spillslots(ir_graph *irg) -{ - be_fec_env_t *env = be_new_frame_entity_coalescer(irg); - - /* collect reloads */ - irg_walk_graph(irg, NULL, collect_spills_walker, env); - - be_assign_entities(env, be_node_set_frame_entity); - - be_free_frame_entity_coalescer(env); -} - -BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots); +BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots) void be_init_spillslots(void) { FIRM_DBG_REGISTER(dbg, "firm.be.spillslots");