On Thu, Jul 8, 2021 at 2:41 PM Richard Sandiford via Gcc-patches
<[email protected]> wrote:
>
> vect_create_epilog_for_reduction only handles two cases: single-loop
> reductions and double reductions. “nested cycles” (i.e. reductions
> in the inner loop when vectorising an outer loop) are handled elsewhere
> and don't need a vector->scalar reduction.
>
> The function had variables called nested_in_vect_loop and double_reduc
> and asserted that nested_in_vect_loop implied double_reduc, but it
> still had code to handle nested_in_vect_loop && !double_reduc.
> This patch removes that and uses double_reduc everywhere.
OK.
(cleaning up after the GCC 10 time refactoring was still on my list :/)
> gcc/
> * tree-vect-loop.c (vect_create_epilog_for_reduction): Remove
> nested_in_vect_loop and use double_reduc everywhere. Remove dead
> assignment to "loop".
> ---
> gcc/tree-vect-loop.c | 30 ++++--------------------------
> 1 file changed, 4 insertions(+), 26 deletions(-)
>
> diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
> index bc523d151c6..7c3e3352b43 100644
> --- a/gcc/tree-vect-loop.c
> +++ b/gcc/tree-vect-loop.c
> @@ -5005,7 +5005,6 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
> imm_use_iterator imm_iter, phi_imm_iter;
> use_operand_p use_p, phi_use_p;
> gimple *use_stmt;
> - bool nested_in_vect_loop = false;
> auto_vec<gimple *> new_phis;
> int j, i;
> auto_vec<tree> scalar_results;
> @@ -5023,10 +5022,8 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
> {
> outer_loop = loop;
> loop = loop->inner;
> - nested_in_vect_loop = true;
> - gcc_assert (!slp_node);
> + gcc_assert (!slp_node && double_reduc);
> }
> - gcc_assert (!nested_in_vect_loop || double_reduc);
>
> vectype = STMT_VINFO_REDUC_VECTYPE (reduc_info);
> gcc_assert (vectype);
> @@ -5049,8 +5046,6 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
> induc_val = STMT_VINFO_VEC_INDUC_COND_INITIAL_VAL (reduc_info);
> else if (double_reduc)
> ;
> - else if (nested_in_vect_loop)
> - ;
> else
> adjustment_def = STMT_VINFO_REDUC_EPILOGUE_ADJUSTMENT (reduc_info);
> }
> @@ -5923,7 +5918,7 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
> {
> gcc_assert (!slp_reduc);
> gimple_seq stmts = NULL;
> - if (nested_in_vect_loop)
> + if (double_reduc)
> {
> new_phi = new_phis[0];
> gcc_assert (VECTOR_TYPE_P (TREE_TYPE (adjustment_def)));
> @@ -5942,21 +5937,12 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
>
> epilog_stmt = gimple_seq_last_stmt (stmts);
> gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT);
> - if (nested_in_vect_loop)
> - {
> - if (!double_reduc)
> - scalar_results.quick_push (new_temp);
> - else
> - scalar_results[0] = new_temp;
> - }
> - else
> - scalar_results[0] = new_temp;
> -
> + scalar_results[0] = new_temp;
> new_phis[0] = epilog_stmt;
> }
>
> if (double_reduc)
> - loop = loop->inner;
> + loop = outer_loop;
>
> /* 2.6 Handle the loop-exit phis. Replace the uses of scalar loop-exit
> phis with new adjusted scalar results, i.e., replace use <s_out0>
> @@ -6017,14 +6003,6 @@ vect_create_epilog_for_reduction (loop_vec_info
> loop_vinfo,
> scalar_dest = gimple_assign_lhs (scalar_stmt_info->stmt);
> }
>
> - if (nested_in_vect_loop)
> - {
> - if (double_reduc)
> - loop = outer_loop;
> - else
> - gcc_unreachable ();
> - }
> -
> phis.create (3);
> /* Find the loop-closed-use at the loop exit of the original scalar
> result. (The reduction result is expected to have two immediate
> uses,