X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fdead_code_elimination.c;h=50fdf20d757816d433465a89844695f099a4a038;hb=b27ae245166bb695bc4e418ff416d91bc37d0f28;hp=26bccee56d23109e1b9a943052db16400dbf1466;hpb=842280b66974a618f663838a489fd5059300e3b0;p=libfirm diff --git a/ir/opt/dead_code_elimination.c b/ir/opt/dead_code_elimination.c index 26bccee56..50fdf20d7 100644 --- a/ir/opt/dead_code_elimination.c +++ b/ir/opt/dead_code_elimination.c @@ -61,16 +61,16 @@ static void rewire_inputs(ir_node *node, void *env) static void copy_node_dce(ir_node *node, void *env) { - int i; - ir_node *new_node = exact_copy(node); - ir_graph *irg = get_irn_irg(new_node); + ir_phase_id i; + ir_node *new_node = exact_copy(node); + ir_graph *irg = get_irn_irg(new_node); (void) env; /* preserve the node numbers for easier debugging */ new_node->node_nr = node->node_nr; /* copy phase information for this node */ - for (i = 0; i <= PHASE_LAST; i++) { + for (i = PHASE_FIRST; i <= PHASE_LAST; ++i) { ir_phase *phase = irg_get_phase(irg, i); if (phase == NULL) continue; @@ -92,13 +92,13 @@ static void copy_node_dce(ir_node *node, void *env) */ static void copy_graph_env(ir_graph *irg) { - ir_node *new_anchor; - int i; + ir_node *new_anchor; + ir_phase_id i; /* init the new_phases array */ /* TODO: this is wrong, it should only allocate a new data_ptr inside * the phase! */ - for (i = 0; i <= PHASE_LAST; i++) { + for (i = PHASE_FIRST; i <= PHASE_LAST; ++i) { ir_phase *old_ph = irg_get_phase(irg, i); if (old_ph == NULL) { new_phases[i] = NULL; @@ -112,12 +112,12 @@ static void copy_graph_env(ir_graph *irg) irg_walk_anchors(irg, copy_node_dce, rewire_inputs, NULL); /* fix the anchor */ - new_anchor = get_irn_link(irg->anchor); + new_anchor = (ir_node*)get_irn_link(irg->anchor); assert(new_anchor != NULL); irg->anchor = new_anchor; /* copy the new phases into the irg */ - for (i = 0; i <= PHASE_LAST; i++) { + for (i = PHASE_FIRST; i <= PHASE_LAST; ++i) { ir_phase *old_ph = irg_get_phase(irg, i); if (old_ph == NULL) continue; @@ -185,122 +185,3 @@ ir_graph_pass_t *dead_node_elimination_pass(const char *name) { return def_graph_pass(name ? name : "dce", dead_node_elimination); } - - -/* - __ _ __ __ - (_ __ o _ | \/ |_ - __)|_| | \_/ | \_/(/_ |_/\__|__ - - The following stuff implements a facility that automatically patches - registered ir_node pointers to the new node when a dead node elimination - occurs. - - Warning: This is considered a hack - try hard to avoid this! -*/ - -struct survive_dce_t { - struct obstack obst; - pmap *places; - pmap *new_places; - hook_entry_t dead_node_elim; - hook_entry_t dead_node_elim_subst; -}; - -typedef struct survive_dce_list_t { - struct survive_dce_list_t *next; - ir_node **place; -} survive_dce_list_t; - -static void dead_node_hook(void *context, ir_graph *irg, int start) -{ - survive_dce_t *sd = context; - (void) irg; - - /* Create a new map before the dead node elimination is performed. */ - if (start) { - sd->new_places = pmap_create_ex(pmap_count(sd->places)); - } else { - /* Patch back all nodes if dead node elimination is over and something is to be done. */ - pmap_destroy(sd->places); - sd->places = sd->new_places; - sd->new_places = NULL; - } -} - -/** - * Hook called when dead node elimination replaces old by nw. - */ -static void dead_node_subst_hook(void *context, ir_graph *irg, ir_node *old, ir_node *nw) -{ - survive_dce_t *sd = context; - survive_dce_list_t *list = pmap_get(sd->places, old); - (void) irg; - - /* If the node is to be patched back, write the new address to all registered locations. */ - if (list) { - survive_dce_list_t *p; - - for (p = list; p; p = p->next) - *(p->place) = nw; - - pmap_insert(sd->new_places, nw, list); - } -} - -/** - * Make a new Survive DCE environment. - */ -survive_dce_t *new_survive_dce(void) -{ - survive_dce_t *res = XMALLOC(survive_dce_t); - obstack_init(&res->obst); - res->places = pmap_create(); - res->new_places = NULL; - - res->dead_node_elim.hook._hook_dead_node_elim = dead_node_hook; - res->dead_node_elim.context = res; - res->dead_node_elim.next = NULL; - - res->dead_node_elim_subst.hook._hook_dead_node_elim_subst = dead_node_subst_hook; - res->dead_node_elim_subst.context = res; - res->dead_node_elim_subst.next = NULL; - - register_hook(hook_dead_node_elim, &res->dead_node_elim); - register_hook(hook_dead_node_elim_subst, &res->dead_node_elim_subst); - return res; -} - -/** - * Free a Survive DCE environment. - */ -void free_survive_dce(survive_dce_t *sd) -{ - obstack_free(&sd->obst, NULL); - pmap_destroy(sd->places); - unregister_hook(hook_dead_node_elim, &sd->dead_node_elim); - unregister_hook(hook_dead_node_elim_subst, &sd->dead_node_elim_subst); - xfree(sd); -} - -/** - * Register a node pointer to be patched upon DCE. - * When DCE occurs, the node pointer specified by @p place will be - * patched to the new address of the node it is pointing to. - * - * @param sd The Survive DCE environment. - * @param place The address of the node pointer. - */ -void survive_dce_register_irn(survive_dce_t *sd, ir_node **place) -{ - if (*place != NULL) { - ir_node *irn = *place; - survive_dce_list_t *curr = pmap_get(sd->places, irn); - survive_dce_list_t *nw = OALLOC(&sd->obst, survive_dce_list_t); - - nw->next = curr; - nw->place = place; - - pmap_insert(sd->places, irn, nw); - } -}