From: Richard Biener Date: Wed, 31 May 2017 07:09:21 +0000 (+0000) Subject: re PR tree-optimization/80906 (ICE in copy_loop_close_phi_args, at graphite-isl-ast... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ee1379be56bcb47ee8dba5f8e31f1d090fecc210;p=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 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da2b93ff900..8429b46d638 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-05-31 Richard Biener + + 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 * diagnostic-color.c (color_dict): Add "type-diff". diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index be54b75baf6..5b2bc1c399f 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -229,8 +229,9 @@ class translate_isl_ast_to_gimple tree add_close_phis_to_outer_loops (tree last_merge_name, edge merge_e, gimple *old_close_phi); bool copy_loop_close_phi_args (basic_block old_bb, basic_block new_bb, - bool postpone); - bool copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb); + vec iv_map, bool postpone); + bool copy_loop_close_phi_nodes (basic_block old_bb, basic_block new_bb, + vec iv_map); bool copy_cond_phi_args (gphi *phi, gphi *new_phi, vec iv_map, bool postpone); 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. */ 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 iv_map, bool postpone) { for (gphi_iterator psi = gsi_start_phis (old_bb); !gsi_end_p (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)) 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); tree new_res = create_new_def_for (res, new_close_phi, gimple_phi_result_ptr (new_close_phi)); set_rename (res, new_res); 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 generated before. FIXME: This is fixable by merging PHIs from inner loops as well. See: gfortran.dg/graphite/interchange-3.f90. */ - if (!new_name) + if (!new_name || codegen_error_p ()) return false; 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. */ 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 iv_map) { if (dump_file) 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. */ 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 iv_map) gcc_assert (single_pred_edge (phi_bb)->src->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; return NULL; @@ -2824,7 +2834,7 @@ translate_pending_phi_nodes () codegen_error = !copy_loop_phi_args (old_phi, ibp_old_bb, new_phi, ibp_new_bb, false); 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 codegen_error = !copy_cond_phi_args (old_phi, new_phi, iv_map, false); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e8c11b0480..e336489188c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-31 Richard Biener + + PR tree-optimization/80906 + * gcc.dg/graphite/pr80906.c: New testcase. + 2017-05-30 Tom de Vries PR testsuite/80910 diff --git a/gcc/testsuite/gcc.dg/graphite/pr80906.c b/gcc/testsuite/gcc.dg/graphite/pr80906.c new file mode 100644 index 00000000000..59c7f59cadf --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr80906.c @@ -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" } } */