X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fscalar_replace.c;h=d13f96e739d478e0574f9d0ba54d8b2f38dbe1b5;hb=b27ae245166bb695bc4e418ff416d91bc37d0f28;hp=99c0a709b6d8a587aabe1a267313c50acd2f9b6e;hpb=16fc4cdb8f7bc9d203f4e024d0bad50f79867c4f;p=libfirm diff --git a/ir/opt/scalar_replace.c b/ir/opt/scalar_replace.c index 99c0a709b..d13f96e73 100644 --- a/ir/opt/scalar_replace.c +++ b/ir/opt/scalar_replace.c @@ -172,7 +172,7 @@ static int check_load_store_mode(ir_mode *mode, ir_mode *ent_mode) /* * Returns non-zero, if the address of an entity - * represented by a Sel node (or it's successor Sels) is taken. + * represented by a Sel node (or its successor Sels) is taken. */ int is_address_taken(ir_node *sel) { @@ -321,7 +321,7 @@ static void *ADDRESS_TAKEN = &_x; * * This function finds variables on the (members of the) frame type * that can be scalar replaced, because their address is never taken. - * If such a variable is found, it's entity link will hold a list of all + * If such a variable is found, its entity link will hold a list of all * Sel nodes, that selects the atomic fields of this entity. * Otherwise, the link will be ADDRESS_TAKEN or NULL. * @@ -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); @@ -431,7 +435,7 @@ static int find_possible_replacements(ir_graph *irg) } /** - * Return a path from the Sel node sel to it's root. + * Return a path from the Sel node "sel" to its root. * * @param sel the Sel node * @param len the length of the path so far @@ -608,7 +612,7 @@ static void topologic_walker(ir_node *node, void *ctx) 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)); @@ -644,7 +648,7 @@ static void topologic_walker(ir_node *node, void *ctx) turn_into_tuple(node, pn_Store_max); 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);