On Tue, Jul 24, 2018 at 11:53 AM Richard Sandiford
wrote:
>
> vectorizable_reduction has old code to cope with cases in which the
> given statement belongs to a reduction group but isn't the first statement.
> That can no longer happen, since all statements in the group go into the
> same SLP node, and we only check the first statement in each node.
>
> The point is to remove the only path through vectorizable_reduction
> in which stmt and stmt_info refer to different statements.
OK.
>
> 2018-07-24 Richard Sandiford
>
> gcc/
> * tree-vect-loop.c (vectorizable_reduction): Assert that the
> function is not called for second and subsequent members of
> a reduction group.
>
> Index: gcc/tree-vect-loop.c
> ===
> --- gcc/tree-vect-loop.c2018-07-24 10:22:02.965552667 +0100
> +++ gcc/tree-vect-loop.c2018-07-24 10:22:06.269523330 +0100
> @@ -6162,7 +6162,6 @@ vectorizable_reduction (gimple *stmt, gi
>auto_vec phis;
>int vec_num;
>tree def0, tem;
> - bool first_p = true;
>tree cr_index_scalar_type = NULL_TREE, cr_index_vector_type = NULL_TREE;
>tree cond_reduc_val = NULL_TREE;
>
> @@ -6178,15 +6177,8 @@ vectorizable_reduction (gimple *stmt, gi
>nested_cycle = true;
> }
>
> - /* In case of reduction chain we switch to the first stmt in the chain, but
> - we don't update STMT_INFO, since only the last stmt is marked as
> reduction
> - and has reduction properties. */
> - if (REDUC_GROUP_FIRST_ELEMENT (stmt_info)
> - && REDUC_GROUP_FIRST_ELEMENT (stmt_info) != stmt)
> -{
> - stmt = REDUC_GROUP_FIRST_ELEMENT (stmt_info);
> - first_p = false;
> -}
> + if (REDUC_GROUP_FIRST_ELEMENT (stmt_info))
> +gcc_assert (slp_node && REDUC_GROUP_FIRST_ELEMENT (stmt_info) == stmt);
>
>if (gimple_code (stmt) == GIMPLE_PHI)
> {
> @@ -7050,8 +7042,7 @@ vectorizable_reduction (gimple *stmt, gi
>
>if (!vec_stmt) /* transformation not required. */
> {
> - if (first_p)
> - vect_model_reduction_cost (stmt_info, reduc_fn, ncopies, cost_vec);
> + vect_model_reduction_cost (stmt_info, reduc_fn, ncopies, cost_vec);
>if (loop_vinfo && LOOP_VINFO_CAN_FULLY_MASK_P (loop_vinfo))
> {
> if (reduction_type != FOLD_LEFT_REDUCTION