X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fldstopt.c;h=0416d5ac6ac03a98e140a40bdd92e9ca7953662e;hb=762b472fc81c73cf7a1b0041b8cd286b7206d79d;hp=f6f4f2fa3e01d0c8a6c72425a7296bfff85adc6d;hpb=6f068af98daa4725d60e5d23a8f98ec2841cfa44;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index f6f4f2fa3..0416d5ac6 100644 --- a/ir/opt/ldstopt.c +++ b/ir/opt/ldstopt.c @@ -74,7 +74,7 @@ typedef struct walk_env_t { /** A Load/Store info. */ typedef struct ldst_info_t { - ir_node *projs[MAX_PROJ]; /**< list of Proj's of this node */ + ir_node *projs[MAX_PROJ+1]; /**< list of Proj's of this node */ ir_node *exc_block; /**< the exception block if available */ int exc_idx; /**< predecessor index in the exception block */ unsigned visited; /**< visited counter for breaking loops */ @@ -215,7 +215,7 @@ static void collect_nodes(ir_node *node, void *env) if (is_Proj(proj)) { pred = get_Proj_pred(proj); - is_exc = get_Proj_proj(proj) == pn_Generic_X_except; + is_exc = is_x_except_Proj(proj); } /* ignore Bad predecessors, they will be removed later */ @@ -1096,8 +1096,9 @@ ir_node *can_replace_load_by_const(const ir_node *load, ir_node *c) if (is_reinterpret_cast(c_mode, l_mode)) { /* copy the value from the const code irg and cast it */ res = new_rd_Conv(dbgi, block, res, l_mode); + } else { + return NULL; } - return NULL; } return res; } @@ -1167,7 +1168,7 @@ static unsigned optimize_load(ir_node *load) } if (get_entity_linkage(ent) & IR_LINKAGE_CONSTANT) { - if (ent->initializer != NULL) { + if (has_entity_initializer(ent)) { /* new style initializer */ value = find_compound_ent_value(ptr); } else if (entity_has_compound_ent_values(ent)) { @@ -1480,7 +1481,10 @@ static unsigned optimize_store(ir_node *store) static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv) { int i, n; - ir_node *store, *old_store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM; + ir_node *store, *ptr, *block, *phi_block, *phiM, *phiD, *exc, *projM; +#ifdef DO_CACHEOPT + ir_node *old_store; +#endif ir_mode *mode; ir_node **inM, **inD, **projMs; int *idx; @@ -1503,7 +1507,9 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv) return 0; store = skip_Proj(projM); +#ifdef DO_CACHEOPT old_store = store; +#endif if (!is_Store(store)) return 0; @@ -1673,7 +1679,7 @@ static void do_load_store_optimize(ir_node *n, void *env) break; default: - ; + break; } } /* do_load_store_optimize */ @@ -1814,7 +1820,6 @@ static unsigned hash_cache_entry(const avail_entry_t *entry) static void move_loads_out_of_loops(scc *pscc, loop_env *env) { ir_node *phi, *load, *next, *other, *next_other; - ir_entity *ent; int j; phi_entry *phi_list = NULL; set *avail; @@ -1847,10 +1852,8 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) } } } - - /* Within unreachable code, there might be memory loops without Phis. */ - if (phi_list == NULL) - return; + /* no Phis no fun */ + assert(phi_list != NULL && "DFS found a loop without Phi"); /* for now, we cannot handle more than one input (only reducible cf) */ if (phi_list->next != NULL) @@ -1872,7 +1875,6 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) /* for now, we can only move Load(Global) */ if (! is_Global(ptr)) continue; - ent = get_Global_entity(ptr); load_mode = get_Load_mode(load); for (other = pscc->head; other != NULL; other = next_other) { node_entry *ne = get_irn_ne(other, env); @@ -2195,15 +2197,15 @@ static void do_dfs(ir_graph *irg, loop_env *env) ir_node *pred = get_Block_cfgpred(endblk, i); pred = skip_Proj(pred); - if (is_Return(pred)) + if (is_Return(pred)) { dfs(get_Return_mem(pred), env); - else if (is_Raise(pred)) + } else if (is_Raise(pred)) { dfs(get_Raise_mem(pred), env); - else if (is_fragile_op(pred)) + } else if (is_fragile_op(pred)) { dfs(get_fragile_op_mem(pred), env); - else if (is_Bad(pred)) - /* ignore non-optimized block predecessor */; - else { + } else if (is_Bad(pred)) { + /* ignore non-optimized block predecessor */ + } else { assert(0 && "Unknown EndBlock predecessor"); } } @@ -2285,8 +2287,8 @@ int 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); + edges_deactivate(irg); } if (env.changes & CF_CHANGED) {