4 * @author Sebastian Hack
6 * Copyright (C) 2005 Universitaet Karlsruhe
7 * Released under the GPL
28 size_t (be_ifg_nodes_iter_size)(const void *self)
30 const be_ifg_t *ifg = self;
31 return ifg->impl->nodes_iter_size;
34 size_t (be_ifg_neighbours_iter_size)(const void *self)
36 const be_ifg_t *ifg = self;
37 return ifg->impl->neighbours_iter_size;
40 size_t (be_ifg_cliques_iter_size)(const void *self)
42 const be_ifg_t *ifg = self;
43 return ifg->impl->cliques_iter_size;
46 void (be_ifg_free)(void *self)
49 ifg->impl->free(self);
52 int (be_ifg_connected)(const void *self, const ir_node *a, const ir_node *b)
54 const be_ifg_t *ifg = self;
55 return ifg->impl->connected(self, a, b);
58 ir_node *(be_ifg_neighbours_begin)(const void *self, void *iter, const ir_node *irn)
60 const be_ifg_t *ifg = self;
61 return ifg->impl->neighbours_begin(self, iter, irn);
64 ir_node *(be_ifg_neighbours_next)(const void *self, void *iter)
66 const be_ifg_t *ifg = self;
67 return ifg->impl->neighbours_next(self, iter);
70 void (be_ifg_neighbours_break)(const void *self, void *iter)
72 const be_ifg_t *ifg = self;
73 ifg->impl->neighbours_break(self, iter);
76 ir_node *(be_ifg_nodes_begin)(const void *self, void *iter)
78 const be_ifg_t *ifg = self;
79 return ifg->impl->nodes_begin(self, iter);
82 ir_node *(be_ifg_nodes_next)(const void *self, void *iter)
84 const be_ifg_t *ifg = self;
85 return ifg->impl->nodes_next(self, iter);
88 void (be_ifg_nodes_break)(const void *self, void *iter)
90 const be_ifg_t *ifg = self;
91 ifg->impl->nodes_break(self, iter);
94 int (be_ifg_cliques_begin)(const void *self, void *iter, ir_node **buf)
96 const be_ifg_t *ifg = self;
97 return ifg->impl->cliques_begin(self, iter, buf);
100 int (be_ifg_cliques_next)(const void *self, void *iter)
102 const be_ifg_t *ifg = self;
103 return ifg->impl->cliques_next(self, iter);
106 void (be_ifg_cliques_break)(const void *self, void *iter)
108 const be_ifg_t *ifg = self;
109 ifg->impl->cliques_break(self, iter);
112 int (be_ifg_degree)(const void *self, const ir_node *irn)
114 const be_ifg_t *ifg = self;
115 return ifg->impl->degree(self, irn);
119 int be_ifg_is_simplicial(const be_ifg_t *ifg, const ir_node *irn)
121 int degree = be_ifg_degree(ifg, irn);
122 void *iter = be_ifg_neighbours_iter_alloca(ifg);
124 ir_node **neighbours = xmalloc(degree * sizeof(neighbours[0]));
129 be_ifg_foreach_neighbour(ifg, iter, irn, curr)
130 neighbours[i++] = curr;
132 for(i = 0; i < degree; ++i) {
133 for(j = 0; j < i; ++j)
134 if(!be_ifg_connected(ifg, neighbours[i], neighbours[j])) {
145 void be_ifg_check(const be_ifg_t *ifg)
147 void *iter1 = be_ifg_nodes_iter_alloca(ifg);
148 void *iter2 = be_ifg_neighbours_iter_alloca(ifg);
152 /* Check, if all neighbours are indeed connected to the node. */
153 be_ifg_foreach_node(ifg, iter1, n) {
154 be_ifg_foreach_neighbour(ifg, iter2, n, m)
155 if(!be_ifg_connected(ifg, n, m))
156 ir_fprintf(stderr, "%+F is a neighbour of %+F but they are not connected!\n", n, m);