- be_ifg_foreach_node(ifg, iter1, n) {
- be_ifg_foreach_neighbour(ifg, iter2, n, m)
- if(!be_ifg_connected(ifg, n, m))
- ir_fprintf(stderr, "%+F is a neighbour of %+F but they are not connected!\n", n, m);
+ be_ifg_foreach_node(ifg, &nodes_it, n) {
+ be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) {
+ int n_idx = get_irn_idx(n);
+ int m_idx = get_irn_idx(m);
+
+ if (n_idx < m_idx && bitset_is_set(nodes, n_idx) && bitset_is_set(nodes, m_idx)) {
+ fprintf(file, "\tn%d -- n%d [", n_idx, m_idx);
+ if (cb->edge_attr)
+ cb->edge_attr(file, self, n, m);
+ fprintf(file, "];\n");
+ }
+ }
+ }
+
+ if (cb->at_end)
+ cb->at_end(file, self);
+
+ fprintf(file, "}\n");
+ bitset_free(nodes);
+}
+
+static void int_comp_rec(be_ifg_t *ifg, ir_node *n, bitset_t *seen)
+{
+ neighbours_iter_t neigh_it;
+ ir_node *m;
+
+ be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) {
+ if (bitset_contains_irn(seen, m))
+ continue;
+
+ if (arch_get_register_req_out(m)->type & arch_register_req_type_ignore)
+ continue;
+
+ bitset_add_irn(seen, m);
+ int_comp_rec(ifg, m, seen);
+ }
+
+}
+
+static int int_component_stat(ir_graph *irg, be_ifg_t *ifg)
+{
+ int n_comp = 0;
+ nodes_iter_t nodes_it;
+ bitset_t *seen = bitset_irg_malloc(irg);
+
+ ir_node *n;
+
+ be_ifg_foreach_node(ifg, &nodes_it, n) {
+ if (bitset_contains_irn(seen, n))
+ continue;
+
+ if (arch_get_register_req_out(n)->type & arch_register_req_type_ignore)
+ continue;
+
+ ++n_comp;
+ bitset_add_irn(seen, n);
+ int_comp_rec(ifg, n, seen);
+ }
+
+ free(seen);
+ return n_comp;
+}
+
+void be_ifg_stat(ir_graph *irg, be_ifg_t *ifg, be_ifg_stat_t *stat)
+{
+ nodes_iter_t nodes_it;
+ neighbours_iter_t neigh_it;
+ bitset_t *nodes = bitset_irg_malloc(irg);
+ ir_node *n, *m;
+
+ memset(stat, 0, sizeof(stat[0]));
+
+ be_ifg_foreach_node(ifg, &nodes_it, n) {
+ stat->n_nodes += 1;
+ be_ifg_foreach_neighbour(ifg, &neigh_it, n, m) {
+ bitset_add_irn(nodes, n);
+ stat->n_edges += !bitset_contains_irn(nodes, m);
+ }