X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fldstopt.c;h=156293dee344ee9a638a5a31fedbcc577fc3d7fb;hb=eb7ac83b870791219e7a50cc262f2f1ee9c01b39;hp=57702882b449e626d3aeb5746a9025dd5b9cb559;hpb=7e0f6b334afb6aaeaf29c99d19bd404cd0dece15;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index 57702882b..156293dee 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 */ @@ -913,7 +913,7 @@ static int try_load_after_store(ir_node *load, /* no exception */ if (info->projs[pn_Load_X_except]) { ir_graph *irg = get_irn_irg(load); - exchange( info->projs[pn_Load_X_except], new_r_Bad(irg)); + exchange( info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X)); res |= CF_CHANGED; } if (info->projs[pn_Load_X_regular]) { @@ -1019,7 +1019,7 @@ static unsigned follow_Mem_chain(ir_node *load, ir_node *curr) /* no exception */ if (info->projs[pn_Load_X_except]) { ir_graph *irg = get_irn_irg(load); - exchange(info->projs[pn_Load_X_except], new_r_Bad(irg)); + exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X)); res |= CF_CHANGED; } if (info->projs[pn_Load_X_regular]) { @@ -1156,7 +1156,7 @@ static unsigned optimize_load(ir_node *load) /* no exception, clear the info field as it might be checked later again */ if (info->projs[pn_Load_X_except]) { ir_graph *irg = get_irn_irg(load); - exchange(info->projs[pn_Load_X_except], new_r_Bad(irg)); + exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X)); info->projs[pn_Load_X_except] = NULL; res |= CF_CHANGED; } @@ -1191,7 +1191,7 @@ static unsigned optimize_load(ir_node *load) /* we completely replace the load by this value */ if (info->projs[pn_Load_X_except]) { ir_graph *irg = get_irn_irg(load); - exchange(info->projs[pn_Load_X_except], new_r_Bad(irg)); + exchange(info->projs[pn_Load_X_except], new_r_Bad(irg, mode_X)); info->projs[pn_Load_X_except] = NULL; res |= CF_CHANGED; } @@ -1480,7 +1480,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,16 +1506,14 @@ 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; block = get_nodes_block(store); - /* abort on dead blocks */ - if (is_Block_dead(block)) - return 0; - /* check if the block is post dominated by Phi-block and has no exception exit */ bl_info = (block_info_t*)get_irn_link(block); @@ -1548,10 +1549,7 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv) if (exc != info->exc_block) return 0; - /* abort on dead blocks */ block = get_nodes_block(pred); - if (is_Block_dead(block)) - return 0; /* check if the block is post dominated by Phi-block and has no exception exit. Note that block must be different from @@ -1680,7 +1678,7 @@ static void do_load_store_optimize(ir_node *n, void *env) break; default: - ; + break; } } /* do_load_store_optimize */ @@ -1821,7 +1819,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; @@ -1877,7 +1874,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); @@ -2200,15 +2196,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"); } } @@ -2290,8 +2286,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) {