- * @file beifg_pointer.c
- * @date 18.11.2005
- * @author Sebastian Hack
- *
- * Copyright (C) 2005 Universitaet Karlsruhe
- * Released under the GPL
+ * @file
+ * @brief Pointer based implementation of chordal interference graphs.
+ * @author Sebastian Hack
+ * @date 18.11.2005
+ * @version $Id$
- const ir_node *irn;
- ptr_head_t *curr_ptr_head;
- ptr_head_t *first_head;
- ptr_element_t *curr_element_t;
- ir_node *curr_irn;
- int get_first;
- int sub_call;
- bitset_t *visited_neighbours;
+ const ir_node *irn;
+ ptr_head_t *curr_ptr_head;
+ ptr_head_t *first_head;
+ ptr_element_t *curr_element_t;
+ ir_node *curr_irn;
+ int get_first;
+ int sub_call;
+ bitset_t *visited_neighbours;
- bitset_foreach_irn(ifg->env->irg, live, elm, live_irn)
- {
- ptr_head_t *head = phase_get_or_set_irn_data(&ifg->ph, live_irn);
+ bitset_foreach_irn(ifg->env->irg, live, elm, live_irn) {
+ ptr_head_t *head = phase_get_or_set_irn_data(&ifg->ph, live_irn);
element->element = ifg->curr_element; /* write current highest sub-clique for each node */
list_add(&element->list, &head->list);
element->element = ifg->curr_element; /* write current highest sub-clique for each node */
list_add(&element->list, &head->list);
-
- /* the following code is to find all nodes, it should be replaced by a "keywalker" of irphase */
- irn = pmap_get(ifg->node_map, live_irn);
- if (!irn)
- pmap_insert(ifg->node_map, live_irn, live_irn);
- ifg_pointer_t *ifg = data;
- struct list_head *head = get_block_border_head(ifg->env, bl);
- border_t *b;
- bitset_t *live = bitset_malloc(get_irg_last_idx(ifg->env->irg));
- bitset_t *my_live;
- bitset_pos_t my_elm;
- ir_node *my_irn;
- element_content last_irn;
- element_content last_element;
- int was_def = 0;
- ir_node *first = NULL;
- int was_first = 0;
-
- last_irn.irn = NULL;
+ ifg_pointer_t *ifg = data;
+ struct list_head *head = get_block_border_head(ifg->env, bl);
+ int was_def = 0;
+ int was_first = 0;
+ ir_node *first = NULL;
+ bitset_t *live = bitset_malloc(get_irg_last_idx(ifg->env->irg));
+ bitset_t *my_live;
+ bitset_pos_t my_elm;
+ border_t *b;
+ ir_node *my_irn;
+ element_content last_irn;
+ element_content last_element;
+
+ last_irn.irn = NULL;
last_element.element = NULL;
assert(is_Block(bl) && "There is no block to work on.");
foreach_border_head(head, b) /* follow the borders of the block */
{
last_element.element = NULL;
assert(is_Block(bl) && "There is no block to work on.");
foreach_border_head(head, b) /* follow the borders of the block */
{
if (b->is_def) /* b is a new node */
{
bitset_set(live, get_irn_idx(irn));
if (b->is_def) /* b is a new node */
{
bitset_set(live, get_irn_idx(irn));
last_element.element = get_last_sub_clique(ifg, live, my_live, irn);
/* check and add still living nodes */
last_element.element = get_last_sub_clique(ifg, live, my_live, irn);
/* check and add still living nodes */
my_element->kind = 8888; /* both are ir_nodes */
last_element.element = my_element;
ifg->curr_element = my_element;
my_element->kind = 8888; /* both are ir_nodes */
last_element.element = my_element;
ifg->curr_element = my_element;
if (it->curr_ptr_head->list.next != &it->first_head->list)
{
head = list_entry(it->curr_ptr_head->list.next, ptr_head_t, list);
if (it->curr_ptr_head->list.next != &it->first_head->list)
{
head = list_entry(it->curr_ptr_head->list.next, ptr_head_t, list);
it->visited_neighbours = bitsetvisited_neighbours;
head = phase_get_irn_data(&ifg->ph, irn);
it->visited_neighbours = bitsetvisited_neighbours;
head = phase_get_irn_data(&ifg->ph, irn);
static int ifg_pointer_connected(const void *self, const ir_node *a, const ir_node *b)
{
const ifg_pointer_t *ifg = self;
static int ifg_pointer_connected(const void *self, const ir_node *a, const ir_node *b)
{
const ifg_pointer_t *ifg = self;
return get_next_neighbour(iter);
}
static void ifg_pointer_neighbours_break(const void *self, void *iter)
{
ptr_iter_t *it = iter;
return get_next_neighbour(iter);
}
static void ifg_pointer_neighbours_break(const void *self, void *iter)
{
ptr_iter_t *it = iter;
return get_next_irn(iter);
}
static void ifg_pointer_nodes_break(const void *self, void *iter)
{
return get_next_irn(iter);
}
static void ifg_pointer_nodes_break(const void *self, void *iter)
{
phase_init(&ifg->ph, "ptr_map", env->irg, PHASE_DEFAULT_GROWTH, ptr_irn_data_init, NULL);
obstack_init(&ifg->obst);
phase_init(&ifg->ph, "ptr_map", env->irg, PHASE_DEFAULT_GROWTH, ptr_irn_data_init, NULL);
obstack_init(&ifg->obst);