X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeifg_pointer.c;h=fa9a1c28179002b544fc18b180d06fc049b62895;hb=d14c6378674f36728eacaf5dc7e4bb045ff9fbab;hp=cc709a13fe10a96ca3906658648079bbcda4e586;hpb=489fc097405115e806d56e9d9073edb0559d62de;p=libfirm diff --git a/ir/be/beifg_pointer.c b/ir/be/beifg_pointer.c index cc709a13f..fa9a1c281 100644 --- a/ir/be/beifg_pointer.c +++ b/ir/be/beifg_pointer.c @@ -54,7 +54,6 @@ typedef struct _ifg_pointer_t { ptr_head_t *curr_ptr_head; ptr_element_t *curr_element; pmap *node_map; - bitset_t *visited_neighbours; } ifg_pointer_t; typedef struct _ptr_iter_t { @@ -66,11 +65,12 @@ typedef struct _ptr_iter_t { ir_node *curr_irn; int get_first; int sub_call; + bitset_t *visited_neighbours; } ptr_iter_t; /* PRIVATE FUNCTIONS */ -static void *ptr_irn_data_init(phase_t *ph, const ir_node *irn, void *data) +static void *ptr_irn_data_init(phase_t *ph, ir_node *irn, void *data) { ptr_head_t *head = phase_alloc(ph, sizeof(*head)); INIT_LIST_HEAD(&head->list); @@ -102,8 +102,11 @@ static void write_pointers(bitset_t *live, ifg_pointer_t *ifg) ptr_head_t *element = ptr_get_new_head(ifg); ir_node *irn = NULL; +#if 0 + // Matze: huh, what is this?!? node numbers aren't in any way deterministic AFAIK if (live_irn->node_nr == 1883 || live_irn->node_nr == 1858) irn = NULL; +#endif element->element = ifg->curr_element; /* write current highest sub-clique for each node */ list_add(&element->list, &head->list); @@ -192,10 +195,12 @@ static void find_neighbour_walker(ir_node *bl, void *data) { ir_node *irn = b->irn; ptr_element_t *element = NULL; - int i = 0; +#if 0 + // ?!? if (irn->node_nr == 1883 || irn->node_nr == 1858) i=1; +#endif if (b->is_def) /* b is a new node */ { @@ -219,8 +224,11 @@ static void find_neighbour_walker(ir_node *bl, void *data) element->content_second.irn = b->irn; element->kind = 8888; /* both are ir_nodes */ +#if 0 + // ?!? if (irn->node_nr == 1883 || irn->node_nr == 1858 || irn->node_nr == 1936) i=1; +#endif last_element.element = element; @@ -296,8 +304,11 @@ static void find_neighbour_walker(ir_node *bl, void *data) last_element.element = my_element; ifg->curr_element = my_element; +#if 0 + // ?!? if (my_irn->node_nr == 1883 || my_irn->node_nr == 1858 || my_irn->node_nr == 1936) i=1; +#endif first = NULL; @@ -394,14 +405,16 @@ static ir_node *get_next_neighbour(ptr_iter_t *it) ir_node *res; ptr_head_t *head; ptr_element_t *element; - static int i = 0; element = it->curr_element_t; if (element == NULL) { +#if 0 + // ?!? if (it->irn->node_nr == 1883 || it->irn->node_nr == 1858) i=1; +#endif if (it->curr_ptr_head->list.next != &it->first_head->list) { @@ -474,13 +487,13 @@ static ir_node *get_next_neighbour(ptr_iter_t *it) if (res && !it->sub_call) { - if (bitset_contains_irn(it->ifg->visited_neighbours, res) || res == it->irn) + if (bitset_contains_irn(it->visited_neighbours, res) || res == it->irn) { res = get_next_neighbour(it); } else { - bitset_set(it->ifg->visited_neighbours, get_irn_idx(res)); + bitset_set(it->visited_neighbours, get_irn_idx(res)); } } @@ -492,12 +505,14 @@ static ir_node *get_first_neighbour(const ifg_pointer_t *ifg, ptr_iter_t *it, co ir_node *res; ptr_head_t *head; ptr_element_t *element; + bitset_t *bitsetvisited_neighbours = bitset_malloc(get_irg_last_idx(ifg->env->irg)); it->ifg = ifg; it->irn = irn; it->get_first = 0; it->sub_call = 0; - bitset_clear_all(it->ifg->visited_neighbours); + + it->visited_neighbours = bitsetvisited_neighbours; head = phase_get_irn_data(&ifg->ph, irn); if (!head) @@ -569,13 +584,13 @@ static ir_node *get_first_neighbour(const ifg_pointer_t *ifg, ptr_iter_t *it, co if (res && !it->sub_call) { - if (bitset_contains_irn(it->ifg->visited_neighbours, res) || res == it->irn) + if (bitset_contains_irn(it->visited_neighbours, res) || res == it->irn) { res = get_next_neighbour(it); } else { - bitset_set(it->ifg->visited_neighbours, get_irn_idx(res)); + bitset_set(it->visited_neighbours, get_irn_idx(res)); } } @@ -592,13 +607,12 @@ static void ifg_pointer_free(void *self) obstack_free(&ifg->obst, NULL); phase_free(&ifg->ph); - bitset_free(ifg->visited_neighbours); - free(self); } -static int ifg_pointer_connected(const ifg_pointer_t *ifg, const ir_node *a, const ir_node *b) +static int ifg_pointer_connected(const void *self, const ir_node *a, const ir_node *b) { + const ifg_pointer_t *ifg = self; int connected = -1; ptr_iter_t it; ir_node *irn = NULL; @@ -630,6 +644,10 @@ static ir_node *ifg_pointer_neighbours_next(const void *self, void *iter) static void ifg_pointer_neighbours_break(const void *self, void *iter) { + ptr_iter_t *it = iter; + + bitset_free(it->visited_neighbours); + return; } @@ -685,10 +703,8 @@ static const be_ifg_impl_t ifg_pointer_impl = { be_ifg_t *be_ifg_pointer_new(const be_chordal_env_t *env) { ifg_pointer_t *ifg = xmalloc(sizeof(*ifg)); - bitset_t *bitsetvisited_neighbours = bitset_malloc(get_irg_last_idx(env->irg)); ifg->impl = &ifg_pointer_impl; ifg->env = env; - ifg->visited_neighbours = bitsetvisited_neighbours; ifg->node_map = pmap_create(); /* to find all nodes, should be replaced by a "keywalker" of irphase */