This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [20/46] Make *FIRST_ELEMENT and *NEXT_ELEMENT stmt_vec_infos
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, richard dot sandiford at arm dot com
- Date: Wed, 25 Jul 2018 11:27:58 +0200
- Subject: Re: [20/46] Make *FIRST_ELEMENT and *NEXT_ELEMENT stmt_vec_infos
- References: <87wotlrmen.fsf@arm.com> <87in55osvg.fsf@arm.com>
On Tue, Jul 24, 2018 at 12:01 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> This patch changes {REDUC,DR}_GROUP_{FIRST,NEXT} element from a
> gimple stmt to stmt_vec_info.
OK.
>
> 2018-07-24 Richard Sandiford <richard.sandiford@arm.com>
>
> gcc/
> * tree-vectorizer.h (_stmt_vec_info::first_element): Change from
> a gimple stmt to a stmt_vec_info.
> (_stmt_vec_info::next_element): Likewise.
> * tree-vect-data-refs.c (vect_update_misalignment_for_peel)
> (vect_slp_analyze_and_verify_node_alignment)
> (vect_analyze_group_access_1, vect_analyze_group_access)
> (vect_small_gap_p, vect_prune_runtime_alias_test_list)
> (vect_create_data_ref_ptr, vect_record_grouped_load_vectors)
> (vect_supportable_dr_alignment): Update accordingly.
> * tree-vect-loop.c (vect_fixup_reduc_chain): Likewise.
> (vect_fixup_scalar_cycles_with_patterns, vect_is_slp_reduction)
> (vect_is_simple_reduction, vectorizable_reduction): Likewise.
> * tree-vect-patterns.c (vect_reassociating_reduction_p): Likewise.
> * tree-vect-slp.c (vect_build_slp_tree_1)
> (vect_attempt_slp_rearrange_stmts, vect_supported_load_permutation_p)
> (vect_split_slp_store_group, vect_analyze_slp_instance)
> (vect_analyze_slp, vect_transform_slp_perm_load): Likewise.
> * tree-vect-stmts.c (vect_model_store_cost, vect_model_load_cost)
> (get_group_load_store_type, get_load_store_type)
> (get_group_alias_ptr_type, vectorizable_store, vectorizable_load)
> (vect_transform_stmt, vect_remove_stores): Likewise.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h 2018-07-24 10:23:04.033010396 +0100
> +++ gcc/tree-vectorizer.h 2018-07-24 10:23:08.536970400 +0100
> @@ -871,9 +871,9 @@ struct _stmt_vec_info {
>
> /* Interleaving and reduction chains info. */
> /* First element in the group. */
> - gimple *first_element;
> + stmt_vec_info first_element;
> /* Pointer to the next element in the group. */
> - gimple *next_element;
> + stmt_vec_info next_element;
> /* For data-refs, in case that two or more stmts share data-ref, this is the
> pointer to the previously detected stmt with the same dr. */
> gimple *same_dr_stmt;
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c 2018-07-24 10:23:04.029010432 +0100
> +++ gcc/tree-vect-data-refs.c 2018-07-24 10:23:08.532970436 +0100
> @@ -1077,7 +1077,7 @@ vect_update_misalignment_for_peel (struc
> /* For interleaved data accesses the step in the loop must be multiplied by
> the size of the interleaving group. */
> if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
> - dr_size *= DR_GROUP_SIZE (vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (stmt_info)));
> + dr_size *= DR_GROUP_SIZE (DR_GROUP_FIRST_ELEMENT (stmt_info));
> if (STMT_VINFO_GROUPED_ACCESS (peel_stmt_info))
> dr_peel_size *= DR_GROUP_SIZE (peel_stmt_info);
>
> @@ -2370,12 +2370,11 @@ vect_slp_analyze_and_verify_node_alignme
> the node is permuted in which case we start from the first
> element in the group. */
> stmt_vec_info first_stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
> - gimple *first_stmt = first_stmt_info->stmt;
> data_reference_p first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> if (SLP_TREE_LOAD_PERMUTATION (node).exists ())
> - first_stmt = DR_GROUP_FIRST_ELEMENT (first_stmt_info);
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (first_stmt_info);
>
> - data_reference_p dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> + data_reference_p dr = STMT_VINFO_DATA_REF (first_stmt_info);
> vect_compute_data_ref_alignment (dr);
> /* For creating the data-ref pointer we need alignment of the
> first element anyway. */
> @@ -2520,11 +2519,11 @@ vect_analyze_group_access_1 (struct data
> if (DR_GROUP_FIRST_ELEMENT (stmt_info) == stmt_info)
> {
> /* First stmt in the interleaving chain. Check the chain. */
> - gimple *next = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + stmt_vec_info next = DR_GROUP_NEXT_ELEMENT (stmt_info);
> struct data_reference *data_ref = dr;
> unsigned int count = 1;
> tree prev_init = DR_INIT (data_ref);
> - gimple *prev = stmt_info;
> + stmt_vec_info prev = stmt_info;
> HOST_WIDE_INT diff, gaps = 0;
>
> /* By construction, all group members have INTEGER_CST DR_INITs. */
> @@ -2535,8 +2534,7 @@ vect_analyze_group_access_1 (struct data
> stmt, and the rest get their vectorized loads from the first
> one. */
> if (!tree_int_cst_compare (DR_INIT (data_ref),
> - DR_INIT (STMT_VINFO_DATA_REF (
> - vinfo_for_stmt (next)))))
> + DR_INIT (STMT_VINFO_DATA_REF (next))))
> {
> if (DR_IS_WRITE (data_ref))
> {
> @@ -2550,16 +2548,16 @@ vect_analyze_group_access_1 (struct data
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> "Two or more load stmts share the same dr.\n");
>
> - /* For load use the same data-ref load. */
> - DR_GROUP_SAME_DR_STMT (vinfo_for_stmt (next)) = prev;
> + /* For load use the same data-ref load. */
> + DR_GROUP_SAME_DR_STMT (next) = prev;
>
> - prev = next;
> - next = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next));
> - continue;
> + prev = next;
> + next = DR_GROUP_NEXT_ELEMENT (next);
> + continue;
> }
>
> - prev = next;
> - data_ref = STMT_VINFO_DATA_REF (vinfo_for_stmt (next));
> + prev = next;
> + data_ref = STMT_VINFO_DATA_REF (next);
>
> /* All group members have the same STEP by construction. */
> gcc_checking_assert (operand_equal_p (DR_STEP (data_ref), step, 0));
> @@ -2587,12 +2585,12 @@ vect_analyze_group_access_1 (struct data
>
> /* Store the gap from the previous member of the group. If there is no
> gap in the access, DR_GROUP_GAP is always 1. */
> - DR_GROUP_GAP (vinfo_for_stmt (next)) = diff;
> + DR_GROUP_GAP (next) = diff;
>
> - prev_init = DR_INIT (data_ref);
> - next = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next));
> - /* Count the number of data-refs in the chain. */
> - count++;
> + prev_init = DR_INIT (data_ref);
> + next = DR_GROUP_NEXT_ELEMENT (next);
> + /* Count the number of data-refs in the chain. */
> + count++;
> }
>
> if (groupsize == 0)
> @@ -2668,15 +2666,13 @@ vect_analyze_group_access (struct data_r
> if (!vect_analyze_group_access_1 (dr))
> {
> /* Dissolve the group if present. */
> - gimple *next;
> - gimple *stmt = DR_GROUP_FIRST_ELEMENT (vect_dr_stmt (dr));
> - while (stmt)
> - {
> - stmt_vec_info vinfo = vinfo_for_stmt (stmt);
> - next = DR_GROUP_NEXT_ELEMENT (vinfo);
> - DR_GROUP_FIRST_ELEMENT (vinfo) = NULL;
> - DR_GROUP_NEXT_ELEMENT (vinfo) = NULL;
> - stmt = next;
> + stmt_vec_info stmt_info = DR_GROUP_FIRST_ELEMENT (vect_dr_stmt (dr));
> + while (stmt_info)
> + {
> + stmt_vec_info next = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + DR_GROUP_FIRST_ELEMENT (stmt_info) = NULL;
> + DR_GROUP_NEXT_ELEMENT (stmt_info) = NULL;
> + stmt_info = next;
> }
> return false;
> }
> @@ -3281,7 +3277,7 @@ vect_small_gap_p (loop_vec_info loop_vin
> HOST_WIDE_INT count
> = estimated_poly_value (LOOP_VINFO_VECT_FACTOR (loop_vinfo));
> if (DR_GROUP_FIRST_ELEMENT (stmt_info))
> - count *= DR_GROUP_SIZE (vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (stmt_info)));
> + count *= DR_GROUP_SIZE (DR_GROUP_FIRST_ELEMENT (stmt_info));
> return estimated_poly_value (gap) <= count * vect_get_scalar_dr_size (dr);
> }
>
> @@ -3379,11 +3375,9 @@ vect_prune_runtime_alias_test_list (loop
> int comp_res;
> poly_uint64 lower_bound;
> struct data_reference *dr_a, *dr_b;
> - gimple *dr_group_first_a, *dr_group_first_b;
> tree segment_length_a, segment_length_b;
> unsigned HOST_WIDE_INT access_size_a, access_size_b;
> unsigned int align_a, align_b;
> - gimple *stmt_a, *stmt_b;
>
> /* Ignore the alias if the VF we chose ended up being no greater
> than the dependence distance. */
> @@ -3409,15 +3403,15 @@ vect_prune_runtime_alias_test_list (loop
> }
>
> dr_a = DDR_A (ddr);
> - stmt_a = vect_dr_stmt (DDR_A (ddr));
> + stmt_vec_info stmt_info_a = vect_dr_stmt (DDR_A (ddr));
>
> dr_b = DDR_B (ddr);
> - stmt_b = vect_dr_stmt (DDR_B (ddr));
> + stmt_vec_info stmt_info_b = vect_dr_stmt (DDR_B (ddr));
>
> /* Skip the pair if inter-iteration dependencies are irrelevant
> and intra-iteration dependencies are guaranteed to be honored. */
> if (ignore_step_p
> - && (vect_preserves_scalar_order_p (stmt_a, stmt_b)
> + && (vect_preserves_scalar_order_p (stmt_info_a, stmt_info_b)
> || vectorizable_with_step_bound_p (dr_a, dr_b, &lower_bound)))
> {
> if (dump_enabled_p ())
> @@ -3468,18 +3462,18 @@ vect_prune_runtime_alias_test_list (loop
> continue;
> }
>
> - dr_group_first_a = DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt_a));
> + stmt_vec_info dr_group_first_a = DR_GROUP_FIRST_ELEMENT (stmt_info_a);
> if (dr_group_first_a)
> {
> - stmt_a = dr_group_first_a;
> - dr_a = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt_a));
> + stmt_info_a = dr_group_first_a;
> + dr_a = STMT_VINFO_DATA_REF (stmt_info_a);
> }
>
> - dr_group_first_b = DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt_b));
> + stmt_vec_info dr_group_first_b = DR_GROUP_FIRST_ELEMENT (stmt_info_b);
> if (dr_group_first_b)
> {
> - stmt_b = dr_group_first_b;
> - dr_b = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt_b));
> + stmt_info_b = dr_group_first_b;
> + dr_b = STMT_VINFO_DATA_REF (stmt_info_b);
> }
>
> if (ignore_step_p)
> @@ -4734,10 +4728,9 @@ vect_create_data_ref_ptr (gimple *stmt,
> /* Likewise for any of the data references in the stmt group. */
> else if (DR_GROUP_SIZE (stmt_info) > 1)
> {
> - gimple *orig_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + stmt_vec_info sinfo = DR_GROUP_FIRST_ELEMENT (stmt_info);
> do
> {
> - stmt_vec_info sinfo = vinfo_for_stmt (orig_stmt);
> struct data_reference *sdr = STMT_VINFO_DATA_REF (sinfo);
> if (!alias_sets_conflict_p (get_alias_set (aggr_type),
> get_alias_set (DR_REF (sdr))))
> @@ -4745,9 +4738,9 @@ vect_create_data_ref_ptr (gimple *stmt,
> need_ref_all = true;
> break;
> }
> - orig_stmt = DR_GROUP_NEXT_ELEMENT (sinfo);
> + sinfo = DR_GROUP_NEXT_ELEMENT (sinfo);
> }
> - while (orig_stmt);
> + while (sinfo);
> }
> aggr_ptr_type = build_pointer_type_for_mode (aggr_type, ptr_mode,
> need_ref_all);
> @@ -6345,19 +6338,18 @@ vect_record_grouped_load_vectors (gimple
> {
> stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> vec_info *vinfo = stmt_info->vinfo;
> - gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - gimple *next_stmt;
> + stmt_vec_info first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> unsigned int i, gap_count;
> tree tmp_data_ref;
>
> /* Put a permuted data-ref in the VECTORIZED_STMT field.
> Since we scan the chain starting from it's first node, their order
> corresponds the order of data-refs in RESULT_CHAIN. */
> - next_stmt = first_stmt;
> + stmt_vec_info next_stmt_info = first_stmt_info;
> gap_count = 1;
> FOR_EACH_VEC_ELT (result_chain, i, tmp_data_ref)
> {
> - if (!next_stmt)
> + if (!next_stmt_info)
> break;
>
> /* Skip the gaps. Loads created for the gaps will be removed by dead
> @@ -6366,27 +6358,27 @@ vect_record_grouped_load_vectors (gimple
> DR_GROUP_GAP is the number of steps in elements from the previous
> access (if there is no gap DR_GROUP_GAP is 1). We skip loads that
> correspond to the gaps. */
> - if (next_stmt != first_stmt
> - && gap_count < DR_GROUP_GAP (vinfo_for_stmt (next_stmt)))
> + if (next_stmt_info != first_stmt_info
> + && gap_count < DR_GROUP_GAP (next_stmt_info))
> {
> gap_count++;
> continue;
> }
>
> - while (next_stmt)
> + while (next_stmt_info)
> {
> stmt_vec_info new_stmt_info = vinfo->lookup_def (tmp_data_ref);
> /* We assume that if VEC_STMT is not NULL, this is a case of multiple
> copies, and we put the new vector statement in the first available
> RELATED_STMT. */
> - if (!STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)))
> - STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt)) = new_stmt_info;
> + if (!STMT_VINFO_VEC_STMT (next_stmt_info))
> + STMT_VINFO_VEC_STMT (next_stmt_info) = new_stmt_info;
> else
> {
> - if (!DR_GROUP_SAME_DR_STMT (vinfo_for_stmt (next_stmt)))
> + if (!DR_GROUP_SAME_DR_STMT (next_stmt_info))
> {
> stmt_vec_info prev_stmt_info
> - = STMT_VINFO_VEC_STMT (vinfo_for_stmt (next_stmt));
> + = STMT_VINFO_VEC_STMT (next_stmt_info);
> stmt_vec_info rel_stmt_info
> = STMT_VINFO_RELATED_STMT (prev_stmt_info);
> while (rel_stmt_info)
> @@ -6399,12 +6391,12 @@ vect_record_grouped_load_vectors (gimple
> }
> }
>
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> gap_count = 1;
> - /* If NEXT_STMT accesses the same DR as the previous statement,
> + /* If NEXT_STMT_INFO accesses the same DR as the previous statement,
> put the same TMP_DATA_REF as its vectorized statement; otherwise
> get the next data-ref from RESULT_CHAIN. */
> - if (!next_stmt || !DR_GROUP_SAME_DR_STMT (vinfo_for_stmt (next_stmt)))
> + if (!next_stmt_info || !DR_GROUP_SAME_DR_STMT (next_stmt_info))
> break;
> }
> }
> @@ -6545,8 +6537,8 @@ vect_supportable_dr_alignment (struct da
> if (loop_vinfo
> && STMT_SLP_TYPE (stmt_info)
> && !multiple_p (LOOP_VINFO_VECT_FACTOR (loop_vinfo)
> - * DR_GROUP_SIZE (vinfo_for_stmt
> - (DR_GROUP_FIRST_ELEMENT (stmt_info))),
> + * (DR_GROUP_SIZE
> + (DR_GROUP_FIRST_ELEMENT (stmt_info))),
> TYPE_VECTOR_SUBPARTS (vectype)))
> ;
> else if (!loop_vinfo
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2018-07-24 10:23:04.033010396 +0100
> +++ gcc/tree-vect-loop.c 2018-07-24 10:23:08.532970436 +0100
> @@ -661,14 +661,14 @@ vect_fixup_reduc_chain (gimple *stmt)
> REDUC_GROUP_SIZE (firstp) = REDUC_GROUP_SIZE (stmt_info);
> do
> {
> - stmtp = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
> + stmtp = STMT_VINFO_RELATED_STMT (stmt_info);
> REDUC_GROUP_FIRST_ELEMENT (stmtp) = firstp;
> - stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt));
> - if (stmt)
> + stmt_info = REDUC_GROUP_NEXT_ELEMENT (stmt_info);
> + if (stmt_info)
> REDUC_GROUP_NEXT_ELEMENT (stmtp)
> - = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt));
> + = STMT_VINFO_RELATED_STMT (stmt_info);
> }
> - while (stmt);
> + while (stmt_info);
> STMT_VINFO_DEF_TYPE (stmtp) = vect_reduction_def;
> }
>
> @@ -683,12 +683,12 @@ vect_fixup_scalar_cycles_with_patterns (
> FOR_EACH_VEC_ELT (LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo), i, first)
> if (STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (first)))
> {
> - gimple *next = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first));
> + stmt_vec_info next = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first));
> while (next)
> {
> - if (! STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (next)))
> + if (! STMT_VINFO_IN_PATTERN_P (next))
> break;
> - next = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next));
> + next = REDUC_GROUP_NEXT_ELEMENT (next);
> }
> /* If not all stmt in the chain are patterns try to handle
> the chain without patterns. */
> @@ -2188,7 +2188,7 @@ vect_analyze_loop_2 (loop_vec_info loop_
> vinfo = SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (instance))[0];
> if (! STMT_VINFO_GROUPED_ACCESS (vinfo))
> continue;
> - vinfo = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (vinfo));
> + vinfo = DR_GROUP_FIRST_ELEMENT (vinfo);
> unsigned int size = DR_GROUP_SIZE (vinfo);
> tree vectype = STMT_VINFO_VECTYPE (vinfo);
> if (! vect_store_lanes_supported (vectype, size, false)
> @@ -2198,7 +2198,7 @@ vect_analyze_loop_2 (loop_vec_info loop_
> FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (instance), j, node)
> {
> vinfo = SLP_TREE_SCALAR_STMTS (node)[0];
> - vinfo = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (vinfo));
> + vinfo = DR_GROUP_FIRST_ELEMENT (vinfo);
> bool single_element_p = !DR_GROUP_NEXT_ELEMENT (vinfo);
> size = DR_GROUP_SIZE (vinfo);
> vectype = STMT_VINFO_VECTYPE (vinfo);
> @@ -2527,7 +2527,7 @@ vect_is_slp_reduction (loop_vec_info loo
> struct loop *loop = (gimple_bb (phi))->loop_father;
> struct loop *vect_loop = LOOP_VINFO_LOOP (loop_info);
> enum tree_code code;
> - gimple *loop_use_stmt = NULL, *first, *next_stmt;
> + gimple *loop_use_stmt = NULL;
> stmt_vec_info use_stmt_info, current_stmt_info = NULL;
> tree lhs;
> imm_use_iterator imm_iter;
> @@ -2592,12 +2592,12 @@ vect_is_slp_reduction (loop_vec_info loo
> use_stmt_info = loop_info->lookup_stmt (loop_use_stmt);
> if (current_stmt_info)
> {
> - REDUC_GROUP_NEXT_ELEMENT (current_stmt_info) = loop_use_stmt;
> + REDUC_GROUP_NEXT_ELEMENT (current_stmt_info) = use_stmt_info;
> REDUC_GROUP_FIRST_ELEMENT (use_stmt_info)
> = REDUC_GROUP_FIRST_ELEMENT (current_stmt_info);
> }
> else
> - REDUC_GROUP_FIRST_ELEMENT (use_stmt_info) = loop_use_stmt;
> + REDUC_GROUP_FIRST_ELEMENT (use_stmt_info) = use_stmt_info;
>
> lhs = gimple_assign_lhs (loop_use_stmt);
> current_stmt_info = use_stmt_info;
> @@ -2610,9 +2610,10 @@ vect_is_slp_reduction (loop_vec_info loo
> /* Swap the operands, if needed, to make the reduction operand be the second
> operand. */
> lhs = PHI_RESULT (phi);
> - next_stmt = REDUC_GROUP_FIRST_ELEMENT (current_stmt_info);
> - while (next_stmt)
> + stmt_vec_info next_stmt_info = REDUC_GROUP_FIRST_ELEMENT (current_stmt_info);
> + while (next_stmt_info)
> {
> + gassign *next_stmt = as_a <gassign *> (next_stmt_info->stmt);
> if (gimple_assign_rhs2 (next_stmt) == lhs)
> {
> tree op = gimple_assign_rhs1 (next_stmt);
> @@ -2626,7 +2627,7 @@ vect_is_slp_reduction (loop_vec_info loo
> && vect_valid_reduction_input_p (def_stmt_info))
> {
> lhs = gimple_assign_lhs (next_stmt);
> - next_stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = REDUC_GROUP_NEXT_ELEMENT (next_stmt_info);
> continue;
> }
>
> @@ -2663,13 +2664,14 @@ vect_is_slp_reduction (loop_vec_info loo
> }
>
> lhs = gimple_assign_lhs (next_stmt);
> - next_stmt = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = REDUC_GROUP_NEXT_ELEMENT (next_stmt_info);
> }
>
> /* Save the chain for further analysis in SLP detection. */
> - first = REDUC_GROUP_FIRST_ELEMENT (current_stmt_info);
> - LOOP_VINFO_REDUCTION_CHAINS (loop_info).safe_push (first);
> - REDUC_GROUP_SIZE (vinfo_for_stmt (first)) = size;
> + stmt_vec_info first_stmt_info
> + = REDUC_GROUP_FIRST_ELEMENT (current_stmt_info);
> + LOOP_VINFO_REDUCTION_CHAINS (loop_info).safe_push (first_stmt_info);
> + REDUC_GROUP_SIZE (first_stmt_info) = size;
>
> return true;
> }
> @@ -3254,12 +3256,12 @@ vect_is_simple_reduction (loop_vec_info
> }
>
> /* Dissolve group eventually half-built by vect_is_slp_reduction. */
> - gimple *first = REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (def_stmt));
> + stmt_vec_info first = REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (def_stmt));
> while (first)
> {
> - gimple *next = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first));
> - REDUC_GROUP_FIRST_ELEMENT (vinfo_for_stmt (first)) = NULL;
> - REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first)) = NULL;
> + stmt_vec_info next = REDUC_GROUP_NEXT_ELEMENT (first);
> + REDUC_GROUP_FIRST_ELEMENT (first) = NULL;
> + REDUC_GROUP_NEXT_ELEMENT (first) = NULL;
> first = next;
> }
>
> @@ -6130,7 +6132,8 @@ vectorizable_reduction (gimple *stmt, gi
> }
>
> if (REDUC_GROUP_FIRST_ELEMENT (stmt_info))
> - gcc_assert (slp_node && REDUC_GROUP_FIRST_ELEMENT (stmt_info) == stmt);
> + gcc_assert (slp_node
> + && REDUC_GROUP_FIRST_ELEMENT (stmt_info) == stmt_info);
>
> if (gimple_code (stmt) == GIMPLE_PHI)
> {
> @@ -6784,8 +6787,8 @@ vectorizable_reduction (gimple *stmt, gi
> tree neutral_op = NULL_TREE;
> if (slp_node)
> neutral_op = neutral_op_for_slp_reduction
> - (slp_node_instance->reduc_phis, code,
> - REDUC_GROUP_FIRST_ELEMENT (stmt_info) != NULL);
> + (slp_node_instance->reduc_phis, code,
> + REDUC_GROUP_FIRST_ELEMENT (stmt_info) != NULL_STMT_VEC_INFO);
>
> if (double_reduc && reduction_type == FOLD_LEFT_REDUCTION)
> {
> Index: gcc/tree-vect-patterns.c
> ===================================================================
> --- gcc/tree-vect-patterns.c 2018-07-24 10:22:57.277070390 +0100
> +++ gcc/tree-vect-patterns.c 2018-07-24 10:23:08.536970400 +0100
> @@ -820,7 +820,7 @@ vect_reassociating_reduction_p (stmt_vec
> {
> return (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def
> ? STMT_VINFO_REDUC_TYPE (stmt_vinfo) != FOLD_LEFT_REDUCTION
> - : REDUC_GROUP_FIRST_ELEMENT (stmt_vinfo) != NULL);
> + : REDUC_GROUP_FIRST_ELEMENT (stmt_vinfo) != NULL_STMT_VEC_INFO);
> }
>
> /* As above, but also require it to have code CODE and to be a reduction
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2018-07-24 10:23:00.401042649 +0100
> +++ gcc/tree-vect-slp.c 2018-07-24 10:23:08.536970400 +0100
> @@ -712,7 +712,7 @@ vect_build_slp_tree_1 (vec_info *vinfo,
> int icode;
> machine_mode optab_op2_mode;
> machine_mode vec_mode;
> - gimple *first_load = NULL, *prev_first_load = NULL;
> + stmt_vec_info first_load = NULL, prev_first_load = NULL;
>
> /* For every stmt in NODE find its def stmt/s. */
> stmt_vec_info stmt_info;
> @@ -1692,8 +1692,7 @@ vect_attempt_slp_rearrange_stmts (slp_in
> FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (slp_instn), i, node)
> {
> stmt_vec_info first_stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
> - first_stmt_info
> - = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (first_stmt_info));
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (first_stmt_info);
> /* But we have to keep those permutations that are required because
> of handling of gaps. */
> if (known_eq (unrolling_factor, 1U)
> @@ -1717,7 +1716,6 @@ vect_supported_load_permutation_p (slp_i
> unsigned int group_size = SLP_INSTANCE_GROUP_SIZE (slp_instn);
> unsigned int i, j, k, next;
> slp_tree node;
> - gimple *next_load;
>
> if (dump_enabled_p ())
> {
> @@ -1766,26 +1764,25 @@ vect_supported_load_permutation_p (slp_i
> if (!SLP_TREE_LOAD_PERMUTATION (node).exists ())
> continue;
> bool subchain_p = true;
> - next_load = NULL;
> + stmt_vec_info next_load_info = NULL;
> stmt_vec_info load_info;
> FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), j, load_info)
> {
> if (j != 0
> - && (next_load != load_info
> + && (next_load_info != load_info
> || DR_GROUP_GAP (load_info) != 1))
> {
> subchain_p = false;
> break;
> }
> - next_load = DR_GROUP_NEXT_ELEMENT (load_info);
> + next_load_info = DR_GROUP_NEXT_ELEMENT (load_info);
> }
> if (subchain_p)
> SLP_TREE_LOAD_PERMUTATION (node).release ();
> else
> {
> stmt_vec_info group_info = SLP_TREE_SCALAR_STMTS (node)[0];
> - group_info
> - = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (group_info));
> + group_info = DR_GROUP_FIRST_ELEMENT (group_info);
> unsigned HOST_WIDE_INT nunits;
> unsigned k, maxk = 0;
> FOR_EACH_VEC_ELT (SLP_TREE_LOAD_PERMUTATION (node), j, k)
> @@ -1868,33 +1865,33 @@ vect_find_last_scalar_stmt_in_slp (slp_t
> vect_split_slp_store_group (gimple *first_stmt, unsigned group1_size)
> {
> stmt_vec_info first_vinfo = vinfo_for_stmt (first_stmt);
> - gcc_assert (DR_GROUP_FIRST_ELEMENT (first_vinfo) == first_stmt);
> + gcc_assert (DR_GROUP_FIRST_ELEMENT (first_vinfo) == first_vinfo);
> gcc_assert (group1_size > 0);
> int group2_size = DR_GROUP_SIZE (first_vinfo) - group1_size;
> gcc_assert (group2_size > 0);
> DR_GROUP_SIZE (first_vinfo) = group1_size;
>
> - gimple *stmt = first_stmt;
> + stmt_vec_info stmt_info = first_vinfo;
> for (unsigned i = group1_size; i > 1; i--)
> {
> - stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt));
> - gcc_assert (DR_GROUP_GAP (vinfo_for_stmt (stmt)) == 1);
> + stmt_info = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + gcc_assert (DR_GROUP_GAP (stmt_info) == 1);
> }
> /* STMT is now the last element of the first group. */
> - gimple *group2 = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt));
> - DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt)) = 0;
> + stmt_vec_info group2 = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + DR_GROUP_NEXT_ELEMENT (stmt_info) = 0;
>
> - DR_GROUP_SIZE (vinfo_for_stmt (group2)) = group2_size;
> - for (stmt = group2; stmt; stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (stmt)))
> + DR_GROUP_SIZE (group2) = group2_size;
> + for (stmt_info = group2; stmt_info;
> + stmt_info = DR_GROUP_NEXT_ELEMENT (stmt_info))
> {
> - DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = group2;
> - gcc_assert (DR_GROUP_GAP (vinfo_for_stmt (stmt)) == 1);
> + DR_GROUP_FIRST_ELEMENT (stmt_info) = group2;
> + gcc_assert (DR_GROUP_GAP (stmt_info) == 1);
> }
>
> /* For the second group, the DR_GROUP_GAP is that before the original group,
> plus skipping over the first vector. */
> - DR_GROUP_GAP (vinfo_for_stmt (group2))
> - = DR_GROUP_GAP (first_vinfo) + group1_size;
> + DR_GROUP_GAP (group2) = DR_GROUP_GAP (first_vinfo) + group1_size;
>
> /* DR_GROUP_GAP of the first group now has to skip over the second group too. */
> DR_GROUP_GAP (first_vinfo) += group2_size;
> @@ -1928,8 +1925,6 @@ vect_analyze_slp_instance (vec_info *vin
> slp_tree node;
> unsigned int group_size;
> tree vectype, scalar_type = NULL_TREE;
> - gimple *next;
> - stmt_vec_info next_info;
> unsigned int i;
> vec<slp_tree> loads;
> struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
> @@ -1970,34 +1965,32 @@ vect_analyze_slp_instance (vec_info *vin
>
> /* Create a node (a root of the SLP tree) for the packed grouped stores. */
> scalar_stmts.create (group_size);
> - next = stmt;
> + stmt_vec_info next_info = stmt_info;
> if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
> {
> /* Collect the stores and store them in SLP_TREE_SCALAR_STMTS. */
> - while (next)
> + while (next_info)
> {
> - next_info = vinfo_for_stmt (next);
> if (STMT_VINFO_IN_PATTERN_P (next_info)
> && STMT_VINFO_RELATED_STMT (next_info))
> scalar_stmts.safe_push (STMT_VINFO_RELATED_STMT (next_info));
> else
> scalar_stmts.safe_push (next_info);
> - next = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next));
> + next_info = DR_GROUP_NEXT_ELEMENT (next_info);
> }
> }
> else if (!dr && REDUC_GROUP_FIRST_ELEMENT (stmt_info))
> {
> /* Collect the reduction stmts and store them in
> SLP_TREE_SCALAR_STMTS. */
> - while (next)
> + while (next_info)
> {
> - next_info = vinfo_for_stmt (next);
> if (STMT_VINFO_IN_PATTERN_P (next_info)
> && STMT_VINFO_RELATED_STMT (next_info))
> scalar_stmts.safe_push (STMT_VINFO_RELATED_STMT (next_info));
> else
> scalar_stmts.safe_push (next_info);
> - next = REDUC_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next));
> + next_info = REDUC_GROUP_NEXT_ELEMENT (next_info);
> }
> /* Mark the first element of the reduction chain as reduction to properly
> transform the node. In the reduction analysis phase only the last
> @@ -2067,15 +2060,14 @@ vect_analyze_slp_instance (vec_info *vin
> vec<unsigned> load_permutation;
> int j;
> stmt_vec_info load_info;
> - gimple *first_stmt;
> bool this_load_permuted = false;
> load_permutation.create (group_size);
> - first_stmt = DR_GROUP_FIRST_ELEMENT
> + stmt_vec_info first_stmt_info = DR_GROUP_FIRST_ELEMENT
> (SLP_TREE_SCALAR_STMTS (load_node)[0]);
> FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (load_node), j, load_info)
> {
> int load_place = vect_get_place_in_interleaving_chain
> - (load_info, first_stmt);
> + (load_info, first_stmt_info);
> gcc_assert (load_place != -1);
> if (load_place != j)
> this_load_permuted = true;
> @@ -2086,8 +2078,8 @@ vect_analyze_slp_instance (vec_info *vin
> a gap either because the group is larger than the SLP
> group-size or because there is a gap between the groups. */
> && (known_eq (unrolling_factor, 1U)
> - || (group_size == DR_GROUP_SIZE (vinfo_for_stmt (first_stmt))
> - && DR_GROUP_GAP (vinfo_for_stmt (first_stmt)) == 0)))
> + || (group_size == DR_GROUP_SIZE (first_stmt_info)
> + && DR_GROUP_GAP (first_stmt_info) == 0)))
> {
> load_permutation.release ();
> continue;
> @@ -2122,11 +2114,9 @@ vect_analyze_slp_instance (vec_info *vin
> slp_tree load_node;
> FOR_EACH_VEC_ELT (loads, i, load_node)
> {
> - gimple *first_stmt = DR_GROUP_FIRST_ELEMENT
> + stmt_vec_info stmt_vinfo = DR_GROUP_FIRST_ELEMENT
> (SLP_TREE_SCALAR_STMTS (load_node)[0]);
> - stmt_vec_info stmt_vinfo = vinfo_for_stmt (first_stmt);
> - /* Use SLP for strided accesses (or if we
> - can't load-lanes). */
> + /* Use SLP for strided accesses (or if we can't load-lanes). */
> if (STMT_VINFO_STRIDED_P (stmt_vinfo)
> || ! vect_load_lanes_supported
> (STMT_VINFO_VECTYPE (stmt_vinfo),
> @@ -2230,11 +2220,11 @@ vect_analyze_slp (vec_info *vinfo, unsig
> max_tree_size))
> {
> /* Dissolve reduction chain group. */
> - gimple *next, *stmt = first_element;
> + gimple *stmt = first_element;
> while (stmt)
> {
> stmt_vec_info vinfo = vinfo_for_stmt (stmt);
> - next = REDUC_GROUP_NEXT_ELEMENT (vinfo);
> + stmt_vec_info next = REDUC_GROUP_NEXT_ELEMENT (vinfo);
> REDUC_GROUP_FIRST_ELEMENT (vinfo) = NULL;
> REDUC_GROUP_NEXT_ELEMENT (vinfo) = NULL;
> stmt = next;
> @@ -3698,7 +3688,7 @@ vect_transform_slp_perm_load (slp_tree n
> if (!STMT_VINFO_GROUPED_ACCESS (stmt_info))
> return false;
>
> - stmt_info = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (stmt_info));
> + stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
>
> mode = TYPE_MODE (vectype);
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2018-07-24 10:23:00.401042649 +0100
> +++ gcc/tree-vect-stmts.c 2018-07-24 10:23:08.536970400 +0100
> @@ -978,7 +978,7 @@ vect_model_store_cost (stmt_vec_info stm
> stmt_vector_for_cost *cost_vec)
> {
> unsigned int inside_cost = 0, prologue_cost = 0;
> - gimple *first_stmt = STMT_VINFO_STMT (stmt_info);
> + stmt_vec_info first_stmt_info = stmt_info;
> bool grouped_access_p = STMT_VINFO_GROUPED_ACCESS (stmt_info);
>
> /* ??? Somehow we need to fix this at the callers. */
> @@ -998,12 +998,12 @@ vect_model_store_cost (stmt_vec_info stm
> /* Grouped stores update all elements in the group at once,
> so we want the DR for the first statement. */
> if (!slp_node && grouped_access_p)
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
>
> /* True if we should include any once-per-group costs as well as
> the cost of the statement itself. For SLP we only get called
> once per group anyhow. */
> - bool first_stmt_p = (first_stmt == STMT_VINFO_STMT (stmt_info));
> + bool first_stmt_p = (first_stmt_info == stmt_info);
>
> /* We assume that the cost of a single store-lanes instruction is
> equivalent to the cost of DR_GROUP_SIZE separate stores. If a grouped
> @@ -1014,7 +1014,7 @@ vect_model_store_cost (stmt_vec_info stm
> {
> /* Uses a high and low interleave or shuffle operations for each
> needed permute. */
> - int group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> + int group_size = DR_GROUP_SIZE (first_stmt_info);
> int nstmts = ncopies * ceil_log2 (group_size) * group_size;
> inside_cost = record_stmt_cost (cost_vec, nstmts, vec_perm,
> stmt_info, 0, vect_body);
> @@ -1122,7 +1122,6 @@ vect_model_load_cost (stmt_vec_info stmt
> slp_tree slp_node,
> stmt_vector_for_cost *cost_vec)
> {
> - gimple *first_stmt = STMT_VINFO_STMT (stmt_info);
> unsigned int inside_cost = 0, prologue_cost = 0;
> bool grouped_access_p = STMT_VINFO_GROUPED_ACCESS (stmt_info);
>
> @@ -1136,28 +1135,27 @@ vect_model_load_cost (stmt_vec_info stmt
> {
> /* If the load is permuted then the alignment is determined by
> the first group element not by the first scalar stmt DR. */
> - gimple *stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> + stmt_vec_info first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> /* Record the cost for the permutation. */
> unsigned n_perms;
> unsigned assumed_nunits
> - = vect_nunits_for_cost (STMT_VINFO_VECTYPE (stmt_info));
> + = vect_nunits_for_cost (STMT_VINFO_VECTYPE (first_stmt_info));
> unsigned slp_vf = (ncopies * assumed_nunits) / instance->group_size;
> vect_transform_slp_perm_load (slp_node, vNULL, NULL,
> slp_vf, instance, true,
> &n_perms);
> inside_cost += record_stmt_cost (cost_vec, n_perms, vec_perm,
> - stmt_info, 0, vect_body);
> + first_stmt_info, 0, vect_body);
> /* And adjust the number of loads performed. This handles
> redundancies as well as loads that are later dead. */
> - auto_sbitmap perm (DR_GROUP_SIZE (stmt_info));
> + auto_sbitmap perm (DR_GROUP_SIZE (first_stmt_info));
> bitmap_clear (perm);
> for (unsigned i = 0;
> i < SLP_TREE_LOAD_PERMUTATION (slp_node).length (); ++i)
> bitmap_set_bit (perm, SLP_TREE_LOAD_PERMUTATION (slp_node)[i]);
> ncopies = 0;
> bool load_seen = false;
> - for (unsigned i = 0; i < DR_GROUP_SIZE (stmt_info); ++i)
> + for (unsigned i = 0; i < DR_GROUP_SIZE (first_stmt_info); ++i)
> {
> if (i % assumed_nunits == 0)
> {
> @@ -1171,19 +1169,21 @@ vect_model_load_cost (stmt_vec_info stmt
> if (load_seen)
> ncopies++;
> gcc_assert (ncopies
> - <= (DR_GROUP_SIZE (stmt_info) - DR_GROUP_GAP (stmt_info)
> + <= (DR_GROUP_SIZE (first_stmt_info)
> + - DR_GROUP_GAP (first_stmt_info)
> + assumed_nunits - 1) / assumed_nunits);
> }
>
> /* Grouped loads read all elements in the group at once,
> so we want the DR for the first statement. */
> + stmt_vec_info first_stmt_info = stmt_info;
> if (!slp_node && grouped_access_p)
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
>
> /* True if we should include any once-per-group costs as well as
> the cost of the statement itself. For SLP we only get called
> once per group anyhow. */
> - bool first_stmt_p = (first_stmt == STMT_VINFO_STMT (stmt_info));
> + bool first_stmt_p = (first_stmt_info == stmt_info);
>
> /* We assume that the cost of a single load-lanes instruction is
> equivalent to the cost of DR_GROUP_SIZE separate loads. If a grouped
> @@ -1194,7 +1194,7 @@ vect_model_load_cost (stmt_vec_info stmt
> {
> /* Uses an even and odd extract operations or shuffle operations
> for each needed permute. */
> - int group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> + int group_size = DR_GROUP_SIZE (first_stmt_info);
> int nstmts = ncopies * ceil_log2 (group_size) * group_size;
> inside_cost += record_stmt_cost (cost_vec, nstmts, vec_perm,
> stmt_info, 0, vect_body);
> @@ -2183,12 +2183,12 @@ get_group_load_store_type (gimple *stmt,
> vec_info *vinfo = stmt_info->vinfo;
> loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
> struct loop *loop = loop_vinfo ? LOOP_VINFO_LOOP (loop_vinfo) : NULL;
> - gimple *first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - data_reference *first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> - unsigned int group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> - bool single_element_p = (stmt == first_stmt
> + stmt_vec_info first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + data_reference *first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> + unsigned int group_size = DR_GROUP_SIZE (first_stmt_info);
> + bool single_element_p = (stmt_info == first_stmt_info
> && !DR_GROUP_NEXT_ELEMENT (stmt_info));
> - unsigned HOST_WIDE_INT gap = DR_GROUP_GAP (vinfo_for_stmt (first_stmt));
> + unsigned HOST_WIDE_INT gap = DR_GROUP_GAP (first_stmt_info);
> poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (vectype);
>
> /* True if the vectorized statements would access beyond the last
> @@ -2315,14 +2315,14 @@ get_group_load_store_type (gimple *stmt,
> *memory_access_type = VMAT_GATHER_SCATTER;
> }
>
> - if (vls_type != VLS_LOAD && first_stmt == stmt)
> + if (vls_type != VLS_LOAD && first_stmt_info == stmt_info)
> {
> /* STMT is the leader of the group. Check the operands of all the
> stmts of the group. */
> - gimple *next_stmt = DR_GROUP_NEXT_ELEMENT (stmt_info);
> - while (next_stmt)
> + stmt_vec_info next_stmt_info = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + while (next_stmt_info)
> {
> - tree op = vect_get_store_rhs (next_stmt);
> + tree op = vect_get_store_rhs (next_stmt_info);
> enum vect_def_type dt;
> if (!vect_is_simple_use (op, vinfo, &dt))
> {
> @@ -2331,7 +2331,7 @@ get_group_load_store_type (gimple *stmt,
> "use not simple.\n");
> return false;
> }
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> }
> }
>
> @@ -2482,7 +2482,7 @@ get_load_store_type (gimple *stmt, tree
> traditional behavior until that can be fixed. */
> if (*memory_access_type == VMAT_ELEMENTWISE
> && !STMT_VINFO_STRIDED_P (stmt_info)
> - && !(stmt == DR_GROUP_FIRST_ELEMENT (stmt_info)
> + && !(stmt_info == DR_GROUP_FIRST_ELEMENT (stmt_info)
> && !DR_GROUP_NEXT_ELEMENT (stmt_info)
> && !pow2p_hwi (DR_GROUP_SIZE (stmt_info))))
> {
> @@ -6195,13 +6195,13 @@ ensure_base_align (struct data_reference
> get_group_alias_ptr_type (gimple *first_stmt)
> {
> struct data_reference *first_dr, *next_dr;
> - gimple *next_stmt;
>
> first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first_stmt));
> - while (next_stmt)
> + stmt_vec_info next_stmt_info
> + = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (first_stmt));
> + while (next_stmt_info)
> {
> - next_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (next_stmt));
> + next_dr = STMT_VINFO_DATA_REF (next_stmt_info);
> if (get_alias_set (DR_REF (first_dr))
> != get_alias_set (DR_REF (next_dr)))
> {
> @@ -6210,7 +6210,7 @@ get_group_alias_ptr_type (gimple *first_
> "conflicting alias set types.\n");
> return ptr_type_node;
> }
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> }
> return reference_alias_ptr_type (DR_REF (first_dr));
> }
> @@ -6248,7 +6248,7 @@ vectorizable_store (gimple *stmt, gimple
> gimple *ptr_incr = NULL;
> int ncopies;
> int j;
> - gimple *next_stmt, *first_stmt;
> + stmt_vec_info first_stmt_info;
> bool grouped_store;
> unsigned int group_size, i;
> vec<tree> oprnds = vNULL;
> @@ -6400,13 +6400,13 @@ vectorizable_store (gimple *stmt, gimple
> && (slp || memory_access_type != VMAT_CONTIGUOUS));
> if (grouped_store)
> {
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> - group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> + group_size = DR_GROUP_SIZE (first_stmt_info);
> }
> else
> {
> - first_stmt = stmt;
> + first_stmt_info = stmt_info;
> first_dr = dr;
> group_size = vec_num = 1;
> }
> @@ -6584,10 +6584,7 @@ vectorizable_store (gimple *stmt, gimple
> }
>
> if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
> - {
> - gimple *group_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - DR_GROUP_STORE_COUNT (vinfo_for_stmt (group_stmt))++;
> - }
> + DR_GROUP_STORE_COUNT (DR_GROUP_FIRST_ELEMENT (stmt_info))++;
>
> if (grouped_store)
> {
> @@ -6596,8 +6593,8 @@ vectorizable_store (gimple *stmt, gimple
>
> /* We vectorize all the stmts of the interleaving group when we
> reach the last stmt in the group. */
> - if (DR_GROUP_STORE_COUNT (vinfo_for_stmt (first_stmt))
> - < DR_GROUP_SIZE (vinfo_for_stmt (first_stmt))
> + if (DR_GROUP_STORE_COUNT (first_stmt_info)
> + < DR_GROUP_SIZE (first_stmt_info)
> && !slp)
> {
> *vec_stmt = NULL;
> @@ -6610,17 +6607,18 @@ vectorizable_store (gimple *stmt, gimple
> /* VEC_NUM is the number of vect stmts to be created for this
> group. */
> vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
> - first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
> - gcc_assert (DR_GROUP_FIRST_ELEMENT (vinfo_for_stmt (first_stmt)) == first_stmt);
> - first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> - op = vect_get_store_rhs (first_stmt);
> + first_stmt_info = SLP_TREE_SCALAR_STMTS (slp_node)[0];
> + gcc_assert (DR_GROUP_FIRST_ELEMENT (first_stmt_info)
> + == first_stmt_info);
> + first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> + op = vect_get_store_rhs (first_stmt_info);
> }
> else
> /* VEC_NUM is the number of vect stmts to be created for this
> group. */
> vec_num = group_size;
>
> - ref_type = get_group_alias_ptr_type (first_stmt);
> + ref_type = get_group_alias_ptr_type (first_stmt_info);
> }
> else
> ref_type = reference_alias_ptr_type (DR_REF (first_dr));
> @@ -6759,7 +6757,7 @@ vectorizable_store (gimple *stmt, gimple
>
> prev_stmt_info = NULL;
> alias_off = build_int_cst (ref_type, 0);
> - next_stmt = first_stmt;
> + stmt_vec_info next_stmt_info = first_stmt_info;
> for (g = 0; g < group_size; g++)
> {
> running_off = offvar;
> @@ -6780,7 +6778,7 @@ vectorizable_store (gimple *stmt, gimple
> for (j = 0; j < ncopies; j++)
> {
> /* We've set op and dt above, from vect_get_store_rhs,
> - and first_stmt == stmt. */
> + and first_stmt_info == stmt_info. */
> if (j == 0)
> {
> if (slp)
> @@ -6791,8 +6789,9 @@ vectorizable_store (gimple *stmt, gimple
> }
> else
> {
> - op = vect_get_store_rhs (next_stmt);
> - vec_oprnd = vect_get_vec_def_for_operand (op, next_stmt);
> + op = vect_get_store_rhs (next_stmt_info);
> + vec_oprnd = vect_get_vec_def_for_operand
> + (op, next_stmt_info);
> }
> }
> else
> @@ -6866,7 +6865,7 @@ vectorizable_store (gimple *stmt, gimple
> }
> }
> }
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> if (slp)
> break;
> }
> @@ -6985,19 +6984,20 @@ vectorizable_store (gimple *stmt, gimple
>
> If the store is not grouped, DR_GROUP_SIZE is 1, and DR_CHAIN and
> OPRNDS are of size 1. */
> - next_stmt = first_stmt;
> + stmt_vec_info next_stmt_info = first_stmt_info;
> for (i = 0; i < group_size; i++)
> {
> /* Since gaps are not supported for interleaved stores,
> DR_GROUP_SIZE is the exact number of stmts in the chain.
> - Therefore, NEXT_STMT can't be NULL_TREE. In case that
> - there is no interleaving, DR_GROUP_SIZE is 1, and only one
> - iteration of the loop will be executed. */
> - op = vect_get_store_rhs (next_stmt);
> - vec_oprnd = vect_get_vec_def_for_operand (op, next_stmt);
> + Therefore, NEXT_STMT_INFO can't be NULL_TREE. In case
> + that there is no interleaving, DR_GROUP_SIZE is 1,
> + and only one iteration of the loop will be executed. */
> + op = vect_get_store_rhs (next_stmt_info);
> + vec_oprnd = vect_get_vec_def_for_operand
> + (op, next_stmt_info);
> dr_chain.quick_push (vec_oprnd);
> oprnds.quick_push (vec_oprnd);
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> }
> if (mask)
> vec_mask = vect_get_vec_def_for_operand (mask, stmt,
> @@ -7029,7 +7029,7 @@ vectorizable_store (gimple *stmt, gimple
> }
> else
> dataref_ptr
> - = vect_create_data_ref_ptr (first_stmt, aggr_type,
> + = vect_create_data_ref_ptr (first_stmt_info, aggr_type,
> simd_lane_access_p ? loop : NULL,
> offset, &dummy, gsi, &ptr_incr,
> simd_lane_access_p, &inv_p,
> @@ -7132,7 +7132,7 @@ vectorizable_store (gimple *stmt, gimple
> &result_chain);
> }
>
> - next_stmt = first_stmt;
> + stmt_vec_info next_stmt_info = first_stmt_info;
> for (i = 0; i < vec_num; i++)
> {
> unsigned align, misalign;
> @@ -7249,8 +7249,8 @@ vectorizable_store (gimple *stmt, gimple
> if (slp)
> continue;
>
> - next_stmt = DR_GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
> - if (!next_stmt)
> + next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info);
> + if (!next_stmt_info)
> break;
> }
> }
> @@ -7423,7 +7423,7 @@ vectorizable_load (gimple *stmt, gimple_
> gphi *phi = NULL;
> vec<tree> dr_chain = vNULL;
> bool grouped_load = false;
> - gimple *first_stmt;
> + stmt_vec_info first_stmt_info;
> stmt_vec_info first_stmt_info_for_drptr = NULL;
> bool inv_p;
> bool compute_in_loop = false;
> @@ -7565,8 +7565,8 @@ vectorizable_load (gimple *stmt, gimple_
> gcc_assert (!nested_in_vect_loop);
> gcc_assert (!STMT_VINFO_GATHER_SCATTER_P (stmt_info));
>
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + group_size = DR_GROUP_SIZE (first_stmt_info);
>
> if (slp && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
> slp_perm = true;
> @@ -7696,25 +7696,26 @@ vectorizable_load (gimple *stmt, gimple_
>
> if (grouped_load)
> {
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> }
> else
> {
> - first_stmt = stmt;
> + first_stmt_info = stmt_info;
> first_dr = dr;
> }
> if (slp && grouped_load)
> {
> - group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> - ref_type = get_group_alias_ptr_type (first_stmt);
> + group_size = DR_GROUP_SIZE (first_stmt_info);
> + ref_type = get_group_alias_ptr_type (first_stmt_info);
> }
> else
> {
> if (grouped_load)
> cst_offset
> = (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (vectype)))
> - * vect_get_place_in_interleaving_chain (stmt, first_stmt));
> + * vect_get_place_in_interleaving_chain (stmt,
> + first_stmt_info));
> group_size = 1;
> ref_type = reference_alias_ptr_type (DR_REF (dr));
> }
> @@ -7924,19 +7925,19 @@ vectorizable_load (gimple *stmt, gimple_
>
> if (grouped_load)
> {
> - first_stmt = DR_GROUP_FIRST_ELEMENT (stmt_info);
> - group_size = DR_GROUP_SIZE (vinfo_for_stmt (first_stmt));
> + first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> + group_size = DR_GROUP_SIZE (first_stmt_info);
> /* For SLP vectorization we directly vectorize a subchain
> without permutation. */
> if (slp && ! SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
> - first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0];
> + first_stmt_info = SLP_TREE_SCALAR_STMTS (slp_node)[0];
> /* For BB vectorization always use the first stmt to base
> the data ref pointer on. */
> if (bb_vinfo)
> first_stmt_info_for_drptr = SLP_TREE_SCALAR_STMTS (slp_node)[0];
>
> /* Check if the chain of loads is already vectorized. */
> - if (STMT_VINFO_VEC_STMT (vinfo_for_stmt (first_stmt))
> + if (STMT_VINFO_VEC_STMT (first_stmt_info)
> /* For SLP we would need to copy over SLP_TREE_VEC_STMTS.
> ??? But we can only do so if there is exactly one
> as we have no way to get at the rest. Leave the CSE
> @@ -7950,7 +7951,7 @@ vectorizable_load (gimple *stmt, gimple_
> *vec_stmt = STMT_VINFO_VEC_STMT (stmt_info);
> return true;
> }
> - first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt));
> + first_dr = STMT_VINFO_DATA_REF (first_stmt_info);
> group_gap_adj = 0;
>
> /* VEC_NUM is the number of vect stmts to be created for this group. */
> @@ -7979,11 +7980,11 @@ vectorizable_load (gimple *stmt, gimple_
> else
> vec_num = group_size;
>
> - ref_type = get_group_alias_ptr_type (first_stmt);
> + ref_type = get_group_alias_ptr_type (first_stmt_info);
> }
> else
> {
> - first_stmt = stmt;
> + first_stmt_info = stmt_info;
> first_dr = dr;
> group_size = vec_num = 1;
> group_gap_adj = 0;
> @@ -8120,7 +8121,7 @@ vectorizable_load (gimple *stmt, gimple_
> || alignment_support_scheme == dr_explicit_realign)
> && !compute_in_loop)
> {
> - msq = vect_setup_realignment (first_stmt, gsi, &realignment_token,
> + msq = vect_setup_realignment (first_stmt_info, gsi, &realignment_token,
> alignment_support_scheme, NULL_TREE,
> &at_loop);
> if (alignment_support_scheme == dr_explicit_realign_optimized)
> @@ -8184,7 +8185,7 @@ vectorizable_load (gimple *stmt, gimple_
> inv_p = false;
> }
> else if (first_stmt_info_for_drptr
> - && first_stmt != first_stmt_info_for_drptr)
> + && first_stmt_info != first_stmt_info_for_drptr)
> {
> dataref_ptr
> = vect_create_data_ref_ptr (first_stmt_info_for_drptr,
> @@ -8209,7 +8210,7 @@ vectorizable_load (gimple *stmt, gimple_
> }
> else
> dataref_ptr
> - = vect_create_data_ref_ptr (first_stmt, aggr_type, at_loop,
> + = vect_create_data_ref_ptr (first_stmt_info, aggr_type, at_loop,
> offset, &dummy, gsi, &ptr_incr,
> simd_lane_access_p, &inv_p,
> byte_offset, bump);
> @@ -8388,7 +8389,7 @@ vectorizable_load (gimple *stmt, gimple_
> tree vs = size_int (TYPE_VECTOR_SUBPARTS (vectype));
>
> if (compute_in_loop)
> - msq = vect_setup_realignment (first_stmt, gsi,
> + msq = vect_setup_realignment (first_stmt_info, gsi,
> &realignment_token,
> dr_explicit_realign,
> dataref_ptr, NULL);
> @@ -9708,8 +9709,7 @@ vect_transform_stmt (gimple *stmt, gimpl
> one are skipped, and there vec_stmt_info shouldn't be freed
> meanwhile. */
> *grouped_store = true;
> - stmt_vec_info group_info
> - = vinfo_for_stmt (DR_GROUP_FIRST_ELEMENT (stmt_info));
> + stmt_vec_info group_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
> if (DR_GROUP_STORE_COUNT (group_info) == DR_GROUP_SIZE (group_info))
> is_store = true;
> }
> @@ -9817,14 +9817,13 @@ vect_transform_stmt (gimple *stmt, gimpl
> vect_remove_stores (gimple *first_stmt)
> {
> gimple *next = first_stmt;
> - gimple *tmp;
> gimple_stmt_iterator next_si;
>
> while (next)
> {
> stmt_vec_info stmt_info = vinfo_for_stmt (next);
>
> - tmp = DR_GROUP_NEXT_ELEMENT (stmt_info);
> + stmt_vec_info tmp = DR_GROUP_NEXT_ELEMENT (stmt_info);
> if (is_pattern_stmt_p (stmt_info))
> next = STMT_VINFO_RELATED_STMT (stmt_info);
> /* Free the attached stmt_vec_info and remove the stmt. */