start register allocator again, fix typo
[libfirm] / ir / be / beifg_clique.c
index af9c4d5..778d0b1 100644 (file)
@@ -38,8 +38,6 @@ typedef struct _ifg_clique_t {
        cli_head_t *cli_root;
        struct obstack obst;
        cli_head_t *curr_cli_head;
-       bitset_t *visited_nodes;
-       bitset_t *visited_neighbours;
 } ifg_clique_t;
 
 typedef struct _cli_element_t {
@@ -48,10 +46,12 @@ typedef struct _cli_element_t {
 } cli_element_t;
 
 typedef struct _cli_iter_t {
-       ifg_clique_t *ifg;
+       const ifg_clique_t *ifg;
        cli_head_t *curr_cli_head;
        cli_element_t *curr_cli_element;
        const ir_node *curr_irn;
+       bitset_t *visited_neighbours;
+       bitset_t *visited_nodes;
 } cli_iter_t;
 
 /* PRIVATE FUNCTIONS */
@@ -168,9 +168,6 @@ static cli_head_t *get_next_cli_head(const ir_node *irn, cli_iter_t *it) /* ...c
        is_dominated_by_max = value_dominates(head->max, irn);
        //dominates_min = value_dominates(irn, head->min);
 
-       if(head->min->node_nr == 2000)
-               assert("stop");
-
        if ((is_dominated_by_max) || (irn == head->max)) /* node could be in clique */
        {
                /* check if node is in clique */
@@ -238,12 +235,13 @@ static void find_nodes(const ifg_clique_t *ifg, cli_iter_t *it)
        cli_element_t *element;
        cli_head_t *cli_head = ifg->cli_root;
 
-       bitset_clear_all(ifg->visited_nodes);
-
-       assert(cli_head && "There is no root entry to work on!");
+       bitset_t *bitset_visnodes = bitset_malloc(get_irg_last_idx(ifg->env->irg));
 
+       it->visited_nodes = bitset_visnodes;
        it->curr_cli_head = cli_head;
 
+       assert(cli_head && "There is no root entry to work on!");
+
        if (cli_head->list.next != &cli_head->list) /* if cli_head contains an element */
        {
                element = list_entry(cli_head->list.next, cli_element_t, list);
@@ -289,13 +287,13 @@ static ir_node *get_next_node(cli_iter_t *it)
        }
        if (!(irn == NULL))
        {
-               if (bitset_is_set(it->ifg->visited_nodes, get_irn_idx(irn)))
+               if (bitset_is_set(it->visited_nodes, get_irn_idx(irn)))
                {
                        irn = get_next_node(it);
                }
                if (!(irn == NULL))
                {
-                       bitset_set(it->ifg->visited_nodes, get_irn_idx(irn));
+                       bitset_set(it->visited_nodes, get_irn_idx(irn));
                }
        }
 
@@ -315,9 +313,6 @@ static void find_neighbour_walker(ir_node *bl, void *data)
        foreach_border_head(head, b) /* follow the borders of the block */
        {
                ir_node *irn = b->irn;
-//
-//             if (b->irn->node_nr == 1869)
-//                     printf("");
 
                if (b->is_def) /* b is a new node */
                {
@@ -344,6 +339,7 @@ static void find_first_neighbour(const ifg_clique_t *ifg, cli_iter_t *it, const
 {
        cli_head_t *cli_head = ifg->cli_root;
        cli_element_t *element;
+       bitset_t *bitset_visneighbours = bitset_malloc(get_irg_last_idx(ifg->env->irg));
 
        int is_dominated_by_max = 0;
        int dominates_min = 0;
@@ -351,7 +347,7 @@ static void find_first_neighbour(const ifg_clique_t *ifg, cli_iter_t *it, const
 
        it->curr_cli_head = cli_head;
        it->ifg = ifg;
-       bitset_clear_all(it->ifg->visited_neighbours);
+       it->visited_neighbours = bitset_visneighbours;
 
        assert(cli_head && "There is no root entry for a cli_head.");
 
@@ -363,15 +359,12 @@ static void find_first_neighbour(const ifg_clique_t *ifg, cli_iter_t *it, const
                /* check if node is in clique */
                list_for_each_entry(cli_element_t, element, &cli_head->list, list)
                {
-                       if (&element->list != &cli_head->list)
+                       if (element->irn == irn) /* node is in clique */
                        {
-                               if (element->irn == irn)
-                               { /* node is in clique */
-                                       it->curr_cli_element = (void *) cli_head; /* needed because the next element is searched with list.next of it->curr_cli_element */
-                                       is_in_clique = 1;
-                                       element = get_next_element(irn, it);
-                                       break;
-                               }
+                               it->curr_cli_element = (void *) cli_head; /* needed because the next element is searched with list.next of it->curr_cli_element */
+                               is_in_clique = 1;
+                               element = get_next_element(irn, it);
+                               break;
                        }
                }
        }
@@ -390,7 +383,6 @@ static void find_first_neighbour(const ifg_clique_t *ifg, cli_iter_t *it, const
 static ir_node *get_next_neighbour(cli_iter_t *it)
 {
        ir_node *res = NULL;
-       cli_head_t *cli_head = it->curr_cli_head;
        const ir_node *irn = it->curr_irn;
 
        if (it->curr_cli_element != NULL)
@@ -402,13 +394,13 @@ static ir_node *get_next_neighbour(cli_iter_t *it)
 
        if (res)
        {
-               if (bitset_contains_irn(it->ifg->visited_neighbours, res))
+               if (bitset_contains_irn(it->visited_neighbours, res))
                {
                        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));
                }
        }
 
@@ -426,8 +418,9 @@ static void ifg_clique_free(void *self)
        free(self);
 }
 
-static int ifg_clique_connected(const ifg_clique_t *ifg, const ir_node *a, const ir_node *b)
+static int ifg_clique_connected(const void *self, const ir_node *a, const ir_node *b)
 {
+       const ifg_clique_t *ifg = self;
        cli_iter_t it;
        int connected = -1;
        ir_node *irn = NULL;
@@ -461,6 +454,10 @@ static ir_node *ifg_clique_neighbours_next(const void *self, void *iter)
 
 static void ifg_clique_neighbours_break(const void *self, void *iter)
 {
+       cli_iter_t *it = iter;
+
+       bitset_free(it->visited_neighbours);
+
        return;
 }
 
@@ -477,6 +474,10 @@ static ir_node *ifg_clique_nodes_next(const void *self, void *iter)
 
 static void ifg_clique_nodes_break(const void *self, void *iter)
 {
+       cli_iter_t *it = iter;
+
+       bitset_free(it->visited_nodes);
+
        return;
 }
 
@@ -518,10 +519,7 @@ static const be_ifg_impl_t ifg_clique_impl = {
 be_ifg_t *be_ifg_clique_new(const be_chordal_env_t *env)
 {
        ifg_clique_t *ifg       = xmalloc(sizeof(*ifg));
-       bitset_t *bitset_visnodes = bitset_malloc(get_irg_last_idx(env->irg));
-       bitset_t *bitset_visneighbours = bitset_malloc(get_irg_last_idx(env->irg));
-       ifg->visited_nodes = bitset_visnodes;
-       ifg->visited_neighbours = bitset_visneighbours;
+
        ifg->impl               = &ifg_clique_impl;
        ifg->env                        = env;