From: Richard Biener <richard.guenther@gmail.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>, richard.sandiford@arm.com
Subject: Re: [31/46] Use stmt_vec_info in function interfaces (part 1)
Date: Wed, 25 Jul 2018 10:05:00 -0000 [thread overview]
Message-ID: <CAFiYyc0_DVCpKesGEoDReg7t=hxojs66u_KYp3EfTO8XxAViMA@mail.gmail.com> (raw)
In-Reply-To: <877ellne3g.fsf@arm.com>
On Tue, Jul 24, 2018 at 12:05 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> This first (less mechanical) part handles cases that involve changes in
> the callers or non-trivial changes in the functions themselves.
OK
>
> 2018-07-24 Richard Sandiford <richard.sandiford@arm.com>
>
> gcc/
> * tree-vect-data-refs.c (vect_describe_gather_scatter_call): Take
> a stmt_vec_info instead of a gcall.
> (vect_check_gather_scatter): Update call accordingly.
> * tree-vect-loop-manip.c (iv_phi_p): Take a stmt_vec_info instead
> of a gphi.
> (vect_can_advance_ivs_p, vect_update_ivs_after_vectorizer)
> (slpeel_update_phi_nodes_for_loops):): Update calls accordingly.
> * tree-vect-loop.c (vect_transform_loop_stmt): Take a stmt_vec_info
> instead of a gimple stmt.
> (vect_transform_loop): Update calls accordingly.
> * tree-vect-slp.c (vect_split_slp_store_group): Take and return
> stmt_vec_infos instead of gimple stmts.
> (vect_analyze_slp_instance): Update use accordingly.
> * tree-vect-stmts.c (read_vector_array, write_vector_array)
> (vect_clobber_variable, vect_stmt_relevant_p, permute_vec_elements)
> (vect_use_strided_gather_scatters_p, vect_build_all_ones_mask)
> (vect_build_zero_merge_argument, vect_get_gather_scatter_ops)
> (vect_gen_widened_results_half, vect_get_loop_based_defs)
> (vect_create_vectorized_promotion_stmts, can_vectorize_live_stmts):
> Take a stmt_vec_info instead of a gimple stmt and pass stmt_vec_infos
> down to subroutines.
>
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c 2018-07-24 10:23:35.376732054 +0100
> +++ gcc/tree-vect-data-refs.c 2018-07-24 10:23:46.108636749 +0100
> @@ -3621,13 +3621,14 @@ vect_gather_scatter_fn_p (bool read_p, b
> return true;
> }
>
> -/* CALL is a call to an internal gather load or scatter store function.
> +/* STMT_INFO is a call to an internal gather load or scatter store function.
> Describe the operation in INFO. */
>
> static void
> -vect_describe_gather_scatter_call (gcall *call, gather_scatter_info *info)
> +vect_describe_gather_scatter_call (stmt_vec_info stmt_info,
> + gather_scatter_info *info)
> {
> - stmt_vec_info stmt_info = vinfo_for_stmt (call);
> + gcall *call = as_a <gcall *> (stmt_info->stmt);
> tree vectype = STMT_VINFO_VECTYPE (stmt_info);
> data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
>
> @@ -3672,7 +3673,7 @@ vect_check_gather_scatter (gimple *stmt,
> ifn = gimple_call_internal_fn (call);
> if (internal_gather_scatter_fn_p (ifn))
> {
> - vect_describe_gather_scatter_call (call, info);
> + vect_describe_gather_scatter_call (stmt_info, info);
> return true;
> }
> masked_p = (ifn == IFN_MASK_LOAD || ifn == IFN_MASK_STORE);
> Index: gcc/tree-vect-loop-manip.c
> ===================================================================
> --- gcc/tree-vect-loop-manip.c 2018-07-24 10:23:35.376732054 +0100
> +++ gcc/tree-vect-loop-manip.c 2018-07-24 10:23:46.112636713 +0100
> @@ -1335,16 +1335,16 @@ find_loop_location (struct loop *loop)
> return dump_user_location_t ();
> }
>
> -/* Return true if PHI defines an IV of the loop to be vectorized. */
> +/* Return true if the phi described by STMT_INFO defines an IV of the
> + loop to be vectorized. */
>
> static bool
> -iv_phi_p (gphi *phi)
> +iv_phi_p (stmt_vec_info stmt_info)
> {
> + gphi *phi = as_a <gphi *> (stmt_info->stmt);
> if (virtual_operand_p (PHI_RESULT (phi)))
> return false;
>
> - stmt_vec_info stmt_info = vinfo_for_stmt (phi);
> - gcc_assert (stmt_info != NULL_STMT_VEC_INFO);
> if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def
> || STMT_VINFO_DEF_TYPE (stmt_info) == vect_double_reduction_def)
> return false;
> @@ -1388,7 +1388,7 @@ vect_can_advance_ivs_p (loop_vec_info lo
> virtual defs/uses (i.e., memory accesses) are analyzed elsewhere.
>
> Skip reduction phis. */
> - if (!iv_phi_p (phi))
> + if (!iv_phi_p (phi_info))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -1509,7 +1509,7 @@ vect_update_ivs_after_vectorizer (loop_v
> }
>
> /* Skip reduction and virtual phis. */
> - if (!iv_phi_p (phi))
> + if (!iv_phi_p (phi_info))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -2088,7 +2088,8 @@ slpeel_update_phi_nodes_for_loops (loop_
> tree arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, first_latch_e);
> /* Generate lcssa PHI node for the first loop. */
> gphi *vect_phi = (loop == first) ? orig_phi : update_phi;
> - if (create_lcssa_for_iv_phis || !iv_phi_p (vect_phi))
> + stmt_vec_info vect_phi_info = loop_vinfo->lookup_stmt (vect_phi);
> + if (create_lcssa_for_iv_phis || !iv_phi_p (vect_phi_info))
> {
> tree new_res = copy_ssa_name (PHI_RESULT (orig_phi));
> gphi *lcssa_phi = create_phi_node (new_res, between_bb);
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2018-07-24 10:23:42.472669038 +0100
> +++ gcc/tree-vect-loop.c 2018-07-24 10:23:46.112636713 +0100
> @@ -8207,21 +8207,18 @@ scale_profile_for_vect_loop (struct loop
> scale_bbs_frequencies (&loop->latch, 1, exit_l->probability / prob);
> }
>
> -/* Vectorize STMT if relevant, inserting any new instructions before GSI.
> - When vectorizing STMT as a store, set *SEEN_STORE to its stmt_vec_info.
> +/* Vectorize STMT_INFO if relevant, inserting any new instructions before GSI.
> + When vectorizing STMT_INFO as a store, set *SEEN_STORE to its stmt_vec_info.
> *SLP_SCHEDULE is a running record of whether we have called
> vect_schedule_slp. */
>
> static void
> -vect_transform_loop_stmt (loop_vec_info loop_vinfo, gimple *stmt,
> +vect_transform_loop_stmt (loop_vec_info loop_vinfo, stmt_vec_info stmt_info,
> gimple_stmt_iterator *gsi,
> stmt_vec_info *seen_store, bool *slp_scheduled)
> {
> struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
> poly_uint64 vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
> - stmt_vec_info stmt_info = loop_vinfo->lookup_stmt (stmt);
> - if (!stmt_info)
> - return;
>
> if (dump_enabled_p ())
> {
> @@ -8476,15 +8473,19 @@ vect_transform_loop (loop_vec_info loop_
> gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
> for (gimple_stmt_iterator subsi = gsi_start (def_seq);
> !gsi_end_p (subsi); gsi_next (&subsi))
> - vect_transform_loop_stmt (loop_vinfo,
> - gsi_stmt (subsi), &si,
> - &seen_store,
> - &slp_scheduled);
> - gimple *pat_stmt = STMT_VINFO_RELATED_STMT (stmt_info);
> - vect_transform_loop_stmt (loop_vinfo, pat_stmt, &si,
> + {
> + stmt_vec_info pat_stmt_info
> + = loop_vinfo->lookup_stmt (gsi_stmt (subsi));
> + vect_transform_loop_stmt (loop_vinfo, pat_stmt_info,
> + &si, &seen_store,
> + &slp_scheduled);
> + }
> + stmt_vec_info pat_stmt_info
> + = STMT_VINFO_RELATED_STMT (stmt_info);
> + vect_transform_loop_stmt (loop_vinfo, pat_stmt_info, &si,
> &seen_store, &slp_scheduled);
> }
> - vect_transform_loop_stmt (loop_vinfo, stmt, &si,
> + vect_transform_loop_stmt (loop_vinfo, stmt_info, &si,
> &seen_store, &slp_scheduled);
> }
> if (seen_store)
> Index: gcc/tree-vect-slp.c
> ===================================================================
> --- gcc/tree-vect-slp.c 2018-07-24 10:23:38.964700191 +0100
> +++ gcc/tree-vect-slp.c 2018-07-24 10:23:46.112636713 +0100
> @@ -1856,16 +1856,15 @@ vect_find_last_scalar_stmt_in_slp (slp_t
> return last;
> }
>
> -/* Splits a group of stores, currently beginning at FIRST_STMT, into two groups:
> - one (still beginning at FIRST_STMT) of size GROUP1_SIZE (also containing
> - the first GROUP1_SIZE stmts, since stores are consecutive), the second
> - containing the remainder.
> +/* Splits a group of stores, currently beginning at FIRST_VINFO, into
> + two groups: one (still beginning at FIRST_VINFO) of size GROUP1_SIZE
> + (also containing the first GROUP1_SIZE stmts, since stores are
> + consecutive), the second containing the remainder.
> Return the first stmt in the second group. */
>
> -static gimple *
> -vect_split_slp_store_group (gimple *first_stmt, unsigned group1_size)
> +static stmt_vec_info
> +vect_split_slp_store_group (stmt_vec_info first_vinfo, unsigned group1_size)
> {
> - stmt_vec_info first_vinfo = vinfo_for_stmt (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;
> @@ -2174,7 +2173,8 @@ vect_analyze_slp_instance (vec_info *vin
> gcc_assert ((const_nunits & (const_nunits - 1)) == 0);
> unsigned group1_size = i & ~(const_nunits - 1);
>
> - gimple *rest = vect_split_slp_store_group (stmt_info, group1_size);
> + stmt_vec_info rest = vect_split_slp_store_group (stmt_info,
> + group1_size);
> bool res = vect_analyze_slp_instance (vinfo, stmt_info,
> max_tree_size);
> /* If the first non-match was in the middle of a vector,
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2018-07-24 10:23:42.472669038 +0100
> +++ gcc/tree-vect-stmts.c 2018-07-24 10:23:46.116636678 +0100
> @@ -117,12 +117,12 @@ create_vector_array (tree elem_type, uns
>
> /* ARRAY is an array of vectors created by create_vector_array.
> Return an SSA_NAME for the vector in index N. The reference
> - is part of the vectorization of STMT and the vector is associated
> + is part of the vectorization of STMT_INFO and the vector is associated
> with scalar destination SCALAR_DEST. */
>
> static tree
> -read_vector_array (gimple *stmt, gimple_stmt_iterator *gsi, tree scalar_dest,
> - tree array, unsigned HOST_WIDE_INT n)
> +read_vector_array (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
> + tree scalar_dest, tree array, unsigned HOST_WIDE_INT n)
> {
> tree vect_type, vect, vect_name, array_ref;
> gimple *new_stmt;
> @@ -137,18 +137,18 @@ read_vector_array (gimple *stmt, gimple_
> new_stmt = gimple_build_assign (vect, array_ref);
> vect_name = make_ssa_name (vect, new_stmt);
> gimple_assign_set_lhs (new_stmt, vect_name);
> - vect_finish_stmt_generation (stmt, new_stmt, gsi);
> + vect_finish_stmt_generation (stmt_info, new_stmt, gsi);
>
> return vect_name;
> }
>
> /* ARRAY is an array of vectors created by create_vector_array.
> Emit code to store SSA_NAME VECT in index N of the array.
> - The store is part of the vectorization of STMT. */
> + The store is part of the vectorization of STMT_INFO. */
>
> static void
> -write_vector_array (gimple *stmt, gimple_stmt_iterator *gsi, tree vect,
> - tree array, unsigned HOST_WIDE_INT n)
> +write_vector_array (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
> + tree vect, tree array, unsigned HOST_WIDE_INT n)
> {
> tree array_ref;
> gimple *new_stmt;
> @@ -158,7 +158,7 @@ write_vector_array (gimple *stmt, gimple
> NULL_TREE, NULL_TREE);
>
> new_stmt = gimple_build_assign (array_ref, vect);
> - vect_finish_stmt_generation (stmt, new_stmt, gsi);
> + vect_finish_stmt_generation (stmt_info, new_stmt, gsi);
> }
>
> /* PTR is a pointer to an array of type TYPE. Return a representation
> @@ -176,15 +176,16 @@ create_array_ref (tree type, tree ptr, t
> return mem_ref;
> }
>
> -/* Add a clobber of variable VAR to the vectorization of STMT.
> +/* Add a clobber of variable VAR to the vectorization of STMT_INFO.
> Emit the clobber before *GSI. */
>
> static void
> -vect_clobber_variable (gimple *stmt, gimple_stmt_iterator *gsi, tree var)
> +vect_clobber_variable (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
> + tree var)
> {
> tree clobber = build_clobber (TREE_TYPE (var));
> gimple *new_stmt = gimple_build_assign (var, clobber);
> - vect_finish_stmt_generation (stmt, new_stmt, gsi);
> + vect_finish_stmt_generation (stmt_info, new_stmt, gsi);
> }
>
> /* Utility functions used by vect_mark_stmts_to_be_vectorized. */
> @@ -281,8 +282,8 @@ is_simple_and_all_uses_invariant (gimple
>
> /* Function vect_stmt_relevant_p.
>
> - Return true if STMT in loop that is represented by LOOP_VINFO is
> - "relevant for vectorization".
> + Return true if STMT_INFO, in the loop that is represented by LOOP_VINFO,
> + is "relevant for vectorization".
>
> A stmt is considered "relevant for vectorization" if:
> - it has uses outside the loop.
> @@ -292,7 +293,7 @@ is_simple_and_all_uses_invariant (gimple
> CHECKME: what other side effects would the vectorizer allow? */
>
> static bool
> -vect_stmt_relevant_p (gimple *stmt, loop_vec_info loop_vinfo,
> +vect_stmt_relevant_p (stmt_vec_info stmt_info, loop_vec_info loop_vinfo,
> enum vect_relevant *relevant, bool *live_p)
> {
> struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
> @@ -305,15 +306,14 @@ vect_stmt_relevant_p (gimple *stmt, loop
> *live_p = false;
>
> /* cond stmt other than loop exit cond. */
> - if (is_ctrl_stmt (stmt)
> - && STMT_VINFO_TYPE (vinfo_for_stmt (stmt))
> - != loop_exit_ctrl_vec_info_type)
> + if (is_ctrl_stmt (stmt_info->stmt)
> + && STMT_VINFO_TYPE (stmt_info) != loop_exit_ctrl_vec_info_type)
> *relevant = vect_used_in_scope;
>
> /* changing memory. */
> - if (gimple_code (stmt) != GIMPLE_PHI)
> - if (gimple_vdef (stmt)
> - && !gimple_clobber_p (stmt))
> + if (gimple_code (stmt_info->stmt) != GIMPLE_PHI)
> + if (gimple_vdef (stmt_info->stmt)
> + && !gimple_clobber_p (stmt_info->stmt))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -322,7 +322,7 @@ vect_stmt_relevant_p (gimple *stmt, loop
> }
>
> /* uses outside the loop. */
> - FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
> + FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt_info->stmt, op_iter, SSA_OP_DEF)
> {
> FOR_EACH_IMM_USE_FAST (use_p, imm_iter, DEF_FROM_PTR (def_p))
> {
> @@ -347,7 +347,7 @@ vect_stmt_relevant_p (gimple *stmt, loop
> }
>
> if (*live_p && *relevant == vect_unused_in_scope
> - && !is_simple_and_all_uses_invariant (stmt, loop_vinfo))
> + && !is_simple_and_all_uses_invariant (stmt_info, loop_vinfo))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -1838,7 +1838,7 @@ vectorizable_internal_function (combined
> }
>
>
> -static tree permute_vec_elements (tree, tree, tree, gimple *,
> +static tree permute_vec_elements (tree, tree, tree, stmt_vec_info,
> gimple_stmt_iterator *);
>
> /* Check whether a load or store statement in the loop described by
> @@ -2072,19 +2072,19 @@ vect_truncate_gather_scatter_offset (gim
> }
>
> /* Return true if we can use gather/scatter internal functions to
> - vectorize STMT, which is a grouped or strided load or store.
> + vectorize STMT_INFO, which is a grouped or strided load or store.
> MASKED_P is true if load or store is conditional. When returning
> true, fill in GS_INFO with the information required to perform the
> operation. */
>
> static bool
> -vect_use_strided_gather_scatters_p (gimple *stmt, loop_vec_info loop_vinfo,
> - bool masked_p,
> +vect_use_strided_gather_scatters_p (stmt_vec_info stmt_info,
> + loop_vec_info loop_vinfo, bool masked_p,
> gather_scatter_info *gs_info)
> {
> - if (!vect_check_gather_scatter (stmt, loop_vinfo, gs_info)
> + if (!vect_check_gather_scatter (stmt_info, loop_vinfo, gs_info)
> || gs_info->decl)
> - return vect_truncate_gather_scatter_offset (stmt, loop_vinfo,
> + return vect_truncate_gather_scatter_offset (stmt_info, loop_vinfo,
> masked_p, gs_info);
>
> scalar_mode element_mode = SCALAR_TYPE_MODE (gs_info->element_type);
> @@ -2613,12 +2613,12 @@ vect_check_store_rhs (gimple *stmt, tree
> return true;
> }
>
> -/* Build an all-ones vector mask of type MASKTYPE while vectorizing STMT.
> +/* Build an all-ones vector mask of type MASKTYPE while vectorizing STMT_INFO.
> Note that we support masks with floating-point type, in which case the
> floats are interpreted as a bitmask. */
>
> static tree
> -vect_build_all_ones_mask (gimple *stmt, tree masktype)
> +vect_build_all_ones_mask (stmt_vec_info stmt_info, tree masktype)
> {
> if (TREE_CODE (masktype) == INTEGER_TYPE)
> return build_int_cst (masktype, -1);
> @@ -2626,7 +2626,7 @@ vect_build_all_ones_mask (gimple *stmt,
> {
> tree mask = build_int_cst (TREE_TYPE (masktype), -1);
> mask = build_vector_from_val (masktype, mask);
> - return vect_init_vector (stmt, mask, masktype, NULL);
> + return vect_init_vector (stmt_info, mask, masktype, NULL);
> }
> else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (masktype)))
> {
> @@ -2637,16 +2637,16 @@ vect_build_all_ones_mask (gimple *stmt,
> real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (masktype)));
> tree mask = build_real (TREE_TYPE (masktype), r);
> mask = build_vector_from_val (masktype, mask);
> - return vect_init_vector (stmt, mask, masktype, NULL);
> + return vect_init_vector (stmt_info, mask, masktype, NULL);
> }
> gcc_unreachable ();
> }
>
> /* Build an all-zero merge value of type VECTYPE while vectorizing
> - STMT as a gather load. */
> + STMT_INFO as a gather load. */
>
> static tree
> -vect_build_zero_merge_argument (gimple *stmt, tree vectype)
> +vect_build_zero_merge_argument (stmt_vec_info stmt_info, tree vectype)
> {
> tree merge;
> if (TREE_CODE (TREE_TYPE (vectype)) == INTEGER_TYPE)
> @@ -2663,7 +2663,7 @@ vect_build_zero_merge_argument (gimple *
> else
> gcc_unreachable ();
> merge = build_vector_from_val (vectype, merge);
> - return vect_init_vector (stmt, merge, vectype, NULL);
> + return vect_init_vector (stmt_info, merge, vectype, NULL);
> }
>
> /* Build a gather load call while vectorizing STMT. Insert new instructions
> @@ -2871,11 +2871,12 @@ vect_build_gather_load_calls (gimple *st
>
> /* Prepare the base and offset in GS_INFO for vectorization.
> Set *DATAREF_PTR to the loop-invariant base address and *VEC_OFFSET
> - to the vectorized offset argument for the first copy of STMT. STMT
> - is the statement described by GS_INFO and LOOP is the containing loop. */
> + to the vectorized offset argument for the first copy of STMT_INFO.
> + STMT_INFO is the statement described by GS_INFO and LOOP is the
> + containing loop. */
>
> static void
> -vect_get_gather_scatter_ops (struct loop *loop, gimple *stmt,
> +vect_get_gather_scatter_ops (struct loop *loop, stmt_vec_info stmt_info,
> gather_scatter_info *gs_info,
> tree *dataref_ptr, tree *vec_offset)
> {
> @@ -2890,7 +2891,7 @@ vect_get_gather_scatter_ops (struct loop
> }
> tree offset_type = TREE_TYPE (gs_info->offset);
> tree offset_vectype = get_vectype_for_scalar_type (offset_type);
> - *vec_offset = vect_get_vec_def_for_operand (gs_info->offset, stmt,
> + *vec_offset = vect_get_vec_def_for_operand (gs_info->offset, stmt_info,
> offset_vectype);
> }
>
> @@ -4403,14 +4404,14 @@ vectorizable_simd_clone_call (gimple *st
> VEC_OPRND0 and VEC_OPRND1. The new vector stmt is to be inserted at BSI.
> In the case that CODE is a CALL_EXPR, this means that a call to DECL
> needs to be created (DECL is a function-decl of a target-builtin).
> - STMT is the original scalar stmt that we are vectorizing. */
> + STMT_INFO is the original scalar stmt that we are vectorizing. */
>
> static gimple *
> vect_gen_widened_results_half (enum tree_code code,
> tree decl,
> tree vec_oprnd0, tree vec_oprnd1, int op_type,
> tree vec_dest, gimple_stmt_iterator *gsi,
> - gimple *stmt)
> + stmt_vec_info stmt_info)
> {
> gimple *new_stmt;
> tree new_temp;
> @@ -4436,22 +4437,23 @@ vect_gen_widened_results_half (enum tree
> new_temp = make_ssa_name (vec_dest, new_stmt);
> gimple_assign_set_lhs (new_stmt, new_temp);
> }
> - vect_finish_stmt_generation (stmt, new_stmt, gsi);
> + vect_finish_stmt_generation (stmt_info, new_stmt, gsi);
>
> return new_stmt;
> }
>
>
> -/* Get vectorized definitions for loop-based vectorization. For the first
> - operand we call vect_get_vec_def_for_operand() (with OPRND containing
> - scalar operand), and for the rest we get a copy with
> +/* Get vectorized definitions for loop-based vectorization of STMT_INFO.
> + For the first operand we call vect_get_vec_def_for_operand (with OPRND
> + containing scalar operand), and for the rest we get a copy with
> vect_get_vec_def_for_stmt_copy() using the previous vector definition
> (stored in OPRND). See vect_get_vec_def_for_stmt_copy() for details.
> The vectors are collected into VEC_OPRNDS. */
>
> static void
> -vect_get_loop_based_defs (tree *oprnd, gimple *stmt, enum vect_def_type dt,
> - vec<tree> *vec_oprnds, int multi_step_cvt)
> +vect_get_loop_based_defs (tree *oprnd, stmt_vec_info stmt_info,
> + enum vect_def_type dt, vec<tree> *vec_oprnds,
> + int multi_step_cvt)
> {
> tree vec_oprnd;
>
> @@ -4459,7 +4461,7 @@ vect_get_loop_based_defs (tree *oprnd, g
> /* All the vector operands except the very first one (that is scalar oprnd)
> are stmt copies. */
> if (TREE_CODE (TREE_TYPE (*oprnd)) != VECTOR_TYPE)
> - vec_oprnd = vect_get_vec_def_for_operand (*oprnd, stmt);
> + vec_oprnd = vect_get_vec_def_for_operand (*oprnd, stmt_info);
> else
> vec_oprnd = vect_get_vec_def_for_stmt_copy (dt, *oprnd);
>
> @@ -4474,7 +4476,8 @@ vect_get_loop_based_defs (tree *oprnd, g
> /* For conversion in multiple steps, continue to get operands
> recursively. */
> if (multi_step_cvt)
> - vect_get_loop_based_defs (oprnd, stmt, dt, vec_oprnds, multi_step_cvt - 1);
> + vect_get_loop_based_defs (oprnd, stmt_info, dt, vec_oprnds,
> + multi_step_cvt - 1);
> }
>
>
> @@ -4549,13 +4552,14 @@ vect_create_vectorized_demotion_stmts (v
>
>
> /* Create vectorized promotion statements for vector operands from VEC_OPRNDS0
> - and VEC_OPRNDS1 (for binary operations). For multi-step conversions store
> - the resulting vectors and call the function recursively. */
> + and VEC_OPRNDS1, for a binary operation associated with scalar statement
> + STMT_INFO. For multi-step conversions store the resulting vectors and
> + call the function recursively. */
>
> static void
> vect_create_vectorized_promotion_stmts (vec<tree> *vec_oprnds0,
> vec<tree> *vec_oprnds1,
> - gimple *stmt, tree vec_dest,
> + stmt_vec_info stmt_info, tree vec_dest,
> gimple_stmt_iterator *gsi,
> enum tree_code code1,
> enum tree_code code2, tree decl1,
> @@ -4576,9 +4580,11 @@ vect_create_vectorized_promotion_stmts (
>
> /* Generate the two halves of promotion operation. */
> new_stmt1 = vect_gen_widened_results_half (code1, decl1, vop0, vop1,
> - op_type, vec_dest, gsi, stmt);
> + op_type, vec_dest, gsi,
> + stmt_info);
> new_stmt2 = vect_gen_widened_results_half (code2, decl2, vop0, vop1,
> - op_type, vec_dest, gsi, stmt);
> + op_type, vec_dest, gsi,
> + stmt_info);
> if (is_gimple_call (new_stmt1))
> {
> new_tmp1 = gimple_call_lhs (new_stmt1);
> @@ -7318,19 +7324,19 @@ vect_gen_perm_mask_checked (tree vectype
> }
>
> /* Given a vector variable X and Y, that was generated for the scalar
> - STMT, generate instructions to permute the vector elements of X and Y
> + STMT_INFO, generate instructions to permute the vector elements of X and Y
> using permutation mask MASK_VEC, insert them at *GSI and return the
> permuted vector variable. */
>
> static tree
> -permute_vec_elements (tree x, tree y, tree mask_vec, gimple *stmt,
> +permute_vec_elements (tree x, tree y, tree mask_vec, stmt_vec_info stmt_info,
> gimple_stmt_iterator *gsi)
> {
> tree vectype = TREE_TYPE (x);
> tree perm_dest, data_ref;
> gimple *perm_stmt;
>
> - tree scalar_dest = gimple_get_lhs (stmt);
> + tree scalar_dest = gimple_get_lhs (stmt_info->stmt);
> if (TREE_CODE (scalar_dest) == SSA_NAME)
> perm_dest = vect_create_destination_var (scalar_dest, vectype);
> else
> @@ -7339,7 +7345,7 @@ permute_vec_elements (tree x, tree y, tr
>
> /* Generate the permute statement. */
> perm_stmt = gimple_build_assign (data_ref, VEC_PERM_EXPR, x, y, mask_vec);
> - vect_finish_stmt_generation (stmt, perm_stmt, gsi);
> + vect_finish_stmt_generation (stmt_info, perm_stmt, gsi);
>
> return data_ref;
> }
> @@ -9409,11 +9415,11 @@ vectorizable_comparison (gimple *stmt, g
>
> /* If SLP_NODE is nonnull, return true if vectorizable_live_operation
> can handle all live statements in the node. Otherwise return true
> - if STMT is not live or if vectorizable_live_operation can handle it.
> + if STMT_INFO is not live or if vectorizable_live_operation can handle it.
> GSI and VEC_STMT are as for vectorizable_live_operation. */
>
> static bool
> -can_vectorize_live_stmts (gimple *stmt, gimple_stmt_iterator *gsi,
> +can_vectorize_live_stmts (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
> slp_tree slp_node, stmt_vec_info *vec_stmt,
> stmt_vector_for_cost *cost_vec)
> {
> @@ -9429,9 +9435,9 @@ can_vectorize_live_stmts (gimple *stmt,
> return false;
> }
> }
> - else if (STMT_VINFO_LIVE_P (vinfo_for_stmt (stmt))
> - && !vectorizable_live_operation (stmt, gsi, slp_node, -1, vec_stmt,
> - cost_vec))
> + else if (STMT_VINFO_LIVE_P (stmt_info)
> + && !vectorizable_live_operation (stmt_info, gsi, slp_node, -1,
> + vec_stmt, cost_vec))
> return false;
>
> return true;
next prev parent reply other threads:[~2018-07-25 10:05 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-24 9:52 [00/46] Remove vinfo_for_stmt etc Richard Sandiford
2018-07-24 9:52 ` [01/46] Move special cases out of get_initial_def_for_reduction Richard Sandiford
2018-07-25 8:42 ` Richard Biener
2018-07-24 9:53 ` [02/46] Remove dead vectorizable_reduction code Richard Sandiford
2018-07-25 8:43 ` Richard Biener
2018-07-24 9:53 ` [03/46] Remove unnecessary update of NUM_SLP_USES Richard Sandiford
2018-07-25 8:46 ` Richard Biener
2018-07-24 9:54 ` [04/46] Factor out the test for a valid reduction input Richard Sandiford
2018-07-25 8:46 ` Richard Biener
2018-07-24 9:54 ` [05/46] Fix make_ssa_name call in vectorizable_reduction Richard Sandiford
2018-07-25 8:47 ` Richard Biener
2018-07-24 9:55 ` [06/46] Add vec_info::add_stmt Richard Sandiford
2018-07-25 9:10 ` Richard Biener
2018-07-24 9:55 ` [08/46] Add vec_info::lookup_def Richard Sandiford
2018-07-25 9:12 ` Richard Biener
2018-07-24 9:55 ` [07/46] Add vec_info::lookup_stmt Richard Sandiford
2018-07-25 9:11 ` Richard Biener
2018-07-24 9:56 ` [09/46] Add vec_info::lookup_single_use Richard Sandiford
2018-07-25 9:13 ` Richard Biener
2018-07-24 9:57 ` [10/46] Temporarily make stmt_vec_info a class Richard Sandiford
2018-07-25 9:14 ` Richard Biener
2018-07-24 9:57 ` [11/46] Pass back a stmt_vec_info from vect_is_simple_use Richard Sandiford
2018-07-25 9:18 ` Richard Biener
2018-07-24 9:58 ` [14/46] Make STMT_VINFO_VEC_STMT a stmt_vec_info Richard Sandiford
2018-07-25 9:21 ` Richard Biener
2018-07-25 11:03 ` Richard Sandiford
2018-08-02 0:22 ` H.J. Lu
2018-08-02 9:58 ` Richard Sandiford
2018-07-24 9:58 ` [13/46] Make STMT_VINFO_RELATED_STMT " Richard Sandiford
2018-07-25 9:19 ` Richard Biener
2018-07-24 9:58 ` [12/46] Make vect_finish_stmt_generation return " Richard Sandiford
2018-07-25 9:19 ` Richard Biener
2018-07-24 9:59 ` [15/46] Make SLP_TREE_VEC_STMTS a vec<stmt_vec_info> Richard Sandiford
2018-07-25 9:22 ` Richard Biener
2018-07-24 9:59 ` [16/46] Make STMT_VINFO_REDUC_DEF a stmt_vec_info Richard Sandiford
2018-07-25 9:22 ` Richard Biener
2018-07-24 9:59 ` [17/46] Make LOOP_VINFO_REDUCTIONS an auto_vec<stmt_vec_info> Richard Sandiford
2018-07-25 9:23 ` Richard Biener
2018-07-24 10:00 ` [18/46] Make SLP_TREE_SCALAR_STMTS a vec<stmt_vec_info> Richard Sandiford
2018-07-25 9:27 ` Richard Biener
2018-07-31 15:03 ` Richard Sandiford
2018-07-24 10:01 ` [21/46] Make grouped_stores and reduction_chains use stmt_vec_infos Richard Sandiford
2018-07-25 9:28 ` Richard Biener
2018-07-24 10:01 ` [20/46] Make *FIRST_ELEMENT and *NEXT_ELEMENT stmt_vec_infos Richard Sandiford
2018-07-25 9:28 ` Richard Biener
2018-07-24 10:01 ` [19/46] Make vect_dr_stmt return a stmt_vec_info Richard Sandiford
2018-07-25 9:28 ` Richard Biener
2018-07-24 10:02 ` [23/46] Make LOOP_VINFO_MAY_MISALIGN_STMTS use stmt_vec_info Richard Sandiford
2018-07-25 9:29 ` Richard Biener
2018-07-24 10:02 ` [24/46] Make stmt_info_for_cost use a stmt_vec_info Richard Sandiford
2018-07-25 9:30 ` Richard Biener
2018-07-24 10:02 ` [22/46] Make DR_GROUP_SAME_DR_STMT " Richard Sandiford
2018-07-25 9:29 ` Richard Biener
2018-07-24 10:03 ` [27/46] Remove duplicated stmt_vec_info lookups Richard Sandiford
2018-07-25 9:32 ` Richard Biener
2018-07-24 10:03 ` [26/46] Make more use of dyn_cast in tree-vect* Richard Sandiford
2018-07-25 9:31 ` Richard Biener
2018-07-24 10:03 ` [25/46] Make get_earlier/later_stmt take and return stmt_vec_infos Richard Sandiford
2018-07-25 9:31 ` Richard Biener
2018-07-24 10:04 ` [28/46] Use stmt_vec_info instead of gimple stmts internally (part 1) Richard Sandiford
2018-07-25 9:33 ` Richard Biener
2018-07-24 10:04 ` [30/46] Use stmt_vec_infos rather than gimple stmts for worklists Richard Sandiford
2018-07-25 10:04 ` Richard Biener
2018-07-24 10:04 ` [29/46] Use stmt_vec_info instead of gimple stmts internally (part 2) Richard Sandiford
2018-07-25 10:03 ` Richard Biener
2018-07-24 10:05 ` [31/46] Use stmt_vec_info in function interfaces (part 1) Richard Sandiford
2018-07-25 10:05 ` Richard Biener [this message]
2018-07-24 10:05 ` [32/46] Use stmt_vec_info in function interfaces (part 2) Richard Sandiford
2018-07-25 10:06 ` Richard Biener
2018-07-24 10:06 ` [33/46] Use stmt_vec_infos instead of vec_info/gimple stmt pairs Richard Sandiford
2018-07-25 10:06 ` Richard Biener
2018-07-24 10:06 ` [35/46] Alter interfaces within vect_pattern_recog Richard Sandiford
2018-07-25 10:14 ` Richard Biener
2018-07-24 10:06 ` [34/46] Alter interface to vect_get_vec_def_for_stmt_copy Richard Sandiford
2018-07-25 10:13 ` Richard Biener
2018-07-24 10:07 ` [37/46] Associate alignment information with stmt_vec_infos Richard Sandiford
2018-07-25 10:18 ` Richard Biener
2018-07-26 10:55 ` Richard Sandiford
2018-07-26 11:13 ` Richard Biener
2018-07-24 10:07 ` [36/46] Add a pattern_stmt_p field to stmt_vec_info Richard Sandiford
2018-07-25 10:15 ` Richard Biener
2018-07-25 11:09 ` Richard Sandiford
2018-07-25 11:48 ` Richard Biener
2018-07-26 10:29 ` Richard Sandiford
2018-07-26 11:15 ` Richard Biener
2018-07-24 10:08 ` [39/46] Replace STMT_VINFO_UNALIGNED_DR with the associated statement Richard Sandiford
2018-07-26 11:08 ` [39/46 v2] Change STMT_VINFO_UNALIGNED_DR to a dr_vec_info Richard Sandiford
2018-07-26 11:13 ` Richard Biener
2018-07-24 10:08 ` [38/46] Pass stmt_vec_infos instead of data_references where relevant Richard Sandiford
2018-07-25 10:21 ` Richard Biener
2018-07-25 11:21 ` Richard Sandiford
2018-07-26 11:05 ` Richard Sandiford
2018-07-26 11:13 ` Richard Biener
2018-07-24 10:09 ` [42/46] Add vec_info::replace_stmt Richard Sandiford
2018-07-31 12:03 ` Richard Biener
2018-07-24 10:09 ` [41/46] Add vec_info::remove_stmt Richard Sandiford
2018-07-31 12:02 ` Richard Biener
2018-07-24 10:09 ` [40/46] Add vec_info::lookup_dr Richard Sandiford
2018-07-26 11:10 ` [40/46 v2] " Richard Sandiford
2018-07-26 11:16 ` Richard Biener
2018-07-24 10:10 ` [44/46] Remove global vinfo_for_stmt-related routines Richard Sandiford
2018-07-31 12:05 ` Richard Biener
2018-07-24 10:10 ` [43/46] Make free_stmt_vec_info take a stmt_vec_info Richard Sandiford
2018-07-31 12:03 ` Richard Biener
2018-07-24 10:10 ` [45/46] Remove vect_stmt_in_region_p Richard Sandiford
2018-07-31 12:06 ` Richard Biener
2018-07-24 10:11 ` [46/46] Turn stmt_vec_info back into a typedef Richard Sandiford
2018-07-31 12:07 ` Richard Biener
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAFiYyc0_DVCpKesGEoDReg7t=hxojs66u_KYp3EfTO8XxAViMA@mail.gmail.com' \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=richard.sandiford@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).