mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-25 16:50:49 +08:00
re PR tree-optimization/42771 ([graphite] ICE: in graphite_loop_normal_form, at graphite-sese-to-poly.c (2))
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. From-SVN: r156711
This commit is contained in:
parent
01e64c3dc7
commit
a1954f72c6
@ -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
|
||||
|
@ -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 ();
|
||||
|
||||
|
@ -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 *);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
build_poly_scop (scop);
|
||||
|
||||
if (!build_poly_scop (scop))
|
||||
continue;
|
||||
|
||||
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);
|
||||
|
59
gcc/sese.c
59
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
|
||||
|
@ -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. */
|
||||
|
||||
|
19
gcc/testsuite/gcc.dg/graphite/pr42771.c
Normal file
19
gcc/testsuite/gcc.dg/graphite/pr42771.c
Normal file
@ -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];
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user