X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fldstopt.c;h=c8552d610912828c0a002127eb1f87de6f632672;hb=b27ae245166bb695bc4e418ff416d91bc37d0f28;hp=fe175a9ce400bd3496124b19fb87013e3f7f8b9c;hpb=99253d30b9d32d58de6411b583dce72ede4261fd;p=libfirm diff --git a/ir/opt/ldstopt.c b/ir/opt/ldstopt.c index fe175a9ce..c8552d610 100644 --- a/ir/opt/ldstopt.c +++ b/ir/opt/ldstopt.c @@ -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 */ @@ -709,8 +709,7 @@ static void handle_load_update(ir_node *load) ir_node *mem = get_Load_mem(load); /* a Load whose value is neither used nor exception checked, remove it */ - if (info->projs[pn_Load_M]) - exchange(info->projs[pn_Load_M], mem); + exchange(info->projs[pn_Load_M], mem); if (info->projs[pn_Load_X_regular]) exchange(info->projs[pn_Load_X_regular], new_r_Jmp(get_nodes_block(load))); kill_node(load); @@ -914,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]) { @@ -1020,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]) { @@ -1157,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; } @@ -1192,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; } @@ -1510,10 +1509,6 @@ static unsigned optimize_phi(ir_node *phi, walk_env_t *wenv) 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); @@ -1549,10 +1544,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 @@ -1927,7 +1919,12 @@ static void move_loads_out_of_loops(scc *pscc, loop_env *env) ninfo = get_ldst_info(irn, phase_obst(&env->ph)); ninfo->projs[pn_Load_M] = mem = new_r_Proj(irn, mode_M, pn_Load_M); - set_Phi_pred(phi, pos, mem); + if (res == NULL) { + /* irn is from cache, so do not set phi pred again. + * There might be other Loads between phi and irn already. + */ + set_Phi_pred(phi, pos, mem); + } ninfo->projs[pn_Load_res] = new_r_Proj(irn, load_mode, pn_Load_res); } @@ -2286,8 +2283,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) {