X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fdead_code_elimination.c;h=b9876ee996c7f4d7cb0e5ff3185dc23922ad283b;hb=b42d141b27222454d6176f233327c594d71be554;hp=e7169edee3dc68d24157e724be07068d4e71d9e6;hpb=0abdfaef9eeb4e1461d118e760f0132aedfc2eb4;p=libfirm diff --git a/ir/opt/dead_code_elimination.c b/ir/opt/dead_code_elimination.c index e7169edee..b9876ee99 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; @@ -85,22 +85,20 @@ static void copy_node_dce(ir_node *node, void *env) } /** - * Copies the graph reachable from current_ir_graph->end to the obstack - * in current_ir_graph and fixes the environment. - * Then fixes the fields in current_ir_graph containing nodes of the - * graph. + * Copies the graph reachable from the End node to the obstack + * in irg. Then fixes the fields containing nodes of the graph. * * @param copy_node_nr If non-zero, the node number will be copied */ 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; @@ -114,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; @@ -142,10 +140,6 @@ static void copy_graph_env(ir_graph *irg) */ void dead_node_elimination(ir_graph *irg) { - ir_graph *rem; -#ifdef INTERPROCEDURAL_VIEW - int rem_ipview = get_interprocedural_view(); -#endif struct obstack *graveyard_obst = NULL; struct obstack *rebirth_obst = NULL; @@ -154,13 +148,6 @@ void dead_node_elimination(ir_graph *irg) /* inform statistics that we started a dead-node elimination run */ hook_dead_node_elim(irg, 1); - /* Remember external state of current_ir_graph. */ - rem = current_ir_graph; - current_ir_graph = irg; -#ifdef INTERPROCEDURAL_VIEW - set_interprocedural_view(0); -#endif - assert(get_irg_phase_state(irg) != phase_building); /* Handle graph state */ @@ -181,8 +168,7 @@ void dead_node_elimination(ir_graph *irg) irg->last_node_idx = 0; /* We also need a new value table for CSE */ - del_identities(irg->value_table); - irg->value_table = new_identities(); + new_identities(irg); /* Copy the graph from the old to the new obstack */ copy_graph_env(irg); @@ -193,11 +179,6 @@ void dead_node_elimination(ir_graph *irg) /* inform statistics that the run is over */ hook_dead_node_elim(irg, 0); - - current_ir_graph = rem; -#ifdef INTERPROCEDURAL_VIEW - set_interprocedural_view(rem_ipview); -#endif } ir_graph_pass_t *dead_node_elimination_pass(const char *name) @@ -212,13 +193,13 @@ ir_graph_pass_t *dead_node_elimination_pass(const char *name) __)|_| | \_/ | \_/(/_ |_/\__|__ The following stuff implements a facility that automatically patches - registered ir_node pointers to the new node when a dead node elimination occurs. - + 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 survive_dce_t { struct obstack obst; pmap *places; pmap *new_places; @@ -226,14 +207,14 @@ struct _survive_dce_t { hook_entry_t dead_node_elim_subst; }; -typedef struct _survive_dce_list_t { - struct _survive_dce_list_t *next; +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; + survive_dce_t *sd = (survive_dce_t*)context; (void) irg; /* Create a new map before the dead node elimination is performed. */ @@ -252,8 +233,8 @@ static void dead_node_hook(void *context, ir_graph *irg, int start) */ 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); + survive_dce_t *sd = (survive_dce_t*)context; + survive_dce_list_t *list = (survive_dce_list_t*)pmap_get(sd->places, old); (void) irg; /* If the node is to be patched back, write the new address to all registered locations. */ @@ -314,7 +295,7 @@ 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 *curr = (survive_dce_list_t*)pmap_get(sd->places, irn); survive_dce_list_t *nw = OALLOC(&sd->obst, survive_dce_list_t); nw->next = curr;