Message ID | 87shfpwmm3.fsf@linaro.org |
---|---|
State | Accepted |
Commit | ca09abcb399bcb8cddbda68c75e702cc8989a6ca |
Headers | show |
Series | Add a vect_worthwhile_without_simd_p helper routine | expand |
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,
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,