X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fopt%2Fscalar_replace.c;h=517d9b6126c6c5b42dab6b492ab07baf0d0cf4dd;hb=8a5ac70896b18a522fa39aad29b3c7cf36d5941e;hp=9041a6998aa5240b911c095b58941860124f4d76;hpb=f8cc15664f571aa7ef89d6f6bc8d5bd2b8ca7d53;p=libfirm diff --git a/ir/opt/scalar_replace.c b/ir/opt/scalar_replace.c index 9041a6998..517d9b612 100644 --- a/ir/opt/scalar_replace.c +++ b/ir/opt/scalar_replace.c @@ -46,7 +46,6 @@ #include "xmalloc.h" #include "debug.h" #include "error.h" -#include "opt_manage.h" static unsigned get_vnum(const ir_node *node) { @@ -367,7 +366,7 @@ static int find_possible_replacements(ir_graph *irg) ir_node *args; int j; - assure_irg_outs(inner_irg); + assure_irg_properties(inner_irg, IR_GRAPH_PROPERTY_CONSISTENT_OUTS); args = get_irg_args(inner_irg); for (j = get_irn_n_outs(args) - 1; j >= 0; --j) { ir_node *arg = get_irn_out(args, j); @@ -498,7 +497,7 @@ static unsigned allocate_value_numbers(pset *sels, ir_entity *ent, unsigned vnum pset_insert_ptr(sels, sel); key = find_path(sel, 0); - path = (path_t*)set_find(pathes, key, path_size(key), path_hash(key)); + path = set_find(path_t, pathes, key, path_size(key), path_hash(key)); if (path) { set_vnum(sel, path->vnum); @@ -506,7 +505,7 @@ static unsigned allocate_value_numbers(pset *sels, ir_entity *ent, unsigned vnum } else { key->vnum = vnum++; - set_insert(pathes, key, path_size(key), path_hash(key)); + set_insert(path_t, pathes, key, path_size(key), path_hash(key)); set_vnum(sel, key->vnum); DB((dbg, SET_LEVEL_3, " %+F represents value %u\n", sel, key->vnum)); @@ -677,17 +676,21 @@ static void do_scalar_replacements(ir_graph *irg, pset *sels, unsigned nvals, * * @param irg The current ir graph. */ -static ir_graph_state_t do_scalar_replacement(ir_graph *irg) +void scalar_replacement_opt(ir_graph *irg) { unsigned nvals; int i; - scalars_t key, *value; + scalars_t key; ir_node *irg_frame; ir_mode **modes; set *set_ent; pset *sels; ir_type *ent_type, *frame_tp; + assure_irg_properties(irg, + IR_GRAPH_PROPERTY_NO_UNREACHABLE_CODE + | IR_GRAPH_PROPERTY_CONSISTENT_OUTS); + /* we use the link field to store the VNUM */ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); irp_reserve_resources(irp, IRP_RESOURCE_ENTITY_LINK); @@ -722,7 +725,7 @@ static ir_graph_state_t do_scalar_replacement(ir_graph *irg) ent_type = get_entity_type(ent); key.ent = ent; - set_insert(set_ent, &key, sizeof(key), HASH_PTR(key.ent)); + set_insert(scalars_t, set_ent, &key, sizeof(key), hash_ptr(key.ent)); #ifdef DEBUG_libfirm if (is_Array_type(ent_type)) { @@ -746,7 +749,7 @@ static ir_graph_state_t do_scalar_replacement(ir_graph *irg) if (nvals > 0) { do_scalar_replacements(irg, sels, nvals, modes); - foreach_set(set_ent, scalars_t*, value) { + foreach_set(set_ent, scalars_t, value) { free_entity(value->ent); } @@ -764,25 +767,12 @@ static ir_graph_state_t do_scalar_replacement(ir_graph *irg) ir_free_resources(irg, IR_RESOURCE_IRN_LINK); irp_free_resources(irp, IRP_RESOURCE_ENTITY_LINK); - return 0; -} - -static optdesc_t opt_scalar_rep = { - "scalar-replace", - IR_GRAPH_STATE_NO_UNREACHABLE_CODE | IR_GRAPH_STATE_CONSISTENT_OUTS, - do_scalar_replacement, -}; - -int scalar_replacement_opt(ir_graph *irg) -{ - perform_irg_optimization(irg, &opt_scalar_rep); - return 1; + confirm_irg_properties(irg, IR_GRAPH_PROPERTIES_NONE); } ir_graph_pass_t *scalar_replacement_opt_pass(const char *name) { - return def_graph_pass_ret(name ? name : "scalar_rep", - scalar_replacement_opt); + return def_graph_pass(name ? name : "scalar_rep", scalar_replacement_opt); } void firm_init_scalar_replace(void)