On Thu, Jul 8, 2021 at 2:41 PM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> 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,

Reply via email to