re PR tree-optimization/42732 ([graphite] ICE: verify_ssa failed)
Fix PR42732. 2010-01-14 Sebastian Pop <sebastian.pop@amd.com> PR middle-end/42732 * graphite-clast-to-gimple.c (gloog): Call scev_reset_htab and rename_nb_iterations. * sese.c (rename_variables_in_operand): New. (rename_variables_in_expr): New. (rename_nb_iterations): New. (sese_adjust_liveout_phis): Update the rename_map. * sese.h (rename_nb_iterations): Declared. * tree-scalar-evolution.c (scev_reset_htab): New. (scev_reset): Call scev_reset_htab. * tree-scalar-evolution.h (scev_reset_htab): Declared. * testsuite/gfortran.dg/graphite/pr42732.f: New. From-SVN: r155881
This commit is contained in:
parent
453897b4dd
commit
a7bf45dee5
|
@ -1,3 +1,19 @@
|
||||||
|
2010-01-14 Sebastian Pop <sebastian.pop@amd.com>
|
||||||
|
|
||||||
|
PR middle-end/42732
|
||||||
|
* graphite-clast-to-gimple.c (gloog): Call scev_reset_htab and
|
||||||
|
rename_nb_iterations.
|
||||||
|
* sese.c (rename_variables_in_operand): New.
|
||||||
|
(rename_variables_in_expr): New.
|
||||||
|
(rename_nb_iterations): New.
|
||||||
|
(sese_adjust_liveout_phis): Update the rename_map.
|
||||||
|
* sese.h (rename_nb_iterations): Declared.
|
||||||
|
* tree-scalar-evolution.c (scev_reset_htab): New.
|
||||||
|
(scev_reset): Call scev_reset_htab.
|
||||||
|
* tree-scalar-evolution.h (scev_reset_htab): Declared.
|
||||||
|
|
||||||
|
* testsuite/gfortran.dg/graphite/pr42732.f: New.
|
||||||
|
|
||||||
2010-01-08 Sebastian Pop <sebastian.pop@amd.com>
|
2010-01-08 Sebastian Pop <sebastian.pop@amd.com>
|
||||||
|
|
||||||
PR middle-end/42393
|
PR middle-end/42393
|
||||||
|
|
|
@ -1400,8 +1400,8 @@ debug_generated_program (scop_p scop)
|
||||||
print_generated_program (stderr, scop);
|
print_generated_program (stderr, scop);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add CLooG names to parameter index. The index is used to translate back from
|
/* Add CLooG names to parameter index. The index is used to translate
|
||||||
* CLooG names to GCC trees. */
|
back from CLooG names to GCC trees. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_params_index (htab_t index_table, CloogProgram *prog) {
|
create_params_index (htab_t index_table, CloogProgram *prog) {
|
||||||
|
@ -1471,6 +1471,8 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
|
||||||
if_region->region->exit->src,
|
if_region->region->exit->src,
|
||||||
if_region->false_region->exit,
|
if_region->false_region->exit,
|
||||||
if_region->true_region->exit);
|
if_region->true_region->exit);
|
||||||
|
scev_reset_htab ();
|
||||||
|
rename_nb_iterations (rename_map);
|
||||||
recompute_all_dominators ();
|
recompute_all_dominators ();
|
||||||
graphite_verify ();
|
graphite_verify ();
|
||||||
|
|
||||||
|
|
69
gcc/sese.c
69
gcc/sese.c
|
@ -486,7 +486,7 @@ sese_adjust_vphi (sese region, gimple phi, edge true_e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the name associated to OLD_NAME in MAP. */
|
/* Returns the expression associated to OLD_NAME in MAP. */
|
||||||
|
|
||||||
static tree
|
static tree
|
||||||
get_rename (htab_t map, tree old_name)
|
get_rename (htab_t map, tree old_name)
|
||||||
|
@ -503,7 +503,7 @@ get_rename (htab_t map, tree old_name)
|
||||||
return old_name;
|
return old_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register in MAP the rename tuple (old_name, expr). */
|
/* Register in MAP the rename tuple (OLD_NAME, EXPR). */
|
||||||
|
|
||||||
void
|
void
|
||||||
set_rename (htab_t map, tree old_name, tree expr)
|
set_rename (htab_t map, tree old_name, tree expr)
|
||||||
|
@ -526,6 +526,67 @@ set_rename (htab_t map, tree old_name, tree expr)
|
||||||
*slot = new_rename_map_elt (old_name, 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. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
rename_variables_in_expr (htab_t rename_map, tree t)
|
||||||
|
{
|
||||||
|
if (!t)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (TREE_CODE_LENGTH (TREE_CODE (t)))
|
||||||
|
{
|
||||||
|
case 3:
|
||||||
|
rename_variables_in_operand (rename_map, t, 2);
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
rename_variables_in_operand (rename_map, t, 1);
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
rename_variables_in_operand (rename_map, t, 0);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Renames all the loop->nb_iterations expressions following the
|
||||||
|
tuples (OLD_NAME, EXPR) in RENAME_MAP. */
|
||||||
|
|
||||||
|
void
|
||||||
|
rename_nb_iterations (htab_t rename_map)
|
||||||
|
{
|
||||||
|
loop_iterator li;
|
||||||
|
struct loop *loop;
|
||||||
|
|
||||||
|
FOR_EACH_LOOP (li, loop, 0)
|
||||||
|
{
|
||||||
|
rename_variables_in_expr (rename_map, loop->nb_iterations);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Adjusts the phi nodes in the block BB for variables defined in
|
/* Adjusts the phi nodes in the block BB for variables defined in
|
||||||
SCOP_REGION and used outside the SCOP_REGION. The code generation
|
SCOP_REGION and used outside the SCOP_REGION. The code generation
|
||||||
moves SCOP_REGION in the else clause of an "if (1)" and generates
|
moves SCOP_REGION in the else clause of an "if (1)" and generates
|
||||||
|
@ -550,8 +611,9 @@ sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
|
||||||
unsigned i;
|
unsigned i;
|
||||||
unsigned false_i = 0;
|
unsigned false_i = 0;
|
||||||
gimple phi = gsi_stmt (si);
|
gimple phi = gsi_stmt (si);
|
||||||
|
tree res = gimple_phi_result (phi);
|
||||||
|
|
||||||
if (!is_gimple_reg (PHI_RESULT (phi)))
|
if (!is_gimple_reg (res))
|
||||||
{
|
{
|
||||||
sese_adjust_vphi (region, phi, true_e);
|
sese_adjust_vphi (region, phi, true_e);
|
||||||
continue;
|
continue;
|
||||||
|
@ -585,6 +647,7 @@ sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_PHI_ARG_DEF (phi, i, expr);
|
SET_PHI_ARG_DEF (phi, i, expr);
|
||||||
|
set_rename (rename_map, old_name, res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,6 +262,7 @@ extern void debug_rename_map (htab_t);
|
||||||
extern hashval_t rename_map_elt_info (const void *);
|
extern hashval_t rename_map_elt_info (const void *);
|
||||||
extern int eq_rename_map_elts (const void *, const void *);
|
extern int eq_rename_map_elts (const void *, const void *);
|
||||||
extern void set_rename (htab_t, tree, tree);
|
extern void set_rename (htab_t, tree, tree);
|
||||||
|
extern void rename_nb_iterations (htab_t);
|
||||||
|
|
||||||
/* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
|
/* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW. */
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
! { dg-options "-O2 -fgraphite-identity" }
|
||||||
|
|
||||||
|
parameter(in = 128+5
|
||||||
|
& , jn = 128+5
|
||||||
|
& , kn = 128+5)
|
||||||
|
real*8 d (in,jn,kn)
|
||||||
|
real*8 dcopy(in,jn,kn)
|
||||||
|
call pdv (is, dcopy)
|
||||||
|
do k=ks,ke
|
||||||
|
do j=je+1,je+2
|
||||||
|
do i=is-2,ie+2
|
||||||
|
dcopy(i,j,k) = d(i,j,k)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
do k=ks,ke
|
||||||
|
do j=js,je
|
||||||
|
do i=is-2,is-1
|
||||||
|
dcopy(i,j,k) = d(i,j,k)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
end
|
|
@ -3033,7 +3033,20 @@ scev_initialize (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cleans up the information cached by the scalar evolutions analysis. */
|
/* Cleans up the information cached by the scalar evolutions analysis
|
||||||
|
in the hash table. */
|
||||||
|
|
||||||
|
void
|
||||||
|
scev_reset_htab (void)
|
||||||
|
{
|
||||||
|
if (!scalar_evolution_info)
|
||||||
|
return;
|
||||||
|
|
||||||
|
htab_empty (scalar_evolution_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleans up the information cached by the scalar evolutions analysis
|
||||||
|
in the hash table and in the loop->nb_iterations. */
|
||||||
|
|
||||||
void
|
void
|
||||||
scev_reset (void)
|
scev_reset (void)
|
||||||
|
@ -3041,10 +3054,11 @@ scev_reset (void)
|
||||||
loop_iterator li;
|
loop_iterator li;
|
||||||
struct loop *loop;
|
struct loop *loop;
|
||||||
|
|
||||||
if (!scalar_evolution_info || !current_loops)
|
scev_reset_htab ();
|
||||||
|
|
||||||
|
if (!current_loops)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
htab_empty (scalar_evolution_info);
|
|
||||||
FOR_EACH_LOOP (li, loop, 0)
|
FOR_EACH_LOOP (li, loop, 0)
|
||||||
{
|
{
|
||||||
loop->nb_iterations = NULL_TREE;
|
loop->nb_iterations = NULL_TREE;
|
||||||
|
|
|
@ -27,6 +27,7 @@ extern gimple get_loop_exit_condition (const struct loop *);
|
||||||
|
|
||||||
extern void scev_initialize (void);
|
extern void scev_initialize (void);
|
||||||
extern void scev_reset (void);
|
extern void scev_reset (void);
|
||||||
|
extern void scev_reset_htab (void);
|
||||||
extern void scev_finalize (void);
|
extern void scev_finalize (void);
|
||||||
extern tree analyze_scalar_evolution (struct loop *, tree);
|
extern tree analyze_scalar_evolution (struct loop *, tree);
|
||||||
extern tree instantiate_scev (basic_block, struct loop *, tree);
|
extern tree instantiate_scev (basic_block, struct loop *, tree);
|
||||||
|
|
Loading…
Reference in New Issue