summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog.graphite19
-rw-r--r--gcc/graphite-clast-to-gimple.c7
-rw-r--r--gcc/graphite-clast-to-gimple.h2
-rw-r--r--gcc/graphite-poly.c2
-rw-r--r--gcc/graphite-poly.h7
-rw-r--r--gcc/graphite-sese-to-poly.c1
-rw-r--r--gcc/graphite.c19
-rw-r--r--gcc/sese.c59
-rw-r--r--gcc/sese.h1
-rw-r--r--gcc/testsuite/gcc.dg/graphite/pr42771.c19
10 files changed, 89 insertions, 47 deletions
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index d563ad369a5..41f05b0fbb5 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 cc48859b37e..424f5c68169 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)
{
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 ();
diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h
index 85fb5e1f34d..ae1f35c7962 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 6ed6a846b38..3e29b4bd4da 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -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;
}
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index a2969c77216..0a8204ec9a1 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 3be2d860391..614232b118c 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -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;
}
diff --git a/gcc/graphite.c b/gcc/graphite.c
index 7037a3fa1a0..ba05cc74361 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -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);
diff --git a/gcc/sese.c b/gcc/sese.c
index f959bdb269e..6fb406521ee 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 20dd1b023da..980ade9850b 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 00000000000..505fda7eb73
--- /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];
+}