This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix PR42771: Rename SESE parameters in all SCoPs after Graphite code gen


Hi,

The attached patch fixes the order of detection/analysis/code-gen of
Graphite by first doing the SCoP detection and analysis for all the
SCoPs of the function, before starting the code generation.

As reported in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42771 this
used to pass after http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42521
was fixed: and then it started failing again after the fix for
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42732 that did renamed the
loop number of iterations in between two SCOP code generations, but
did not renamed the parameters of the SESEs.  With the attached patch
we now also rename the tree expressions in the SESE parameters.

I committed the attached patch to the Graphite branch for further
test.  I will commit to trunk after it's regstrapped and passes the
SPEC 2k6 tests.

Sebastian Pop
--
AMD / Open Source Compiler Engineering / GNU Tools
From b6dec936adbe1e752ef273aa962d2dd20d7a2b1f Mon Sep 17 00:00:00 2001
From: Sebastian Pop <sebpop@gmail.com>
Date: Wed, 10 Feb 2010 10:33:03 -0600
Subject: [PATCH] Fix PR42771.

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.
---
 gcc/ChangeLog.graphite                  |   19 ++++++++++
 gcc/graphite-clast-to-gimple.c          |    7 +++-
 gcc/graphite-clast-to-gimple.h          |    2 +-
 gcc/graphite-poly.c                     |    2 +
 gcc/graphite-poly.h                     |    7 ++++
 gcc/graphite-sese-to-poly.c             |    1 +
 gcc/graphite.c                          |   19 +++-------
 gcc/sese.c                              |   59 ++++++++++++++-----------------
 gcc/sese.h                              |    1 +
 gcc/testsuite/gcc.dg/graphite/pr42771.c |   19 ++++++++++
 10 files changed, 89 insertions(+), 47 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/graphite/pr42771.c

diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index d563ad3..41f05b0 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -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
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index 73ffbbc..4a0ae6c 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -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)
 {
   edge new_scop_exit_edge = NULL;
   VEC (tree, heap) *newivs = VEC_alloc (tree, heap, 10);
@@ -1437,6 +1437,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;
@@ -1482,6 +1483,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 ();
 
diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h
index 85fb5e1..ae1f35c 100644
--- a/gcc/graphite-clast-to-gimple.h
+++ b/gcc/graphite-clast-to-gimple.h
@@ -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 *);
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index ea5b940..04a6ef4 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -502,6 +502,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;
 }
 
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index a2969c7..0a8204e 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -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);
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 0a04465..45c4bd9 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -2890,6 +2890,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;
 }
diff --git a/gcc/graphite.c b/gcc/graphite.c
index 3c8c4ce..d28b9cf 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -269,20 +269,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 (!dbg_cnt (graphite_scop) || !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);
diff --git a/gcc/sese.c b/gcc/sese.c
index f959bdb..6fb4065 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -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
diff --git a/gcc/sese.h b/gcc/sese.h
index 20dd1b0..980ade9 100644
--- a/gcc/sese.h
+++ b/gcc/sese.h
@@ -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
index 0000000..505fda7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr42771.c
@@ -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];
+}
-- 
1.6.3.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]