X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fgarbage_collect.c;h=64c0a67cc61ccd9e1bd1b719d1229f64cabba99d;hb=b27ae245166bb695bc4e418ff416d91bc37d0f28;hp=44ca05c531e91c5b488912e604e29c2e847feb65;hpb=1a26f4853c07d1ecd68a097409dd602edfe29eff;p=libfirm diff --git a/ir/opt/garbage_collect.c b/ir/opt/garbage_collect.c index 44ca05c53..64c0a67cc 100644 --- a/ir/opt/garbage_collect.c +++ b/ir/opt/garbage_collect.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -65,7 +65,6 @@ static void start_visit_node(ir_node *node) if (get_irg_visited(irg) < get_max_irg_visited()) { set_irg_visited(irg, get_max_irg_visited()); } - current_ir_graph = irg; irg_walk_2(node, visit_node, NULL, NULL); } @@ -103,8 +102,8 @@ static void visit_entity(ir_entity *entity) if (entity->initializer != NULL) { visit_initializer(entity->initializer); } else if (entity_has_compound_ent_values(entity)) { - int i; - int n_members = get_compound_ent_n_values(entity); + size_t i; + size_t n_members = get_compound_ent_n_values(entity); for (i = 0; i < n_members; ++i) { ir_node *node = get_compound_ent_value(entity, i); start_visit_node(node); @@ -144,14 +143,13 @@ static void garbage_collect_in_segment(ir_type *segment) DB((dbg, LEVEL_1, " removing entity %+F\n", entity)); - /* TODO: this is O(n^2) improve our interfaces! */ - remove_class_member(get_entity_owner(entity), entity); + free_entity(entity); } } void garbage_collect_entities(void) { - int i; + size_t i; ir_segment_t s; FIRM_DBG_REGISTER(dbg, "firm.opt.garbagecollect"); @@ -171,14 +169,14 @@ void garbage_collect_entities(void) /* remove graphs of non-visited functions * (we have to count backwards so we can safely call remove_irp_irg * while iterating) */ - for (i = get_irp_n_irgs()-1; i >= 0; --i) { - ir_graph *irg = get_irp_irg(i); + for (i = get_irp_n_irgs(); i > 0;) { + ir_graph *irg = get_irp_irg(--i); ir_entity *entity = get_irg_entity(irg); if (entity_visited(entity)) continue; - DB((dbg, LEVEL_1, " freeing method %+F\n", entity)); + DB((dbg, LEVEL_1, " freeing method %+F\n", entity)); remove_irp_irg(irg); }