8 #include "survive_dce.h"
10 struct _survive_dce_t {
13 hook_entry_t dead_node_elim;
14 hook_entry_t dead_node_elim_subst;
17 static void dead_node_hook(void *context, ir_graph *irg, int start)
19 survive_dce_t *sd = context;
21 /* Create a new map before the dead node elimination is performed. */
23 sd->new_places = pmap_create_ex(pmap_count(sd->places));
26 /* Patch back all nodes if dead node elimination is over and something is to be done. */
28 pmap_destroy(sd->places);
29 sd->places = sd->new_places;
30 sd->new_places = NULL;
34 static void dead_node_subst_hook(void *context, ir_graph *irg, ir_node *old, ir_node *nw)
36 survive_dce_t *sd = context;
37 ir_node **place = (ir_node **) pmap_get(sd->places, old);
39 /* If the node is to be patched back, do it. */
42 pmap_insert(sd->new_places, nw, (void *) place);
46 survive_dce_t *new_survive_dce(void)
48 survive_dce_t *res = xmalloc(sizeof(res[0]));
49 res->places = pmap_create();
50 res->new_places = NULL;
52 res->dead_node_elim.hook._hook_dead_node_elim = dead_node_hook;
53 res->dead_node_elim.context = res;
54 res->dead_node_elim.next = NULL;
56 res->dead_node_elim_subst.hook._hook_dead_node_elim_subst = dead_node_subst_hook;
57 res->dead_node_elim_subst.context = res;
58 res->dead_node_elim_subst.next = NULL;
60 register_hook(hook_dead_node_elim, &res->dead_node_elim);
61 register_hook(hook_dead_node_elim_subst, &res->dead_node_elim_subst);
65 void free_survive_dce(survive_dce_t *sd)
67 pmap_destroy(sd->places);
68 unregister_hook(hook_dead_node_elim, &sd->dead_node_elim);
69 unregister_hook(hook_dead_node_elim_subst, &sd->dead_node_elim_subst);
73 void survive_dce_register_irn(survive_dce_t *sd, ir_node **place)
75 pmap_insert(sd->places, *place, (void *) place);