From 94bdcd771b5ed968e6e9e17bcd76e9d5e096b140 Mon Sep 17 00:00:00 2001 From: spop Date: Thu, 11 Feb 2010 19:42:38 +0000 Subject: [PATCH] Fix PR42771. 2010-02-10 Sebastian Pop 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 | 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 d563ad369a5..41f05b0fbb5 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,22 @@ +2010-02-10 Sebastian Pop + + 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 * 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]; +} -- 2.11.0