X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillslots.c;h=e494adc4046da6fd21a4a05c14d880bba5aff471;hb=5cb14f12bacb0c7d1c646112b4660d57e14236a2;hp=43149be8388b8f23339bcad81cbbcccbd7cb2cf8;hpb=8ac3590c7251b05225fca87854b3915ef0374261;p=libfirm diff --git a/ir/be/bespillslots.c b/ir/be/bespillslots.c index 43149be83..e494adc40 100644 --- a/ir/be/bespillslots.c +++ b/ir/be/bespillslots.c @@ -127,12 +127,7 @@ static spill_t *collect_spill(be_fec_env_t *env, ir_node *node, const ir_mode *mode, int align) { spill_t spill, *res; - int hash; - - /* beware: although untypical there might be store nodes WITH Proj's, - vfisttp in ia32 for instance */ - node = skip_Proj(node); - hash = hash_irn(node); + int hash = hash_irn(node); /* insert into set of spills if not already there */ spill.spill = node; @@ -524,7 +519,10 @@ static ir_entity* create_stack_entity(be_fec_env_t *env, spill_slot_t *slot) { ir_graph *irg = be_get_birg_irg(env->birg); ir_type *frame = get_irg_frame_type(irg); - ir_entity *res = frame_alloc_area(frame, slot->size, slot->align, 0); + /* 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); @@ -573,6 +571,8 @@ static void assign_spill_entity(const arch_env_t *arch_env, ir_node *node, return; } + /* beware: we might have Stores with Memory Proj's, ia32 fisttp for instance */ + node = skip_Proj(node); assert(arch_get_frame_entity(arch_env, node) == NULL); arch_set_frame_entity(arch_env, node, entity); } @@ -668,7 +668,7 @@ static void assign_spillslots(be_fec_env_t *env) for(i = 0; i < ARR_LEN(env->reloads); ++i) { ir_node *reload = env->reloads[i]; - ir_node *spillnode = skip_Proj(get_memory_edge(reload)); + ir_node *spillnode = get_memory_edge(reload); spill_t *spill = get_spill(env, spillnode); const spill_slot_t *slot = & spillslots[spill->spillslot]; @@ -766,7 +766,7 @@ static int count_spillslots(const be_fec_env_t *env) be_fec_env_t *be_new_frame_entity_coalescer(be_irg_t *birg) { - const arch_env_t *arch_env = &birg->main_env->arch_env; + const arch_env_t *arch_env = birg->main_env->arch_env; be_fec_env_t *env = xmalloc(sizeof(env[0])); be_liveness_assure_chk(be_assure_liveness(birg)); @@ -829,7 +829,7 @@ static void collect_spills_walker(ir_node *node, void *data) mode = get_irn_mode(node); cls = arch_get_irn_reg_class(arch_env, node, -1); - align = arch_isa_get_reg_class_alignment(arch_env_get_isa(arch_env), cls); + align = arch_env_get_reg_class_alignment(arch_env, cls); be_node_needs_frame_entity(env, node, mode, align); }