X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillslots.c;h=b3fa6f9211951d84c3b0bacb829f8878d353f626;hb=bdc59608633f59b0541a04883c24d19b1bc0ffae;hp=2239e2913302bbc1575422662121151e4fd0f12c;hpb=16fc4cdb8f7bc9d203f4e024d0bad50f79867c4f;p=libfirm diff --git a/ir/be/bespillslots.c b/ir/be/bespillslots.c index 2239e2913..b3fa6f921 100644 --- a/ir/be/bespillslots.c +++ b/ir/be/bespillslots.c @@ -74,6 +74,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) */ @@ -522,12 +524,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); + 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); /* adjust size of the entity type... */ ir_type *enttype = get_entity_type(res); @@ -783,9 +783,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 +802,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");