mirror of git://gcc.gnu.org/git/gcc.git
re PR tree-optimization/80906 (ICE in copy_loop_close_phi_args, at graphite-isl-ast-to-gimple.c:2094)
2017-05-31 Richard Biener <rguenther@suse.de> PR tree-optimization/80906 * graphite-isl-ast-to-gimple.c (copy_loop_close_phi_nodes): Get and pass through iv_map. (copy_bb_and_scalar_dependences): Adjust. (translate_pending_phi_nodes): Likewise. (copy_loop_close_phi_args): Handle code-generating IVs instead of ICEing. * gcc.dg/graphite/pr80906.c: New testcase. From-SVN: r248722
This commit is contained in:
parent
63d9caf904
commit
ee1379be56
|
|
@ -1,3 +1,13 @@
|
||||||
|
2017-05-31 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/80906
|
||||||
|
* graphite-isl-ast-to-gimple.c (copy_loop_close_phi_nodes): Get
|
||||||
|
and pass through iv_map.
|
||||||
|
(copy_bb_and_scalar_dependences): Adjust.
|
||||||
|
(translate_pending_phi_nodes): Likewise.
|
||||||
|
(copy_loop_close_phi_args): Handle code-generating IVs instead
|
||||||
|
of ICEing.
|
||||||
|
|
||||||
2017-05-30 David Malcolm <dmalcolm@redhat.com>
|
2017-05-30 David Malcolm <dmalcolm@redhat.com>
|
||||||
|
|
||||||
* diagnostic-color.c (color_dict): Add "type-diff".
|
* diagnostic-color.c (color_dict): Add "type-diff".
|
||||||
|
|
|
||||||
|
|
@ -229,8 +229,9 @@ class translate_isl_ast_to_gimple
|
||||||
tree add_close_phis_to_outer_loops (tree last_merge_name, edge merge_e,
|
tree add_close_phis_to_outer_loops (tree last_merge_name, edge merge_e,
|
||||||
gimple *old_close_phi);
|
gimple *old_close_phi);
|
||||||
bool copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb,
|
bool copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb,
|
||||||
bool postpone);
|
vec<tree> iv_map, bool postpone);
|
||||||
bool copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb);
|
bool copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb,
|
||||||
|
vec<tree> iv_map);
|
||||||
bool copy_cond_phi_args (gphi *phi, gphi *new_phi, vec<tree> iv_map,
|
bool copy_cond_phi_args (gphi *phi, gphi *new_phi, vec<tree> iv_map,
|
||||||
bool postpone);
|
bool postpone);
|
||||||
bool copy_cond_phi_nodes (basic_block bb, basic_block new_bb,
|
bool copy_cond_phi_nodes (basic_block bb, basic_block new_bb,
|
||||||
|
|
@ -2079,7 +2080,8 @@ add_close_phis_to_merge_points (gphi *old_close_phi, gphi *new_close_phi,
|
||||||
/* Copy all the loop-close phi args from BB to NEW_BB. */
|
/* Copy all the loop-close phi args from BB to NEW_BB. */
|
||||||
|
|
||||||
bool translate_isl_ast_to_gimple::
|
bool translate_isl_ast_to_gimple::
|
||||||
copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb, bool postpone)
|
copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb,
|
||||||
|
vec<tree> iv_map, bool postpone)
|
||||||
{
|
{
|
||||||
for (gphi_iterator psi = gsi_start_phis (old_bb); !gsi_end_p (psi);
|
for (gphi_iterator psi = gsi_start_phis (old_bb); !gsi_end_p (psi);
|
||||||
gsi_next (&psi))
|
gsi_next (&psi))
|
||||||
|
|
@ -2089,22 +2091,29 @@ copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb, bool postpone)
|
||||||
if (virtual_operand_p (res))
|
if (virtual_operand_p (res))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (is_gimple_reg (res) && scev_analyzable_p (res, region->region))
|
|
||||||
/* Loop close phi nodes should not be scev_analyzable_p. */
|
|
||||||
gcc_unreachable ();
|
|
||||||
|
|
||||||
gphi *new_close_phi = create_phi_node (NULL_TREE, new_bb);
|
gphi *new_close_phi = create_phi_node (NULL_TREE, new_bb);
|
||||||
tree new_res = create_new_def_for (res, new_close_phi,
|
tree new_res = create_new_def_for (res, new_close_phi,
|
||||||
gimple_phi_result_ptr (new_close_phi));
|
gimple_phi_result_ptr (new_close_phi));
|
||||||
set_rename (res, new_res);
|
set_rename (res, new_res);
|
||||||
|
|
||||||
tree old_name = gimple_phi_arg_def (old_close_phi, 0);
|
tree old_name = gimple_phi_arg_def (old_close_phi, 0);
|
||||||
tree new_name = get_new_name (new_bb, old_name, old_bb, close_phi);
|
tree new_name;
|
||||||
|
if (is_gimple_reg (res) && scev_analyzable_p (res, region->region))
|
||||||
|
{
|
||||||
|
gimple_seq stmts;
|
||||||
|
new_name = get_rename_from_scev (old_name, &stmts,
|
||||||
|
old_bb->loop_father,
|
||||||
|
new_bb, old_bb, iv_map);
|
||||||
|
if (! codegen_error_p ())
|
||||||
|
gsi_insert_earliest (stmts);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
new_name = get_new_name (new_bb, old_name, old_bb, close_phi);
|
||||||
|
|
||||||
/* Predecessor basic blocks of a loop close phi should have been code
|
/* Predecessor basic blocks of a loop close phi should have been code
|
||||||
generated before. FIXME: This is fixable by merging PHIs from inner
|
generated before. FIXME: This is fixable by merging PHIs from inner
|
||||||
loops as well. See: gfortran.dg/graphite/interchange-3.f90. */
|
loops as well. See: gfortran.dg/graphite/interchange-3.f90. */
|
||||||
if (!new_name)
|
if (!new_name || codegen_error_p ())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
add_phi_arg (new_close_phi, new_name, single_pred_edge (new_bb),
|
add_phi_arg (new_close_phi, new_name, single_pred_edge (new_bb),
|
||||||
|
|
@ -2152,7 +2161,8 @@ copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb, bool postpone)
|
||||||
/* Copy loop close phi nodes from BB to NEW_BB. */
|
/* Copy loop close phi nodes from BB to NEW_BB. */
|
||||||
|
|
||||||
bool translate_isl_ast_to_gimple::
|
bool translate_isl_ast_to_gimple::
|
||||||
copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb)
|
copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb,
|
||||||
|
vec<tree> iv_map)
|
||||||
{
|
{
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
fprintf (dump_file, "[codegen] copying loop close phi nodes in bb_%d.\n",
|
fprintf (dump_file, "[codegen] copying loop close phi nodes in bb_%d.\n",
|
||||||
|
|
@ -2160,7 +2170,7 @@ copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb)
|
||||||
/* Loop close phi nodes should have only one argument. */
|
/* Loop close phi nodes should have only one argument. */
|
||||||
gcc_assert (1 == EDGE_COUNT (old_bb->preds));
|
gcc_assert (1 == EDGE_COUNT (old_bb->preds));
|
||||||
|
|
||||||
return copy_loop_close_phi_args (old_bb, new_bb, true);
|
return copy_loop_close_phi_args (old_bb, new_bb, iv_map, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2690,7 +2700,7 @@ copy_bb_and_scalar_dependences (basic_block bb, edge next_e, vec<tree> iv_map)
|
||||||
gcc_assert (single_pred_edge (phi_bb)->src->loop_father
|
gcc_assert (single_pred_edge (phi_bb)->src->loop_father
|
||||||
!= single_pred_edge (phi_bb)->dest->loop_father);
|
!= single_pred_edge (phi_bb)->dest->loop_father);
|
||||||
|
|
||||||
if (!copy_loop_close_phi_nodes (bb, phi_bb))
|
if (!copy_loop_close_phi_nodes (bb, phi_bb, iv_map))
|
||||||
{
|
{
|
||||||
codegen_error = true;
|
codegen_error = true;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -2824,7 +2834,7 @@ translate_pending_phi_nodes ()
|
||||||
codegen_error = !copy_loop_phi_args (old_phi, ibp_old_bb, new_phi,
|
codegen_error = !copy_loop_phi_args (old_phi, ibp_old_bb, new_phi,
|
||||||
ibp_new_bb, false);
|
ibp_new_bb, false);
|
||||||
else if (bb_contains_loop_close_phi_nodes (new_bb))
|
else if (bb_contains_loop_close_phi_nodes (new_bb))
|
||||||
codegen_error = !copy_loop_close_phi_args (old_bb, new_bb, false);
|
codegen_error = !copy_loop_close_phi_args (old_bb, new_bb, iv_map, false);
|
||||||
else
|
else
|
||||||
codegen_error = !copy_cond_phi_args (old_phi, new_phi, iv_map, false);
|
codegen_error = !copy_cond_phi_args (old_phi, new_phi, iv_map, false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2017-05-31 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR tree-optimization/80906
|
||||||
|
* gcc.dg/graphite/pr80906.c: New testcase.
|
||||||
|
|
||||||
2017-05-30 Tom de Vries <tom@codesourcery.com>
|
2017-05-30 Tom de Vries <tom@codesourcery.com>
|
||||||
|
|
||||||
PR testsuite/80910
|
PR testsuite/80910
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -floop-nest-optimize -fdump-tree-graphite" } */
|
||||||
|
|
||||||
|
int qc;
|
||||||
|
|
||||||
|
int
|
||||||
|
ec (int lh[][2])
|
||||||
|
{
|
||||||
|
const int jv = 3;
|
||||||
|
int zf, hp, c5 = 0, m3 = 1;
|
||||||
|
|
||||||
|
for (zf = 0; zf < jv; ++zf)
|
||||||
|
for (hp = 0; hp < jv; ++hp)
|
||||||
|
{
|
||||||
|
short int bm = 0;
|
||||||
|
|
||||||
|
for (qc = 0; qc < jv; ++qc)
|
||||||
|
--bm;
|
||||||
|
if (bm != 0)
|
||||||
|
--c5;
|
||||||
|
lh[0][0] = 0;
|
||||||
|
m3 *= jv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c5 + m3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-tree-dump "isl AST to Gimple succeeded" "graphite" } } */
|
||||||
Loading…
Reference in New Issue