2 * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * @file beifg_pointer.c
23 * @author Sebastian Hack
25 * Copyright (C) 2005 Universitaet Karlsruhe
26 * Released under the GPL
37 #include "irphase_t.h"
40 #include "irgraph_t.h"
47 #include "bechordal_t.h"
49 typedef struct _ptr_element_t ptr_element_t;
51 typedef union element_content {
53 ptr_element_t *element;
56 struct _ptr_element_t {
57 int kind; /* kind = 8888 ..> both are ir_nodes, = 3101 ..> first is another element, second an ir_node */
58 element_content content_first; /* could be a ptr_element or ir_node */
59 element_content content_second; /* could be a ptr_element or ir_node */
62 typedef struct _ptr_head_t {
63 struct list_head list;
64 ptr_element_t *element;
67 typedef struct _ifg_pointer_t {
68 const be_ifg_impl_t *impl;
69 const be_chordal_env_t *env;
72 ptr_head_t *curr_ptr_head;
73 ptr_element_t *curr_element;
77 typedef struct _ptr_iter_t {
78 const ifg_pointer_t *ifg;
80 ptr_head_t *curr_ptr_head;
81 ptr_head_t *first_head;
82 ptr_element_t *curr_element_t;
86 bitset_t *visited_neighbours;
89 /* PRIVATE FUNCTIONS */
91 static void *ptr_irn_data_init(ir_phase *ph, ir_node *irn, void *data)
93 ptr_head_t *head = phase_alloc(ph, sizeof(*head));
94 INIT_LIST_HEAD(&head->list);
98 static ptr_element_t *ptr_get_new_element(ifg_pointer_t *ifg)
100 ptr_element_t *new_element = obstack_alloc(&ifg->obst, sizeof(ptr_element_t));
101 memset(new_element, 0, sizeof(*new_element));
105 static ptr_head_t *ptr_get_new_head(ifg_pointer_t *ifg)
107 ptr_head_t *new_element = obstack_alloc(&ifg->obst, sizeof(*new_element));
108 INIT_LIST_HEAD(&new_element->list);
112 static void write_pointers(bitset_t *live, ifg_pointer_t *ifg)
117 bitset_foreach_irn(ifg->env->irg, live, elm, live_irn)
119 ptr_head_t *head = phase_get_or_set_irn_data(&ifg->ph, live_irn);
120 ptr_head_t *element = ptr_get_new_head(ifg);
124 // Matze: huh, what is this?!? node numbers aren't in any way deterministic AFAIK
125 if (live_irn->node_nr == 1883 || live_irn->node_nr == 1858)
129 element->element = ifg->curr_element; /* write current highest sub-clique for each node */
130 list_add(&element->list, &head->list);
132 /* the following code is to find all nodes, it should be replaced by a "keywalker" of irphase */
133 irn = pmap_get(ifg->node_map, live_irn);
135 pmap_insert(ifg->node_map, live_irn, live_irn);
139 static ptr_element_t *get_last_sub_clique(ifg_pointer_t *ifg, bitset_t *live, bitset_t *my_live, ir_node *irn)
141 ptr_element_t *element = ifg->curr_element;
142 ptr_element_t *res = NULL;
144 /* search the last sub-clique before the sub-clique that contains the node irn */
145 if (element && element->kind == 8888
146 && (element->content_first.irn == irn
147 || element->content_second.irn == irn)) /* contains the node we search and there is no other sub-clique before */
149 if (bitset_is_set(live, get_irn_idx(element->content_first.irn)) && element->content_first.irn != irn) /* irn is still alive and not the node we search a sub-clique for */
151 bitset_set(my_live, get_irn_idx(element->content_first.irn));
154 if (bitset_is_set(live, get_irn_idx(element->content_second.irn))&& element->content_second.irn != irn) /* irn is still alive and not the node we search a sub-clique for */
156 bitset_set(my_live, get_irn_idx(element->content_second.irn));
162 if (element && element->kind == 8889)
163 { /* this was a "single-node-clique" */
167 if (element && (element->kind == 3101)
168 && (element->content_second.irn == irn)) /* sub-clique contains node, return previous sub-clique */
170 res = element->content_first.element;
174 if (element && element->kind == 3101) /* look at previous sub-cliques if the contain the node you are searching for*/
176 if (bitset_is_set(live, get_irn_idx(element->content_second.irn))) /* irn is still alive */
178 bitset_set(my_live, get_irn_idx(element->content_second.irn));
180 ifg->curr_element = element->content_first.element;
181 res = get_last_sub_clique(ifg, live, my_live, irn);
192 static void find_neighbour_walker(ir_node *bl, void *data)
194 ifg_pointer_t *ifg = data;
195 struct list_head *head = get_block_border_head(ifg->env, bl);
197 bitset_t *live = bitset_malloc(get_irg_last_idx(ifg->env->irg));
201 element_content last_irn;
202 element_content last_element;
204 ir_node *first = NULL;
208 last_element.element = NULL;
210 assert(is_Block(bl) && "There is no block to work on.");
212 foreach_border_head(head, b) /* follow the borders of the block */
214 ir_node *irn = b->irn;
215 ptr_element_t *element = NULL;
219 if (irn->node_nr == 1883 || irn->node_nr == 1858)
223 if (b->is_def) /* b is a new node */
225 bitset_set(live, get_irn_idx(irn));
226 if (last_element.element)
228 element = ptr_get_new_element(ifg);
229 element->content_first.element = last_element.element;
230 element->content_second.irn = b->irn;
231 element->kind = 3101; /* first is an element, second an ir_node */
233 last_element.element = element;
234 ifg->curr_element = element;
238 if (last_irn.irn) /* create new sub-clique */
240 element = ptr_get_new_element(ifg);
241 element->content_first.irn = last_irn.irn;
242 element->content_second.irn = b->irn;
243 element->kind = 8888; /* both are ir_nodes */
247 if (irn->node_nr == 1883 || irn->node_nr == 1858 || irn->node_nr == 1936)
252 last_element.element = element;
253 ifg->curr_element = element;
258 last_irn.irn = b->irn; /* needed to create first sub-clique */
259 last_element.element = NULL;
267 if (was_def == 1) /* if there is a USE after a DEF... */
269 if (!last_element.element)
270 { /* there was only one element in the clique */
271 element = ptr_get_new_element(ifg);
272 element->kind = 8889; /* first is a node, second is NULL, because this is a "single-node-clique" */
273 element->content_first.irn = last_irn.irn;
276 ifg->curr_element = NULL;
280 write_pointers(live, ifg); /* ...write a pointer to the highest sub-clique for each living node. */
284 my_live = bitset_malloc(get_irg_last_idx(ifg->env->irg));
285 last_element.element = get_last_sub_clique(ifg, live, my_live, irn);
287 /* check and add still living nodes */
288 //bitset_remv_irn(my_live, irn);
289 if (bitset_popcnt(my_live) > 1)
291 if (last_element.element)
293 bitset_foreach_irn(ifg->env->irg, my_live, my_elm, my_irn)
295 ptr_element_t *my_element = ptr_get_new_element(ifg);
296 my_element->content_first.element = last_element.element;
297 my_element->content_second.irn = my_irn;
298 my_element->kind = 3101; /* first is an element, second an ir_node */
300 last_element.element = my_element;
301 ifg->curr_element = my_element;
306 bitset_foreach_irn(ifg->env->irg, my_live, my_elm, my_irn)
308 ptr_element_t *my_element = NULL;
309 if (!first && !was_first)
316 if (first && was_first)
318 my_element = ptr_get_new_element(ifg);
319 my_element->content_first.irn = first;
320 my_element->content_second.irn = my_irn;
321 my_element->kind = 8888; /* both are ir_nodes */
322 last_element.element = my_element;
323 ifg->curr_element = my_element;
327 if (my_irn->node_nr == 1883 || my_irn->node_nr == 1858 || my_irn->node_nr == 1936)
336 my_element = ptr_get_new_element(ifg);
337 my_element->content_first.element = last_element.element;
338 my_element->content_second.irn = my_irn;
339 my_element->kind = 3101; /* first is an element, second an ir_node */
340 last_element.element = my_element;
341 ifg->curr_element = my_element;
350 if (bitset_popcnt(my_live) == 1) /* there is only one node left */
352 if (last_element.element)
354 bitset_foreach_irn(ifg->env->irg, my_live, my_elm, my_irn)
356 ptr_element_t *my_element = ptr_get_new_element(ifg);
357 my_element->content_first.element = last_element.element;
358 my_element->content_second.irn = my_irn;
359 my_element->kind = 3101; /* first is an element, second an ir_node */
361 last_element.element = my_element;
362 ifg->curr_element = my_element;
367 bitset_foreach_irn(ifg->env->irg, my_live, my_elm, my_irn);
369 ptr_element_t *my_element = ptr_get_new_element(ifg);
370 my_element->content_first.irn = my_irn;
371 my_element->content_second.irn = NULL;
372 my_element->kind = 8889;
373 last_element.element = my_element;
374 ifg->curr_element = my_element;
379 bitset_free(my_live);
380 bitset_remv_irn(live, irn);
386 static ir_node *get_first_irn(const ifg_pointer_t *ifg, ptr_iter_t *it)
388 /* this should be replaced using a keywalker of the irphase &ifg.ph */
393 entry = pmap_first(ifg->node_map);
404 static ir_node *get_next_irn(ptr_iter_t *it)
406 /* this should be replaced using a keywalker of the irphase &ifg.ph */
411 entry = pmap_next(it->ifg->node_map);
416 it->curr_irn = entry->value;
421 static ir_node *get_next_neighbour(ptr_iter_t *it)
425 ptr_element_t *element;
427 element = it->curr_element_t;
433 if (it->irn->node_nr == 1883 || it->irn->node_nr == 1858)
437 if (it->curr_ptr_head->list.next != &it->first_head->list)
439 head = list_entry(it->curr_ptr_head->list.next, ptr_head_t, list);
440 it->curr_ptr_head = head;
441 element = head->element;
444 return NULL; /* there are no more neighbours */
447 if (element && element->kind == 8889) /* node has no neighbours */
449 res = element->content_first.irn;
450 it->curr_element_t = NULL;
454 if (element && element->kind == 8888) /* node has only one more neighbour */
458 if (element->content_first.irn != it->irn)
460 res = element->content_first.irn;
462 it->curr_element_t = NULL;
467 it->curr_element_t = NULL;
469 res = get_next_neighbour(it);
475 if (element->content_second.irn != it->irn)
477 res = element->content_second.irn;
479 it->curr_element_t = element;
484 it->curr_element_t = element;
486 res = get_next_neighbour(it);
493 if (element && element->kind == 3101)
495 it->curr_element_t = element->content_first.element;
496 res = element->content_second.irn;
499 { /* element is only an ir_node */// TODO
500 it->curr_element_t = NULL;
506 if (res && !it->sub_call)
508 if (bitset_contains_irn(it->visited_neighbours, res) || res == it->irn)
510 res = get_next_neighbour(it);
514 bitset_set(it->visited_neighbours, get_irn_idx(res));
521 static ir_node *get_first_neighbour(const ifg_pointer_t *ifg, ptr_iter_t *it, const ir_node *irn)
525 ptr_element_t *element;
526 bitset_t *bitsetvisited_neighbours = bitset_malloc(get_irg_last_idx(ifg->env->irg));
533 it->visited_neighbours = bitsetvisited_neighbours;
535 head = phase_get_irn_data(&ifg->ph, irn);
540 it->first_head = head;
541 head = list_entry(it->first_head->list.next, ptr_head_t, list); /* because first element is NULL */
542 it->curr_ptr_head = head;
543 element = head->element;
546 if (element && element->kind == 8889) /* node has no neighbours */
548 res = element->content_first.irn;
549 it->curr_element_t = NULL;
553 if (element && element->kind == 8888) /* node has only one neighbour */
557 if (element->content_first.irn != it->irn)
559 res = element->content_first.irn;
561 it->curr_element_t = NULL;
566 it->curr_element_t = NULL;
568 res = get_next_neighbour(it);
574 if (element->content_second.irn != it->irn)
576 res = element->content_second.irn;
577 it->curr_element_t = element;
583 it->curr_element_t = element;
585 res = get_next_neighbour(it);
591 if (element && element->kind == 3101)
593 it->curr_element_t = element->content_first.element;
594 res = element->content_second.irn;
597 { /* element is only an ir_node */
598 it->curr_element_t = NULL;
603 if (res && !it->sub_call)
605 if (bitset_contains_irn(it->visited_neighbours, res) || res == it->irn)
607 res = get_next_neighbour(it);
611 bitset_set(it->visited_neighbours, get_irn_idx(res));
620 /* PUBLIC FUNCTIONS */
622 static void ifg_pointer_free(void *self)
624 ifg_pointer_t *ifg = self;
625 obstack_free(&ifg->obst, NULL);
626 phase_free(&ifg->ph);
631 static int ifg_pointer_connected(const void *self, const ir_node *a, const ir_node *b)
633 const ifg_pointer_t *ifg = self;
638 irn = get_first_neighbour(ifg, &it, a);
647 irn = get_next_neighbour(&it);
653 static ir_node *ifg_pointer_neighbours_begin(const void *self, void *iter, const ir_node *irn)
655 return get_first_neighbour(self, iter, irn);
658 static ir_node *ifg_pointer_neighbours_next(const void *self, void *iter)
660 return get_next_neighbour(iter);
663 static void ifg_pointer_neighbours_break(const void *self, void *iter)
665 ptr_iter_t *it = iter;
667 bitset_free(it->visited_neighbours);
672 static ir_node *ifg_pointer_nodes_begin(const void *self, void *iter)
674 return get_first_irn(self, iter);
677 static ir_node *ifg_pointer_nodes_next(const void *self, void *iter)
679 return get_next_irn(iter);
682 static void ifg_pointer_nodes_break(const void *self, void *iter)
687 static int ifg_pointer_degree(const void *self, const ir_node *irn)
692 irn = get_first_neighbour(self, &it, irn);
697 irn = get_next_neighbour(&it);
703 static const be_ifg_impl_t ifg_pointer_impl = {
708 ifg_pointer_connected,
709 ifg_pointer_neighbours_begin,
710 ifg_pointer_neighbours_next,
711 ifg_pointer_neighbours_break,
712 ifg_pointer_nodes_begin,
713 ifg_pointer_nodes_next,
714 ifg_pointer_nodes_break,
721 be_ifg_t *be_ifg_pointer_new(const be_chordal_env_t *env)
723 ifg_pointer_t *ifg = xmalloc(sizeof(*ifg));
724 ifg->impl = &ifg_pointer_impl;
727 ifg->node_map = pmap_create(); /* to find all nodes, should be replaced by a "keywalker" of irphase */
729 phase_init(&ifg->ph, "ptr_map", env->irg, PHASE_DEFAULT_GROWTH, ptr_irn_data_init, NULL);
730 obstack_init(&ifg->obst);
732 dom_tree_walk_irg(env->irg, find_neighbour_walker, NULL, ifg);
734 obstack_finish(&ifg->obst);
735 return (be_ifg_t *) ifg;