OSDN Git Service

Fix PR42771.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Feb 2010 19:42:38 +0000 (19:42 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 11 Feb 2010 19:42:38 +0000 (19:42 +0000)
2010-02-10  Sebastian Pop  <seb@napoca>

PR middle-end/42771
* graphite-clast-to-gimple.c (gloog): Call rename_sese_parameters.
* graphite-clast-to-gimple.h (gloog): Update declaration.
* graphite-poly.c (new_scop): Clear POLY_SCOP_P.
* graphite-poly.h (struct poly_bb): Add missing comments.
(struct scop): Add poly_scop_p field.
(POLY_SCOP_P): New.
* graphite-sese-to-poly.c (build_poly_scop): Set POLY_SCOP_P.
* graphite.c (graphite_transform_loops): Build the polyhedral
representation for each scop before code generation.
* sese.c (rename_variables_in_operand): Removed.
(rename_variables_in_expr): Return the renamed expression.
(rename_sese_parameters): New.
* sese.h (rename_sese_parameters): Declared.

* gcc.dg/graphite/pr42771.c: New.

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

gcc/ChangeLog.graphite
gcc/graphite-clast-to-gimple.c
gcc/graphite-clast-to-gimple.h
gcc/graphite-poly.c
gcc/graphite-poly.h
gcc/graphite-sese-to-poly.c
gcc/graphite.c
gcc/sese.c
gcc/sese.h
gcc/testsuite/gcc.dg/graphite/pr42771.c [new file with mode: 0644]

index d563ad3..41f05b0 100644 (file)
@@ -1,3 +1,22 @@
+2010-02-10  Sebastian Pop  <seb@napoca>
+
+       PR middle-end/42771
+       * graphite-clast-to-gimple.c (gloog): Call rename_sese_parameters.
+       * graphite-clast-to-gimple.h (gloog): Update declaration.
+       * graphite-poly.c (new_scop): Clear POLY_SCOP_P.
+       * graphite-poly.h (struct poly_bb): Add missing comments.
+       (struct scop): Add poly_scop_p field.
+       (POLY_SCOP_P): New.
+       * graphite-sese-to-poly.c (build_poly_scop): Set POLY_SCOP_P.
+       * graphite.c (graphite_transform_loops): Build the polyhedral
+       representation for each scop before code generation.
+       * sese.c (rename_variables_in_operand): Removed.
+       (rename_variables_in_expr): Return the renamed expression.
+       (rename_sese_parameters): New.
+       * sese.h (rename_sese_parameters): Declared.
+
+       * gcc.dg/graphite/pr42771.c: New.
+
 2010-02-07  Sebastian Pop  <sebastian.pop@amd.com>
 
        * gcc.dg/graphite/block-0.c: Call abort for runtime test.  Always
index cc48859..424f5c6 100644 (file)
@@ -1428,7 +1428,7 @@ create_params_index (htab_t index_table, CloogProgram *prog) {
 */
 
 bool
-gloog (scop_p scop, htab_t bb_pbb_mapping)
+gloog (scop_p scop, VEC (scop_p, heap) *scops, htab_t bb_pbb_mapping)
 {
   VEC (tree, heap) *newivs = VEC_alloc (tree, heap, 10);
   loop_p context_loop;
@@ -1436,6 +1436,7 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
   ifsese if_region = NULL;
   htab_t rename_map, newivs_index, params_index;
   cloog_prog_clast pc;
+  int i;
 
   timevar_push (TV_GRAPHITE_CODE_GEN);
   gloog_error = false;
@@ -1481,6 +1482,10 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
                            if_region->true_region->exit);
   scev_reset_htab ();
   rename_nb_iterations (rename_map);
+
+  for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
+    rename_sese_parameters (rename_map, SCOP_REGION (scop));
+
   recompute_all_dominators ();
   graphite_verify ();
 
index 85fb5e1..ae1f35c 100644 (file)
@@ -36,7 +36,7 @@ typedef struct bb_pbb_def
   poly_bb_p pbb;
 }bb_pbb_def;
 
-extern bool gloog (scop_p, htab_t);
+extern bool gloog (scop_p, VEC (scop_p, heap) *, htab_t);
 extern cloog_prog_clast scop_to_clast (scop_p);
 extern void debug_clast_stmt (struct clast_stmt *);
 extern void print_clast_stmt (FILE *, struct clast_stmt *);
index 6ed6a84..3e29b4b 100644 (file)
@@ -464,6 +464,8 @@ new_scop (void *region)
   SCOP_ORIGINAL_SCHEDULE (scop) = NULL;
   SCOP_TRANSFORMED_SCHEDULE (scop) = NULL;
   SCOP_SAVED_SCHEDULE (scop) = NULL;
+  POLY_SCOP_P (scop) = false;
+
   return scop;
 }
 
index a2969c7..0a8204e 100644 (file)
@@ -277,8 +277,10 @@ struct poly_scattering
 
 struct poly_bb
 {
+  /* Pointer to a basic block or a statement in the compiler.  */
   void *black_box;
 
+  /* Pointer to the SCOP containing this PBB.  */
   scop_p scop;
 
   /* The iteration domain of this bb.
@@ -1303,6 +1305,10 @@ struct scop
   /* A hashtable of the data dependence relations for the original
      scattering.  */
   htab_t original_pddrs;
+
+  /* True when the scop has been converted to its polyhedral
+     representation.  */
+  bool poly_scop_p;
 };
 
 #define SCOP_BBS(S) (S->bbs)
@@ -1312,6 +1318,7 @@ struct scop
 #define SCOP_ORIGINAL_SCHEDULE(S) (S->original_schedule)
 #define SCOP_TRANSFORMED_SCHEDULE(S) (S->transformed_schedule)
 #define SCOP_SAVED_SCHEDULE(S) (S->saved_schedule)
+#define POLY_SCOP_P(S) (S->poly_scop_p)
 
 extern scop_p new_scop (void *);
 extern void free_scop (scop_p);
index 3be2d86..614232b 100644 (file)
@@ -2898,6 +2898,7 @@ build_poly_scop (scop_p scop)
   scop_to_lst (scop);
   build_scop_scattering (scop);
   build_scop_drs (scop);
+  POLY_SCOP_P (scop) = true;
 
   return true;
 }
index 7037a3f..ba05cc7 100644 (file)
@@ -268,20 +268,13 @@ graphite_transform_loops (void)
   bb_pbb_mapping = htab_create (10, bb_pbb_map_hash, eq_bb_pbb_map, free);
 
   for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
-    {
-      bool transform_done = false;
-
-      if (!build_poly_scop (scop))
-       continue;
+    build_poly_scop (scop);
 
-      if (apply_poly_transforms (scop))
-       transform_done = gloog (scop, bb_pbb_mapping);
-      else
-       check_poly_representation (scop);
-
-      if (transform_done)
-       need_cfg_cleanup_p = true;
-    }
+  for (i = 0; VEC_iterate (scop_p, scops, i, scop); i++)
+    if (POLY_SCOP_P (scop)
+       && apply_poly_transforms (scop)
+       && gloog (scop, scops, bb_pbb_mapping))
+      need_cfg_cleanup_p = true;
 
   htab_delete (bb_pbb_mapping);
   free_scops (scops);
index f959bdb..6fb4065 100644 (file)
@@ -526,49 +526,31 @@ set_rename (htab_t map, tree old_name, tree expr)
   *slot = new_rename_map_elt (old_name, expr);
 }
 
-static void rename_variables_in_expr (htab_t, tree);
-
-/* Renames the operand OP of expression T following the tuples
-   (OLD_NAME, EXPR) in RENAME_MAP.  */
-
-static void
-rename_variables_in_operand (htab_t rename_map, tree t, int op)
-{
-  tree operand = TREE_OPERAND (t, op);
-
-  if (TREE_CODE (operand) == SSA_NAME)
-    {
-      tree new_name = get_rename (rename_map, operand);
-
-      if (new_name != operand)
-       TREE_OPERAND (t, op) = new_name;
-    }
-  else
-    rename_variables_in_expr (rename_map, operand);
-}
-
 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
-   RENAME_MAP.  */
+   the rename map M.  Returns the expression T after renaming.  */
 
-static void
-rename_variables_in_expr (htab_t rename_map, tree t)
+static tree
+rename_variables_in_expr (htab_t m, tree t)
 {
   if (!t)
-    return;
+    return t;
+
+ if (TREE_CODE (t) == SSA_NAME)
+   return get_rename (m, t);
 
   switch (TREE_CODE_LENGTH (TREE_CODE (t)))
     {
     case 3:
-      rename_variables_in_operand (rename_map, t, 2);
+      TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2));
 
     case 2:
-      rename_variables_in_operand (rename_map, t, 1);
+      TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1));
 
     case 1:
-      rename_variables_in_operand (rename_map, t, 0);
+      TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0));
 
     default:
-      return;
+      return t;
     }
 }
 
@@ -582,9 +564,22 @@ rename_nb_iterations (htab_t rename_map)
   struct loop *loop;
 
   FOR_EACH_LOOP (li, loop, 0)
-    {
-      rename_variables_in_expr (rename_map, loop->nb_iterations);
-    }
+    loop->nb_iterations = rename_variables_in_expr (rename_map,
+                                                   loop->nb_iterations);
+}
+
+/* Renames all the parameters of SESE following the tuples (OLD_NAME,
+   EXPR) in RENAME_MAP.  */
+
+void
+rename_sese_parameters (htab_t rename_map, sese region)
+{
+  int i;
+  tree p;
+
+  for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
+    VEC_replace (tree, SESE_PARAMS (region), i,
+                rename_variables_in_expr (rename_map, p));
 }
 
 /* Adjusts the phi nodes in the block BB for variables defined in
index 20dd1b0..980ade9 100644 (file)
@@ -264,6 +264,7 @@ extern hashval_t rename_map_elt_info (const void *);
 extern int eq_rename_map_elts (const void *, const void *);
 extern void set_rename (htab_t, tree, tree);
 extern void rename_nb_iterations (htab_t);
+extern void rename_sese_parameters (htab_t, sese);
 
 /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW.  */
 
diff --git a/gcc/testsuite/gcc.dg/graphite/pr42771.c b/gcc/testsuite/gcc.dg/graphite/pr42771.c
new file mode 100644 (file)
index 0000000..505fda7
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-options "-O3 -fgraphite-identity" } */
+
+extern int *A;
+extern int B[][4];
+extern void bar(void);
+
+void foo(int im, int jm, int cond)
+{
+  int i, j;
+  if (cond) {
+    for (i = 0; i < 256; i++)
+      A[i] = 0;
+    bar();
+  }
+  for (i = 0; i < im; i++)
+    for (j = 1; j < jm; j++)
+      if (jm != 8 || j != jm >> 1)
+        B[j][0] ^= B[j-1][0];
+}