X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fdead_code_elimination.c;h=b9876ee996c7f4d7cb0e5ff3185dc23922ad283b;hb=3398ae4a8b3cbf66cb0b274ddcd85a2ea863ece1;hp=924ff3cd417af61cdae0200b9f87f2d7b185efc0;hpb=94e9283b212f0f10b460248de945576a0bb61703;p=libfirm diff --git a/ir/opt/dead_code_elimination.c b/ir/opt/dead_code_elimination.c index 924ff3cd4..b9876ee99 100644 --- a/ir/opt/dead_code_elimination.c +++ b/ir/opt/dead_code_elimination.c @@ -47,7 +47,7 @@ #include "pmap.h" /** a pointer to the new phases */ -static ir_phase *new_phases[PHASE_LAST]; +static ir_phase *new_phases[PHASE_LAST + 1]; /** * Reroute the inputs of a node from nodes in the old graph to copied nodes in @@ -61,17 +61,17 @@ 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 = PHASE_NOT_IRG_MANAGED+1; i < PHASE_LAST; i++) { - ir_phase *phase = get_irg_phase(irg, i); + for (i = PHASE_FIRST; i <= PHASE_LAST; ++i) { + ir_phase *phase = irg_get_phase(irg, i); if (phase == NULL) continue; if (!phase_get_irn_data(phase, node)) @@ -85,27 +85,26 @@ 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 */ - for (i = PHASE_NOT_IRG_MANAGED+1; i < PHASE_LAST; i++) { - ir_phase *old_ph = get_irg_phase(irg, i); + /* TODO: this is wrong, it should only allocate a new data_ptr inside + * the phase! */ + 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; } else { - new_phases[i] = xmalloc(sizeof(ir_phase)); - phase_init(new_phases[i], "", irg, old_ph->growth_factor, - old_ph->data_init, old_ph->priv); + new_phases[i] = new_phase(irg, old_ph->data_init); + new_phases[i]->priv = old_ph->priv; } } @@ -113,17 +112,20 @@ 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 = PHASE_NOT_IRG_MANAGED+1; i < PHASE_LAST; i++) { - ir_phase *old_ph = get_irg_phase(irg, i); + for (i = PHASE_FIRST; i <= PHASE_LAST; ++i) { + ir_phase *old_ph = irg_get_phase(irg, i); if (old_ph == NULL) continue; - free_irg_phase(irg, i); + /* Matze: commented out for now: This is a memory leak, but for a real + * fix we must not create new phases here, but reuse the old phases + * and just create a new data array */ + /* phase_free(old_ph); */ irg->phases[i] = new_phases[i]; } } @@ -138,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; @@ -150,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 */ @@ -177,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); @@ -189,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) @@ -208,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; @@ -222,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. */ @@ -248,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. */ @@ -310,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;