This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Add a vect_worthwhile_without_simd_p helper routine
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Sandiford <richard dot sandiford at linaro dot org>
- Date: Thu, 14 Sep 2017 15:38:16 +0200
- Subject: Re: Add a vect_worthwhile_without_simd_p helper routine
- Authentication-results: sourceware.org; auth=none
- References: <87shfpwmm3.fsf@linaro.org>
On Thu, Sep 14, 2017 at 1:22 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> The vectoriser sometimes considers lowering "vector" operations into N
> scalar word operations. This N needs to be fixed at compile time, so
> the condition guarding it needs to change when variable-lengh vectors
> are added. This patch puts the condition into a helper routine so that
> there's only one place to update.
>
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
> OK to install?
Ok.
Richard.
> Richard
>
>
> 2017-09-14 Richard Sandiford <richard.sandiford@linaro.org>
> Alan Hayward <alan.hayward@arm.com>
> David Sherwood <david.sherwood@arm.com>
>
> gcc/
> * tree-vectorizer.h (vect_min_worthwhile_factor): Delete.
> (vect_worthwhile_without_simd_p): Declare.
> * tree-vect-loop.c (vect_worthwhile_without_simd_p): New function.
> (vectorizable_reduction): Use it.
> * tree-vect-stmts.c (vectorizable_shift): Likewise.
> (vectorizable_operation): Likewise.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h 2017-09-14 11:27:50.352072753 +0100
> +++ gcc/tree-vectorizer.h 2017-09-14 11:28:27.080519923 +0100
> @@ -1230,7 +1230,7 @@ extern bool vectorizable_reduction (gimp
> extern bool vectorizable_induction (gimple *, gimple_stmt_iterator *,
> gimple **, slp_tree);
> extern tree get_initial_def_for_reduction (gimple *, tree, tree *);
> -extern int vect_min_worthwhile_factor (enum tree_code);
> +extern bool vect_worthwhile_without_simd_p (vec_info *, tree_code);
> extern int vect_get_known_peeling_cost (loop_vec_info, int, int *,
> stmt_vector_for_cost *,
> stmt_vector_for_cost *,
> Index: gcc/tree-vect-loop.c
> ===================================================================
> --- gcc/tree-vect-loop.c 2017-09-14 11:27:50.351164919 +0100
> +++ gcc/tree-vect-loop.c 2017-09-14 11:28:27.079519923 +0100
> @@ -6030,8 +6030,7 @@ vectorizable_reduction (gimple *stmt, gi
> dump_printf (MSG_NOTE, "op not supported by target.\n");
>
> if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
> - || LOOP_VINFO_VECT_FACTOR (loop_vinfo)
> - < vect_min_worthwhile_factor (code))
> + || !vect_worthwhile_without_simd_p (loop_vinfo, code))
> return false;
>
> if (dump_enabled_p ())
> @@ -6040,8 +6039,7 @@ vectorizable_reduction (gimple *stmt, gi
>
> /* Worthwhile without SIMD support? */
> if (!VECTOR_MODE_P (TYPE_MODE (vectype_in))
> - && LOOP_VINFO_VECT_FACTOR (loop_vinfo)
> - < vect_min_worthwhile_factor (code))
> + && !vect_worthwhile_without_simd_p (loop_vinfo, code))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -6492,6 +6490,18 @@ vect_min_worthwhile_factor (enum tree_co
> }
> }
>
> +/* Return true if VINFO indicates we are doing loop vectorization and if
> + it is worth decomposing CODE operations into scalar operations for
> + that loop's vectorization factor. */
> +
> +bool
> +vect_worthwhile_without_simd_p (vec_info *vinfo, tree_code code)
> +{
> + loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo);
> + return (loop_vinfo
> + && (LOOP_VINFO_VECT_FACTOR (loop_vinfo)
> + >= vect_min_worthwhile_factor (code)));
> +}
>
> /* Function vectorizable_induction
>
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2017-09-14 11:27:50.352072753 +0100
> +++ gcc/tree-vect-stmts.c 2017-09-14 11:28:27.080519923 +0100
> @@ -4869,7 +4869,6 @@ vectorizable_shift (gimple *stmt, gimple
> bool scalar_shift_arg = true;
> bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> vec_info *vinfo = stmt_info->vinfo;
> - int vf;
>
> if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
> return false;
> @@ -4937,11 +4936,6 @@ vectorizable_shift (gimple *stmt, gimple
> return false;
> }
>
> - if (loop_vinfo)
> - vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
> - else
> - vf = 1;
> -
> /* Multiple types in SLP are handled by creating the appropriate number of
> vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in
> case of SLP. */
> @@ -5086,8 +5080,8 @@ vectorizable_shift (gimple *stmt, gimple
> "op not supported by target.\n");
> /* Check only during analysis. */
> if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
> - || (vf < vect_min_worthwhile_factor (code)
> - && !vec_stmt))
> + || (!vec_stmt
> + && !vect_worthwhile_without_simd_p (vinfo, code)))
> return false;
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -5095,9 +5089,9 @@ vectorizable_shift (gimple *stmt, gimple
> }
>
> /* Worthwhile without SIMD support? Check only during analysis. */
> - if (!VECTOR_MODE_P (TYPE_MODE (vectype))
> - && vf < vect_min_worthwhile_factor (code)
> - && !vec_stmt)
> + if (!vec_stmt
> + && !VECTOR_MODE_P (TYPE_MODE (vectype))
> + && !vect_worthwhile_without_simd_p (vinfo, code))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> @@ -5241,7 +5235,6 @@ vectorizable_operation (gimple *stmt, gi
> tree vop0, vop1, vop2;
> bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> vec_info *vinfo = stmt_info->vinfo;
> - int vf;
>
> if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
> return false;
> @@ -5368,11 +5361,6 @@ vectorizable_operation (gimple *stmt, gi
> }
> }
>
> - if (loop_vinfo)
> - vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
> - else
> - vf = 1;
> -
> /* Multiple types in SLP are handled by creating the appropriate number of
> vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in
> case of SLP. */
> @@ -5414,7 +5402,7 @@ vectorizable_operation (gimple *stmt, gi
> "op not supported by target.\n");
> /* Check only during analysis. */
> if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
> - || (!vec_stmt && vf < vect_min_worthwhile_factor (code)))
> + || (!vec_stmt && !vect_worthwhile_without_simd_p (vinfo, code)))
> return false;
> if (dump_enabled_p ())
> dump_printf_loc (MSG_NOTE, vect_location,
> @@ -5424,7 +5412,7 @@ vectorizable_operation (gimple *stmt, gi
> /* Worthwhile without SIMD support? Check only during analysis. */
> if (!VECTOR_MODE_P (vec_mode)
> && !vec_stmt
> - && vf < vect_min_worthwhile_factor (code))
> + && !vect_worthwhile_without_simd_p (vinfo, code))
> {
> if (dump_enabled_p ())
> dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,