BugFix: when a node in schedule got exchanged, it is turned into Bad: do not set...
[libfirm] / ir / be / beifg_pointer.c
index cc709a1..fa9a1c2 100644 (file)
@@ -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 */