On Tue, Jul 24, 2018 at 11:59 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > This patch changes SLP_TREE_VEC_STMTS from a vec<gimple *> to a > vec<stmt_vec_info>. This involved making the same change to the > phis vector in vectorizable_reduction, since SLP_TREE_VEC_STMTS is > spliced into it here: > > phis.splice (SLP_TREE_VEC_STMTS (slp_node_instance->reduc_phis));
OK, saw that coming - question from earlier patch still stands. Richard. > > 2018-07-24 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vectorizer.h (_slp_tree::vec_stmts): Change from a > vec<gimple *> to a vec<stmt_vec_info>. > * tree-vect-loop.c (vect_create_epilog_for_reduction): Change > the reduction_phis argument from a vec<gimple *> to a > vec<stmt_vec_info>. > (vectorizable_reduction): Likewise the phis local variable that > is passed to vect_create_epilog_for_reduction. Update for new type > of SLP_TREE_VEC_STMTS. > (vectorizable_induction): Update for new type of SLP_TREE_VEC_STMTS. > (vectorizable_live_operation): Likewise. > * tree-vect-slp.c (vect_get_slp_vect_defs): Likewise. > (vect_transform_slp_perm_load, vect_schedule_slp_instance): Likewise. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2018-07-24 10:22:47.489157307 +0100 > +++ gcc/tree-vectorizer.h 2018-07-24 10:22:50.777128110 +0100 > @@ -143,7 +143,7 @@ struct _slp_tree { > permutation. */ > vec<unsigned> load_permutation; > /* Vectorized stmt/s. */ > - vec<gimple *> vec_stmts; > + vec<stmt_vec_info> vec_stmts; > /* Number of vector stmts that are created to replace the group of scalar > stmts. It is calculated during the transformation phase as the number of > scalar elements in one scalar iteration (GROUP_SIZE) multiplied by VF > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2018-07-24 10:22:47.489157307 +0100 > +++ gcc/tree-vect-loop.c 2018-07-24 10:22:50.777128110 +0100 > @@ -4412,7 +4412,7 @@ get_initial_defs_for_reduction (slp_tree > vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt, > gimple *reduc_def_stmt, > int ncopies, internal_fn reduc_fn, > - vec<gimple *> reduction_phis, > + vec<stmt_vec_info> reduction_phis, > bool double_reduc, > slp_tree slp_node, > slp_instance slp_node_instance, > @@ -4429,6 +4429,7 @@ vect_create_epilog_for_reduction (vec<tr > tree scalar_dest; > tree scalar_type; > gimple *new_phi = NULL, *phi; > + stmt_vec_info phi_info; > gimple_stmt_iterator exit_gsi; > tree vec_dest; > tree new_temp = NULL_TREE, new_dest, new_name, new_scalar_dest; > @@ -4442,7 +4443,8 @@ vect_create_epilog_for_reduction (vec<tr > tree orig_name, scalar_result; > imm_use_iterator imm_iter, phi_imm_iter; > use_operand_p use_p, phi_use_p; > - gimple *use_stmt, *reduction_phi = NULL; > + gimple *use_stmt; > + stmt_vec_info reduction_phi_info = NULL; > bool nested_in_vect_loop = false; > auto_vec<gimple *> new_phis; > auto_vec<stmt_vec_info> inner_phis; > @@ -4540,7 +4542,7 @@ vect_create_epilog_for_reduction (vec<tr > } > > /* Set phi nodes arguments. */ > - FOR_EACH_VEC_ELT (reduction_phis, i, phi) > + FOR_EACH_VEC_ELT (reduction_phis, i, phi_info) > { > tree vec_init_def = vec_initial_defs[i]; > tree def = vect_defs[i]; > @@ -4548,7 +4550,7 @@ vect_create_epilog_for_reduction (vec<tr > { > if (j != 0) > { > - phi = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (phi)); > + phi_info = STMT_VINFO_RELATED_STMT (phi_info); > if (nested_in_vect_loop) > vec_init_def > = vect_get_vec_def_for_stmt_copy (initial_def_dt, > @@ -4557,6 +4559,7 @@ vect_create_epilog_for_reduction (vec<tr > > /* Set the loop-entry arg of the reduction-phi. */ > > + gphi *phi = as_a <gphi *> (phi_info->stmt); > if (STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) > == INTEGER_INDUC_COND_REDUCTION) > { > @@ -4569,19 +4572,18 @@ vect_create_epilog_for_reduction (vec<tr > tree induc_val_vec > = build_vector_from_val (vec_init_def_type, induc_val); > > - add_phi_arg (as_a <gphi *> (phi), induc_val_vec, > - loop_preheader_edge (loop), UNKNOWN_LOCATION); > + add_phi_arg (phi, induc_val_vec, loop_preheader_edge (loop), > + UNKNOWN_LOCATION); > } > else > - add_phi_arg (as_a <gphi *> (phi), vec_init_def, > - loop_preheader_edge (loop), UNKNOWN_LOCATION); > + add_phi_arg (phi, vec_init_def, loop_preheader_edge (loop), > + UNKNOWN_LOCATION); > > /* Set the loop-latch arg for the reduction-phi. */ > if (j > 0) > def = vect_get_vec_def_for_stmt_copy (vect_unknown_def_type, > def); > > - add_phi_arg (as_a <gphi *> (phi), def, loop_latch_edge (loop), > - UNKNOWN_LOCATION); > + add_phi_arg (phi, def, loop_latch_edge (loop), UNKNOWN_LOCATION); > > if (dump_enabled_p ()) > { > @@ -5599,7 +5601,7 @@ vect_create_epilog_for_reduction (vec<tr > if (k % ratio == 0) > { > epilog_stmt = new_phis[k / ratio]; > - reduction_phi = reduction_phis[k / ratio]; > + reduction_phi_info = reduction_phis[k / ratio]; > if (double_reduc) > inner_phi = inner_phis[k / ratio]; > } > @@ -5672,7 +5674,6 @@ vect_create_epilog_for_reduction (vec<tr > stmt_vec_info use_stmt_vinfo; > tree vect_phi_init, preheader_arg, vect_phi_res; > basic_block bb = gimple_bb (use_stmt); > - gimple *use; > > /* Check that USE_STMT is really double reduction phi > node. */ > @@ -5722,13 +5723,14 @@ vect_create_epilog_for_reduction (vec<tr > /* Replace the use, i.e., set the correct vs1 in the > regular > reduction phi node. FORNOW, NCOPIES is always 1, so the > loop is redundant. */ > - use = reduction_phi; > - for (j = 0; j < ncopies; j++) > - { > - edge pr_edge = loop_preheader_edge (loop); > - SET_PHI_ARG_DEF (use, pr_edge->dest_idx, vect_phi_res); > - use = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (use)); > - } > + stmt_vec_info use_info = reduction_phi_info; > + for (j = 0; j < ncopies; j++) > + { > + edge pr_edge = loop_preheader_edge (loop); > + SET_PHI_ARG_DEF (as_a <gphi *> (use_info->stmt), > + pr_edge->dest_idx, vect_phi_res); > + use_info = STMT_VINFO_RELATED_STMT (use_info); > + } > } > } > } > @@ -6112,7 +6114,7 @@ vectorizable_reduction (gimple *stmt, gi > auto_vec<tree> vec_oprnds1; > auto_vec<tree> vec_oprnds2; > auto_vec<tree> vect_defs; > - auto_vec<gimple *> phis; > + auto_vec<stmt_vec_info> phis; > int vec_num; > tree def0, tem; > tree cr_index_scalar_type = NULL_TREE, cr_index_vector_type = NULL_TREE; > @@ -6218,7 +6220,7 @@ vectorizable_reduction (gimple *stmt, gi > stmt_vec_info new_phi_info = loop_vinfo->add_stmt (new_phi); > > if (slp_node) > - SLP_TREE_VEC_STMTS (slp_node).quick_push (new_phi); > + SLP_TREE_VEC_STMTS (slp_node).quick_push (new_phi_info); > else > { > if (j == 0) > @@ -7075,9 +7077,9 @@ vectorizable_reduction (gimple *stmt, gi > if (code == COND_EXPR) > { > gcc_assert (!slp_node); > - vectorizable_condition (stmt, gsi, vec_stmt, > - PHI_RESULT (phis[0]), > - reduc_index, NULL, NULL); > + vectorizable_condition (stmt, gsi, vec_stmt, > + PHI_RESULT (phis[0]->stmt), > + reduc_index, NULL, NULL); > /* Multiple types are not supported for condition. */ > break; > } > @@ -7501,7 +7503,8 @@ vectorizable_induction (gimple *phi, > /* Create the induction-phi that defines the induction-operand. */ > vec_dest = vect_get_new_vect_var (vectype, vect_simple_var, > "vec_iv_"); > induction_phi = create_phi_node (vec_dest, iv_loop->header); > - loop_vinfo->add_stmt (induction_phi); > + stmt_vec_info induction_phi_info > + = loop_vinfo->add_stmt (induction_phi); > induc_def = PHI_RESULT (induction_phi); > > /* Create the iv update inside the loop */ > @@ -7515,7 +7518,7 @@ vectorizable_induction (gimple *phi, > add_phi_arg (induction_phi, vec_def, loop_latch_edge (iv_loop), > UNKNOWN_LOCATION); > > - SLP_TREE_VEC_STMTS (slp_node).quick_push (induction_phi); > + SLP_TREE_VEC_STMTS (slp_node).quick_push (induction_phi_info); > } > > /* Re-use IVs when we can. */ > @@ -7540,7 +7543,7 @@ vectorizable_induction (gimple *phi, > vec_step = vect_init_vector (phi, new_vec, vectype, NULL); > for (; ivn < nvects; ++ivn) > { > - gimple *iv = SLP_TREE_VEC_STMTS (slp_node)[ivn - nivs]; > + gimple *iv = SLP_TREE_VEC_STMTS (slp_node)[ivn - nivs]->stmt; > tree def; > if (gimple_code (iv) == GIMPLE_PHI) > def = gimple_phi_result (iv); > @@ -7556,8 +7559,8 @@ vectorizable_induction (gimple *phi, > gimple_stmt_iterator tgsi = gsi_for_stmt (iv); > gsi_insert_after (&tgsi, new_stmt, GSI_CONTINUE_LINKING); > } > - loop_vinfo->add_stmt (new_stmt); > - SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt); > + SLP_TREE_VEC_STMTS (slp_node).quick_push > + (loop_vinfo->add_stmt (new_stmt)); > } > } > > @@ -7943,7 +7946,7 @@ vectorizable_live_operation (gimple *stm > gcc_assert (!LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)); > > /* Get the correct slp vectorized stmt. */ > - gimple *vec_stmt = SLP_TREE_VEC_STMTS (slp_node)[vec_entry]; > + gimple *vec_stmt = SLP_TREE_VEC_STMTS (slp_node)[vec_entry]->stmt; > if (gphi *phi = dyn_cast <gphi *> (vec_stmt)) > vec_lhs = gimple_phi_result (phi); > else > Index: gcc/tree-vect-slp.c > =================================================================== > --- gcc/tree-vect-slp.c 2018-07-24 10:22:44.293185688 +0100 > +++ gcc/tree-vect-slp.c 2018-07-24 10:22:50.777128110 +0100 > @@ -3557,18 +3557,18 @@ vect_get_constant_vectors (tree op, slp_ > vect_get_slp_vect_defs (slp_tree slp_node, vec<tree> *vec_oprnds) > { > tree vec_oprnd; > - gimple *vec_def_stmt; > + stmt_vec_info vec_def_stmt_info; > unsigned int i; > > gcc_assert (SLP_TREE_VEC_STMTS (slp_node).exists ()); > > - FOR_EACH_VEC_ELT (SLP_TREE_VEC_STMTS (slp_node), i, vec_def_stmt) > + FOR_EACH_VEC_ELT (SLP_TREE_VEC_STMTS (slp_node), i, vec_def_stmt_info) > { > - gcc_assert (vec_def_stmt); > - if (gimple_code (vec_def_stmt) == GIMPLE_PHI) > - vec_oprnd = gimple_phi_result (vec_def_stmt); > + gcc_assert (vec_def_stmt_info); > + if (gphi *vec_def_phi = dyn_cast <gphi *> (vec_def_stmt_info->stmt)) > + vec_oprnd = gimple_phi_result (vec_def_phi); > else > - vec_oprnd = gimple_get_lhs (vec_def_stmt); > + vec_oprnd = gimple_get_lhs (vec_def_stmt_info->stmt); > vec_oprnds->quick_push (vec_oprnd); > } > } > @@ -3687,6 +3687,7 @@ vect_transform_slp_perm_load (slp_tree n > { > gimple *stmt = SLP_TREE_SCALAR_STMTS (node)[0]; > stmt_vec_info stmt_info = vinfo_for_stmt (stmt); > + vec_info *vinfo = stmt_info->vinfo; > tree mask_element_type = NULL_TREE, mask_type; > int vec_index = 0; > tree vectype = STMT_VINFO_VECTYPE (stmt_info); > @@ -3827,26 +3828,28 @@ vect_transform_slp_perm_load (slp_tree n > /* Generate the permute statement if necessary. */ > tree first_vec = dr_chain[first_vec_index]; > tree second_vec = dr_chain[second_vec_index]; > - gimple *perm_stmt; > + stmt_vec_info perm_stmt_info; > if (! noop_p) > { > tree perm_dest > = vect_create_destination_var (gimple_assign_lhs > (stmt), > vectype); > perm_dest = make_ssa_name (perm_dest); > - perm_stmt = gimple_build_assign (perm_dest, > - VEC_PERM_EXPR, > - first_vec, second_vec, > - mask_vec); > - vect_finish_stmt_generation (stmt, perm_stmt, gsi); > + gassign *perm_stmt > + = gimple_build_assign (perm_dest, VEC_PERM_EXPR, > + first_vec, second_vec, > + mask_vec); > + perm_stmt_info > + = vect_finish_stmt_generation (stmt, perm_stmt, gsi); > } > else > /* If mask was NULL_TREE generate the requested > identity transform. */ > - perm_stmt = SSA_NAME_DEF_STMT (first_vec); > + perm_stmt_info = vinfo->lookup_def (first_vec); > > /* Store the vector statement in NODE. */ > - SLP_TREE_VEC_STMTS (node)[vect_stmts_counter++] = perm_stmt; > + SLP_TREE_VEC_STMTS (node)[vect_stmts_counter++] > + = perm_stmt_info; > } > > index = 0; > @@ -3948,8 +3951,8 @@ vect_schedule_slp_instance (slp_tree nod > mask.quick_push (0); > if (ocode != ERROR_MARK) > { > - vec<gimple *> v0; > - vec<gimple *> v1; > + vec<stmt_vec_info> v0; > + vec<stmt_vec_info> v1; > unsigned j; > tree tmask = NULL_TREE; > vect_transform_stmt (stmt, &si, &grouped_store, node, instance); > @@ -3990,10 +3993,11 @@ vect_schedule_slp_instance (slp_tree nod > gimple *vstmt; > vstmt = gimple_build_assign (make_ssa_name (vectype), > VEC_PERM_EXPR, > - gimple_assign_lhs (v0[j]), > - gimple_assign_lhs (v1[j]), tmask); > - vect_finish_stmt_generation (stmt, vstmt, &si); > - SLP_TREE_VEC_STMTS (node).quick_push (vstmt); > + gimple_assign_lhs (v0[j]->stmt), > + gimple_assign_lhs (v1[j]->stmt), > + tmask); > + SLP_TREE_VEC_STMTS (node).quick_push > + (vect_finish_stmt_generation (stmt, vstmt, &si)); > } > v0.release (); > v1.release ();