X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fopt%2Fldstopt.c;h=91347a7bea9076376bfdfabd3af816ae9dc332fa;hb=44faeb9742640d3498eb4482f98eb1255607c4d6;hp=f4ba1f9e7a4fcfd3d50aefc65ff1e21749e939ef;hpb=a0558037959cb4eb9be2ea670974119b370fc8c5;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index f4ba1f9e7..91347a7be 100644 --- a/ir/opt/ldstopt.c +++ b/ir/opt/ldstopt.c @@ -386,11 +386,12 @@ static compound_graph_path *rec_get_accessed_path(ir_node *ptr, int depth) { set_compound_graph_path_array_index(res, pos, get_Sel_array_index_long(ptr, 0)); } } else if (is_Add(ptr)) { - ir_node *l = get_Add_left(ptr); - ir_node *r = get_Add_right(ptr); - ir_mode *mode; + ir_node *l = get_Add_left(ptr); + ir_node *r = get_Add_right(ptr); + ir_mode *mode = get_irn_mode(ptr); + tarval *tmp; - if (is_Const(r)) { + if (is_Const(r) && get_irn_mode(l) == mode) { ptr = l; tv = get_Const_tarval(r); } else { @@ -399,6 +400,7 @@ static compound_graph_path *rec_get_accessed_path(ir_node *ptr, int depth) { } ptr_arith: mode = get_tarval_mode(tv); + tmp = tv; /* ptr must be a Sel or a SymConst, this was checked in find_constant_entity() */ if (is_Sel(ptr)) { @@ -419,10 +421,10 @@ ptr_arith: size = get_type_size_bytes(get_entity_type(ent)); sz = new_tarval_from_long(size, mode); - tv_index = tarval_div(tv, sz); - tv = tarval_mod(tv, sz); + tv_index = tarval_div(tmp, sz); + tmp = tarval_mod(tmp, sz); - if (tv_index == tarval_bad || tv == tarval_bad) + if (tv_index == tarval_bad || tmp == tarval_bad) return NULL; assert(get_array_n_dimensions(tp) == 1 && "multiarrays not implemented"); @@ -442,7 +444,7 @@ ptr_arith: /* ok, bounds check finished */ ++idx; } - if (! tarval_is_null(tv)) { + if (! tarval_is_null(tmp)) { /* access to some struct/union member */ return NULL; } @@ -500,7 +502,8 @@ ptr_arith: * valid, if the graph is in phase_high and _no_ address computation is used. */ static compound_graph_path *get_accessed_path(ir_node *ptr) { - return rec_get_accessed_path(ptr, 0); + compound_graph_path *gr = rec_get_accessed_path(ptr, 0); + return gr; } /* get_accessed_path */ typedef struct path_entry { @@ -1188,6 +1191,7 @@ static unsigned optimize_load(ir_node *load) assert(is_proper_compound_graph_path(path, get_compound_graph_path_length(path)-1)); value = get_compound_ent_value_by_path(ent, path); + DB((dbg, LEVEL_1, " Constant access at %F%F resulted in %+F\n", ent, path, value)); free_compound_graph_path(path); } } @@ -1398,7 +1402,7 @@ static unsigned optimize_store(ir_node *store) { entity = find_entity(ptr); /* a store to an entity which is never read is unnecessary */ - if (!(get_entity_usage(entity) & ir_usage_read)) { + if (entity != NULL && !(get_entity_usage(entity) & ir_usage_read)) { ldst_info_t *info = get_irn_link(store); if (info->projs[pn_Store_X_except] == NULL) { exchange(info->projs[pn_Store_M], get_Store_mem(store)); @@ -2209,6 +2213,7 @@ void optimize_load_store(ir_graph *irg) { /* Handle graph state */ if (env.changes) { set_irg_outs_inconsistent(irg); + set_irg_entity_usage_state(irg, ir_entity_usage_not_computed); } if (env.changes & CF_CHANGED) {