+ int num_vertices = VEC_length (data_reference_p, drs);
+ struct graph *g = new_graph (num_vertices);
+ data_reference_p dr1, dr2;
+ int i, j;
+ int num_connected_components;
+ int v_indx1, v_indx2, num_vertices_in_component;
+ int *all_vertices;
+ int *vertices;
+ struct graph_edge *e;
+ int this_component_is_clique;
+ int all_components_are_cliques = 1;
+
+ for (i = 0; VEC_iterate (data_reference_p, drs, i, dr1); i++)
+ for (j = i+1; VEC_iterate (data_reference_p, drs, j, dr2); j++)
+ if (dr_may_alias_p (dr1, dr2))
+ {
+ add_edge (g, i, j);
+ add_edge (g, j, i);
+ }
+
+ all_vertices = XNEWVEC (int, num_vertices);
+ vertices = XNEWVEC (int, num_vertices);
+ for (i = 0; i < num_vertices; i++)
+ all_vertices[i] = i;
+
+ num_connected_components = graphds_dfs (g, all_vertices, num_vertices,
+ NULL, true, NULL);
+ for (i = 0; i < g->n_vertices; i++)
+ {
+ data_reference_p dr = VEC_index (data_reference_p, drs, i);
+ base_alias_pair *bap;
+
+ if (dr->aux)
+ bap = (base_alias_pair *)(dr->aux);
+
+ bap->alias_set = XNEW (int);
+ *(bap->alias_set) = g->vertices[i].component + 1;
+ }
+
+ /* Verify if the DFS numbering results in optimal solution. */
+ for (i = 0; i < num_connected_components; i++)
+ {
+ num_vertices_in_component = 0;
+ /* Get all vertices whose DFS component number is the same as i. */
+ for (j = 0; j < num_vertices; j++)
+ if (g->vertices[j].component == i)
+ vertices[num_vertices_in_component++] = j;
+
+ /* Now test if the vertices in 'vertices' form a clique, by testing
+ for edges among each pair. */
+ this_component_is_clique = 1;
+ for (v_indx1 = 0; v_indx1 < num_vertices_in_component; v_indx1++)
+ {
+ for (v_indx2 = v_indx1+1; v_indx2 < num_vertices_in_component; v_indx2++)
+ {
+ /* Check if the two vertices are connected by iterating
+ through all the edges which have one of these are source. */
+ e = g->vertices[vertices[v_indx2]].pred;
+ while (e)
+ {
+ if (e->src == vertices[v_indx1])
+ break;
+ e = e->pred_next;
+ }
+ if (!e)
+ {
+ this_component_is_clique = 0;
+ break;
+ }
+ }
+ if (!this_component_is_clique)
+ all_components_are_cliques = 0;
+ }
+ }
+
+ free (all_vertices);
+ free (vertices);
+ free_graph (g);
+ return all_components_are_cliques;