On Tue, Jul 24, 2018 at 11:53 AM Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> This minor clean-up avoids repeating the test for double reductions
> and also moves the vect_get_vec_def_for_operand call to the same
> function as the corresponding vect_get_vec_def_for_stmt_copy.

OK.

>
> 2018-07-24  Richard Sandiford  <richard.sandif...@arm.com>
>
> gcc/
>         * tree-vect-loop.c (get_initial_def_for_reduction): Move special
>         cases for nested loops from here to ...
>         (vect_create_epilog_for_reduction): ...here.  Only call
>         vect_is_simple_use for inner-loop reductions.
>
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c        2018-07-13 10:11:14.429843575 +0100
> +++ gcc/tree-vect-loop.c        2018-07-24 10:22:02.965552667 +0100
> @@ -4113,10 +4113,8 @@ get_initial_def_for_reduction (gimple *s
>    enum tree_code code = gimple_assign_rhs_code (stmt);
>    tree def_for_init;
>    tree init_def;
> -  bool nested_in_vect_loop = false;
>    REAL_VALUE_TYPE real_init_val = dconst0;
>    int int_init_val = 0;
> -  gimple *def_stmt = NULL;
>    gimple_seq stmts = NULL;
>
>    gcc_assert (vectype);
> @@ -4124,39 +4122,12 @@ get_initial_def_for_reduction (gimple *s
>    gcc_assert (POINTER_TYPE_P (scalar_type) || INTEGRAL_TYPE_P (scalar_type)
>               || SCALAR_FLOAT_TYPE_P (scalar_type));
>
> -  if (nested_in_vect_loop_p (loop, stmt))
> -    nested_in_vect_loop = true;
> -  else
> -    gcc_assert (loop == (gimple_bb (stmt))->loop_father);
> -
> -  /* In case of double reduction we only create a vector variable to be put
> -     in the reduction phi node.  The actual statement creation is done in
> -     vect_create_epilog_for_reduction.  */
> -  if (adjustment_def && nested_in_vect_loop
> -      && TREE_CODE (init_val) == SSA_NAME
> -      && (def_stmt = SSA_NAME_DEF_STMT (init_val))
> -      && gimple_code (def_stmt) == GIMPLE_PHI
> -      && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
> -      && vinfo_for_stmt (def_stmt)
> -      && STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt))
> -          == vect_double_reduction_def)
> -    {
> -      *adjustment_def = NULL;
> -      return vect_create_destination_var (init_val, vectype);
> -    }
> +  gcc_assert (nested_in_vect_loop_p (loop, stmt)
> +             || loop == (gimple_bb (stmt))->loop_father);
>
>    vect_reduction_type reduction_type
>      = STMT_VINFO_VEC_REDUCTION_TYPE (stmt_vinfo);
>
> -  /* In case of a nested reduction do not use an adjustment def as
> -     that case is not supported by the epilogue generation correctly
> -     if ncopies is not one.  */
> -  if (adjustment_def && nested_in_vect_loop)
> -    {
> -      *adjustment_def = NULL;
> -      return vect_get_vec_def_for_operand (init_val, stmt);
> -    }
> -
>    switch (code)
>      {
>      case WIDEN_SUM_EXPR:
> @@ -4586,9 +4557,22 @@ vect_create_epilog_for_reduction (vec<tr
>               || (induc_code == MIN_EXPR
>                   && tree_int_cst_lt (induc_val, initial_def))))
>         induc_val = initial_def;
> -      vect_is_simple_use (initial_def, loop_vinfo, &initial_def_dt);
> -      vec_initial_def = get_initial_def_for_reduction (stmt, initial_def,
> -                                                      &adjustment_def);
> +
> +      if (double_reduc)
> +       /* In case of double reduction we only create a vector variable
> +          to be put in the reduction phi node.  The actual statement
> +          creation is done later in this function.  */
> +       vec_initial_def = vect_create_destination_var (initial_def, vectype);
> +      else if (nested_in_vect_loop)
> +       {
> +         /* Do not use an adjustment def as that case is not supported
> +            correctly if ncopies is not one.  */
> +         vect_is_simple_use (initial_def, loop_vinfo, &initial_def_dt);
> +         vec_initial_def = vect_get_vec_def_for_operand (initial_def, stmt);
> +       }
> +      else
> +       vec_initial_def = get_initial_def_for_reduction (stmt, initial_def,
> +                                                        &adjustment_def);
>        vec_initial_defs.create (1);
>        vec_initial_defs.quick_push (vec_initial_def);
>      }

Reply via email to