X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fscalar_replace.c;h=33d7857d760e6e366f17213580b42bc80c56f405;hb=ec13ea5ad380f8ba5f1c50b0b0ece248faad79cd;hp=67be0499311fca08097886be3bd398e4e4965fa3;hpb=1a3b7d363474ab544c13093a2f0b578718d37c7a;p=libfirm diff --git a/ir/opt/scalar_replace.c b/ir/opt/scalar_replace.c index 67be04993..33d7857d7 100644 --- a/ir/opt/scalar_replace.c +++ b/ir/opt/scalar_replace.c @@ -332,26 +332,29 @@ static int find_possible_replacements(ir_graph *irg) { ir_node *irg_frame; ir_type *frame_tp; - int i, j, k, static_link_arg; + size_t mem_idx; + int i; + long static_link_arg; int res = 0; /* * First, clear the link field of all interesting entities. */ frame_tp = get_irg_frame_type(irg); - for (i = get_class_n_members(frame_tp) - 1; i >= 0; --i) { - ir_entity *ent = get_class_member(frame_tp, i); + for (mem_idx = get_class_n_members(frame_tp); mem_idx > 0;) { + ir_entity *ent = get_class_member(frame_tp, --mem_idx); set_entity_link(ent, NULL); } /* check for inner functions: * FIXME: need a way to get the argument position for the static link */ static_link_arg = 0; - for (i = get_class_n_members(frame_tp) - 1; i >= 0; --i) { - ir_entity *ent = get_class_member(frame_tp, i); + for (mem_idx = get_class_n_members(frame_tp); mem_idx > 0;) { + ir_entity *ent = get_class_member(frame_tp, --mem_idx); if (is_method_entity(ent)) { ir_graph *inner_irg = get_entity_irg(ent); ir_node *args; + int j; assure_irg_outs(inner_irg); args = get_irg_args(inner_irg); @@ -359,6 +362,7 @@ static int find_possible_replacements(ir_graph *irg) ir_node *arg = get_irn_out(args, j); if (get_Proj_proj(arg) == static_link_arg) { + int k; for (k = get_irn_n_outs(arg) - 1; k >= 0; --k) { ir_node *succ = get_irn_out(arg, k); @@ -604,11 +608,11 @@ static void topologic_walker(ir_node *node, void *ctx) val = new_rd_Conv(get_irn_dbg_info(node), block, val, mode); mem = get_Load_mem(node); - turn_into_tuple(node, pn_Load_max); + turn_into_tuple(node, pn_Load_max+1); set_Tuple_pred(node, pn_Load_M, mem); set_Tuple_pred(node, pn_Load_res, val); set_Tuple_pred(node, pn_Load_X_regular, new_r_Jmp(block)); - set_Tuple_pred(node, pn_Load_X_except, new_r_Bad(irg)); + set_Tuple_pred(node, pn_Load_X_except, new_r_Bad(irg, mode_X)); } else if (is_Store(node)) { DB((dbg, SET_LEVEL_3, " checking %+F for replacement ", node)); @@ -641,10 +645,10 @@ static void topologic_walker(ir_node *node, void *ctx) set_value(vnum, val); mem = get_Store_mem(node); - turn_into_tuple(node, pn_Store_max); + turn_into_tuple(node, pn_Store_max+1); set_Tuple_pred(node, pn_Store_M, mem); set_Tuple_pred(node, pn_Store_X_regular, new_r_Jmp(block)); - set_Tuple_pred(node, pn_Store_X_except, new_r_Bad(irg)); + set_Tuple_pred(node, pn_Store_X_except, new_r_Bad(irg, mode_X)); } } @@ -763,9 +767,6 @@ int scalar_replacement_opt(ir_graph *irg) * neither changed control flow, cf-backedges should be still * consistent. */ - set_irg_outs_inconsistent(irg); - set_irg_loopinfo_inconsistent(irg); - res = 1; } del_pset(sels);