This patch makes TARGET_GET_MASK_MODE take polynomial nunits and vector_size arguments. The gcc_assert in default_get_mask_mode is now handled by the exact_div call in vector_element_size.
2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * target.def (get_mask_mode): Take the number of units and length as poly_uint64s rather than unsigned ints. * targhooks.h (default_get_mask_mode): Update accordingly. * targhooks.c (default_get_mask_mode): Likewise. * config/i386/i386.c (ix86_get_mask_mode): Likewise. * doc/tm.texi: Regenerate. Index: gcc/target.def =================================================================== --- gcc/target.def 2017-10-23 17:19:01.411170305 +0100 +++ gcc/target.def 2017-10-23 17:22:30.980383601 +0100 @@ -1901,7 +1901,7 @@ The default implementation returns the m is @var{length} bytes long and that contains @var{nunits} elements,\n\ if such a mode exists.", opt_machine_mode, - (unsigned nunits, unsigned length), + (poly_uint64 nunits, poly_uint64 length), default_get_mask_mode) /* Target builtin that implements vector gather operation. */ Index: gcc/targhooks.h =================================================================== --- gcc/targhooks.h 2017-10-23 17:19:01.411170305 +0100 +++ gcc/targhooks.h 2017-10-23 17:22:30.980383601 +0100 @@ -107,7 +107,7 @@ default_builtin_support_vector_misalignm int, bool); extern machine_mode default_preferred_simd_mode (scalar_mode mode); extern unsigned int default_autovectorize_vector_sizes (void); -extern opt_machine_mode default_get_mask_mode (unsigned, unsigned); +extern opt_machine_mode default_get_mask_mode (poly_uint64, poly_uint64); extern void *default_init_cost (struct loop *); extern unsigned default_add_stmt_cost (void *, int, enum vect_cost_for_stmt, struct _stmt_vec_info *, int, Index: gcc/targhooks.c =================================================================== --- gcc/targhooks.c 2017-10-23 17:19:01.411170305 +0100 +++ gcc/targhooks.c 2017-10-23 17:22:30.980383601 +0100 @@ -1254,17 +1254,17 @@ default_autovectorize_vector_sizes (void return 0; } -/* By defaults a vector of integers is used as a mask. */ +/* By default a vector of integers is used as a mask. */ opt_machine_mode -default_get_mask_mode (unsigned nunits, unsigned vector_size) +default_get_mask_mode (poly_uint64 nunits, poly_uint64 vector_size) { - unsigned elem_size = vector_size / nunits; + unsigned int elem_size = vector_element_size (vector_size, nunits); scalar_int_mode elem_mode = smallest_int_mode_for_size (elem_size * BITS_PER_UNIT); machine_mode vector_mode; - gcc_assert (elem_size * nunits == vector_size); + gcc_assert (must_eq (elem_size * nunits, vector_size)); if (mode_for_vector (elem_mode, nunits).exists (&vector_mode) && VECTOR_MODE_P (vector_mode) Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c 2017-10-23 17:19:01.404170211 +0100 +++ gcc/config/i386/i386.c 2017-10-23 17:22:30.978383200 +0100 @@ -48121,7 +48121,7 @@ ix86_autovectorize_vector_sizes (void) /* Implemenation of targetm.vectorize.get_mask_mode. */ static opt_machine_mode -ix86_get_mask_mode (unsigned nunits, unsigned vector_size) +ix86_get_mask_mode (poly_uint64 nunits, poly_uint64 vector_size) { unsigned elem_size = vector_size / nunits; Index: gcc/doc/tm.texi =================================================================== --- gcc/doc/tm.texi 2017-10-23 17:19:01.408170265 +0100 +++ gcc/doc/tm.texi 2017-10-23 17:22:30.979383401 +0100 @@ -5846,7 +5846,7 @@ mode returned by @code{TARGET_VECTORIZE_ The default is zero which means to not iterate over other vector sizes. @end deftypefn -@deftypefn {Target Hook} opt_machine_mode TARGET_VECTORIZE_GET_MASK_MODE (unsigned @var{nunits}, unsigned @var{length}) +@deftypefn {Target Hook} opt_machine_mode TARGET_VECTORIZE_GET_MASK_MODE (poly_uint64 @var{nunits}, poly_uint64 @var{length}) A vector mask is a value that holds one boolean result for every element in a vector. This hook returns the machine mode that should be used to represent such a mask when the vector in question is @var{length} bytes