On Tue, Jul 24, 2018 at 11:53 AM Richard Sandiford <richard.sandif...@arm.com> 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 <richard.sandif...@arm.com> > > 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.c 2018-07-24 10:22:02.965552667 +0100 > +++ gcc/tree-vect-loop.c 2018-07-24 10:22:06.269523330 +0100 > @@ -6162,7 +6162,6 @@ vectorizable_reduction (gimple *stmt, gi > auto_vec<gimple *> 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