OSDN Git Service

2009-10-20 Li Feng <nemokingdom@gmail.com>
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Nov 2009 05:19:32 +0000 (05:19 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 25 Nov 2009 05:19:32 +0000 (05:19 +0000)
* graphite-sese-to-poly.c (free_data_refs_aux): Update to free
the new structure.
(pdr_add_alias_set): Update retrieving alias_set_num.
(build_poly_dr): Update retrieving dr_base_object_set.
(partition_drs_to_sets): Remove.
(build_alias_set_optimal_p): New.
(build_alias_set_for_drs): Rename.
(build_scop_drs): Update.
* graphite-sese-to-poly.h (struct base_alias_pair): New.
(ALIAS_SET_INDEX): Remove.
(BASE_OBJECT_SET_INDEX): Remove.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154614 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog.graphite
gcc/graphite-sese-to-poly.c
gcc/graphite-sese-to-poly.h

index fe4b203..e61abc5 100644 (file)
@@ -1,3 +1,17 @@
+2009-10-20  Li Feng  <nemokingdom@gmail.com>
+
+       * graphite-sese-to-poly.c (free_data_refs_aux): Update to free
+       the new structure.
+       (pdr_add_alias_set): Update retrieving alias_set_num.
+       (build_poly_dr): Update retrieving dr_base_object_set.
+       (partition_drs_to_sets): Remove.
+       (build_alias_set_optimal_p): New.
+       (build_alias_set_for_drs): Rename.
+       (build_scop_drs): Update.
+       * graphite-sese-to-poly.h (struct base_alias_pair): New.
+       (ALIAS_SET_INDEX): Remove.
+       (BASE_OBJECT_SET_INDEX): Remove.
+
 2009-10-20  Sebastian Pop  <sebastian.pop@amd.com>
 
        * sese.c (get_vdef_before_sese): Handle GIMPLE_ASSIGN and GIMPLE_CALL.
index b2931d1..b0f385b 100644 (file)
@@ -290,15 +290,16 @@ free_data_refs_aux (VEC (data_reference_p, heap) *datarefs)
 {
   unsigned int i;
   struct data_reference *dr;
-
-  for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
-    if (!dr->aux)
+   for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++)
+    if (dr->aux != NULL)
       {
-       free (dr->aux);
+       base_alias_pair *bap = (base_alias_pair *)(dr->aux);
+       if (bap->alias_set != NULL)
+         free (bap->alias_set);
+       free (bap);
        dr->aux = NULL;
       }
 }
-
 /* Frees GBB.  */
 
 static void
@@ -1628,9 +1629,10 @@ pdr_add_alias_set (ppl_Polyhedron_t accesses, data_reference_p dr,
   ppl_Linear_Expression_t alias;
   ppl_Constraint_t cstr;
   int alias_set_num = 0;
+  base_alias_pair *bap = (base_alias_pair *)(dr->aux);
 
-  if (dr->aux != NULL)
-    alias_set_num = ((int *)(dr->aux))[ALIAS_SET_INDEX];
+  if (bap != NULL && bap->alias_set != NULL)
+    alias_set_num = *(bap->alias_set);
 
   ppl_new_Linear_Expression_with_dimension (&alias, accessp_nb_dims);
 
@@ -1773,7 +1775,8 @@ build_poly_dr (data_reference_p dr, poly_bb_p pbb)
                                                            accesses);
   ppl_delete_Polyhedron (accesses);
 
-  dr_base_object_set = ((int *)(dr->aux))[BASE_OBJECT_SET_INDEX];
+  if (dr->aux != NULL)
+    dr_base_object_set = ((base_alias_pair *)(dr->aux))->base_obj_set;
 
   new_poly_dr (pbb, dr_base_object_set, accesses_ps, DR_IS_READ (dr) ? PDR_READ : PDR_WRITE,
               dr, DR_NUM_DIMENSIONS (dr));
@@ -1869,17 +1872,22 @@ write_alias_graph_to_ascii_ecc (FILE *file, char *comment,
   return true;
 }
 
+/* Check if DR1 and DR2 are in the same object set.  */
+
+static bool
+dr_same_base_object_p (const struct data_reference *dr1,
+                      const struct data_reference *dr2)
+{
+  return operand_equal_p (DR_BASE_OBJECT (dr1), DR_BASE_OBJECT (dr2), 0);
+}
 
 /* Uses DFS component number as representative of alias-sets. Also tests for
    optimality by verifying if every connected component is a clique. Returns
    true (1) if the above test is true, and false (0) otherwise.  */
 
 static int
-partition_drs_to_sets (VEC (data_reference_p, heap) *drs, int choice,
-                      bool (* edge_exist_p) (const struct data_reference *,
-                                             const struct data_reference *))
+build_alias_set_optimal_p (VEC (data_reference_p, heap) *drs)
 {
-
   int num_vertices = VEC_length (data_reference_p, drs);
   struct graph *g = new_graph (num_vertices);
   data_reference_p dr1, dr2;
@@ -1893,7 +1901,7 @@ partition_drs_to_sets (VEC (data_reference_p, heap) *drs, int choice,
 
   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 (edge_exist_p (dr1, dr2))
+      if (dr_may_alias_p (dr1, dr2))
        {
          add_edge (g, i, j);
          add_edge (g, j, i);
@@ -1904,7 +1912,18 @@ partition_drs_to_sets (VEC (data_reference_p, heap) *drs, int choice,
   for (i = 0; i < num_vertices; i++)
     all_vertices[i] = i;
 
-  num_connected_components = graphds_dfs (g, all_vertices, num_vertices, NULL, true, NULL);
+  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 != NULL)
+       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++)
@@ -1942,41 +1961,49 @@ partition_drs_to_sets (VEC (data_reference_p, heap) *drs, int choice,
        }
     }
 
-  for (i = 0; i < g->n_vertices; i++)
-    {
-      data_reference_p dr = VEC_index (data_reference_p, drs, i);
-      if (!dr->aux)
-       dr->aux = XNEWVEC (int, 2);
-      ((int *)(dr->aux))[choice] = g->vertices[i].component + 1;
-    }
-
   free (all_vertices);
   free (vertices);
   free_graph (g);
   return all_components_are_cliques;
 }
 
-static bool
-dr_same_base_object_p (const struct data_reference *dr1,
-                      const struct data_reference *dr2)
-{
-  return operand_equal_p (DR_BASE_OBJECT (dr1), DR_BASE_OBJECT (dr2), 0);
-}
-
-/* Group each data reference in DRS with it's alias set num.  */
-
-static void
-build_alias_set_for_drs (VEC (data_reference_p, heap) *drs)
-{
-  partition_drs_to_sets (drs, ALIAS_SET_INDEX, dr_may_alias_p);
-}
-
 /* Group each data reference in DRS with it's base object set num.  */
 
 static void
 build_base_obj_set_for_drs (VEC (data_reference_p, heap) *drs)
 {
-  partition_drs_to_sets (drs, BASE_OBJECT_SET_INDEX, dr_same_base_object_p);
+  int num_vertex = VEC_length (data_reference_p, drs);
+  struct graph *g = new_graph (num_vertex);
+  data_reference_p dr1, dr2;
+  int i, j;
+  int num_component;
+  int *queue;
+
+  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_same_base_object_p (dr1, dr2))
+       {
+         add_edge (g, i, j);
+         add_edge (g, j, i);
+       }
+
+  queue = XNEWVEC (int, num_vertex);
+  for (i = 0; i < num_vertex; i++)
+    queue[i] = i;
+
+  num_component = graphds_dfs (g, queue, num_vertex, 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 != NULL)
+       bap = (base_alias_pair *)(dr->aux);
+      bap->base_obj_set = g->vertices[i].component + 1;
+    }
+
+  free (queue);
+  free_graph (g);
 }
 
 /* Build the data references for PBB.  */
@@ -2007,7 +2034,15 @@ build_scop_drs (scop_p scop)
                             GBB_DATA_REFS (PBB_BLACK_BOX (pbb)), j, dr); j++)
       VEC_safe_push (data_reference_p, heap, drs, dr);
 
-  build_alias_set_for_drs (drs);
+  for (i = 0; VEC_iterate (data_reference_p, drs, i, dr); i++)
+    dr->aux = XNEW (base_alias_pair);
+
+  if (!build_alias_set_optimal_p (drs))
+    {
+      /* TODO: Add support when building alias set is not optimal.  */
+      ;
+    }
+
   build_base_obj_set_for_drs (drs);
 
   /* When debugging, enable the following code.  This cannot be used
index 9379c14..0737c49 100644 (file)
@@ -21,8 +21,12 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef GCC_GRAPHITE_SESE_TO_POLY_H
 #define GCC_GRAPHITE_SESE_TO_POLY_H
 
-#define ALIAS_SET_INDEX 0
-#define BASE_OBJECT_SET_INDEX 1
+typedef struct base_alias_pair base_alias_pair;
+struct base_alias_pair
+{
+  int base_obj_set;
+  int *alias_set;
+};
 
 bool build_poly_scop (scop_p);
 void check_poly_representation (scop_p);