Re: [101/nnn] poly_int: GET_MODE_NUNITS

2017-12-05 Thread Jeff Law
On 10/23/2017 11:41 AM, Richard Sandiford wrote:
> This patch changes GET_MODE_NUNITS from unsigned char
> to poly_uint16, although it remains a macro when compiling
> target code with NUM_POLY_INT_COEFFS == 1.
> 
> If the number of units isn't known at compile time, we use:
> 
>   (const:M (vec_duplicate:M X))
> 
> to represent a vector in which every element is equal to X.  The code
> ensures that there is only a single instance of each constant, so that
> pointer equality is enough.  (This is a requirement for the constants
> that go in const_tiny_rtx, but we might as well do it for all constants.)
> 
> Similarly we use:
> 
>   (const:M (vec_series:M A B))
> 
> for a linear series starting at A and having step B.
> 
> The to_constant call in make_vector_type goes away in a later patch.
> 
> 
> 2017-10-23  Richard Sandiford  
>   Alan Hayward  
>   David Sherwood  
> 
> gcc/
>   * machmode.h (mode_nunits): Change from unsigned char to
>   poly_uint16_pod.
>   (ONLY_FIXED_SIZE_MODES): New macro.
>   (pod_mode::measurement_type, scalar_int_mode::measurement_type)
>   (scalar_float_mode::measurement_type, scalar_mode::measurement_type)
>   (complex_mode::measurement_type, fixed_size_mode::measurement_type):
>   New typedefs.
>   (mode_to_nunits): Return a poly_uint16 rather than an unsigned short.
>   (GET_MODE_NUNITS): Return a constant if ONLY_FIXED_SIZE_MODES,
>   or if measurement_type is not polynomial.
>   * genmodes.c (ZERO_COEFFS): New macro.
>   (emit_mode_nunits_inline): Make mode_nunits_inline return a
>   poly_uint16.
>   (emit_mode_nunits): Change the type of mode_nunits to poly_uint16_pod.
>   Use ZERO_COEFFS when emitting initializers.
>   * data-streamer.h (bp_pack_poly_value): New function.
>   (bp_unpack_poly_value): Likewise.
>   * lto-streamer-in.c (lto_input_mode_table): Use bp_unpack_poly_value
>   for GET_MODE_NUNITS.
>   * lto-streamer-out.c (lto_write_mode_table): Use bp_pack_poly_value
>   for GET_MODE_NUNITS.
>   * tree.c (make_vector_type): Remove temporary shim and make
>   the real function take the number of units as a poly_uint64
>   rather than an int.
>   (build_vector_type_for_mode): Handle polynomial nunits.
>   * emit-rtl.c (gen_const_vec_duplicate_1): Likewise.
>   (gen_const_vec_series, gen_rtx_CONST_VECTOR): Likewise.
>   * genrecog.c (validate_pattern): Likewise.
>   * optabs-query.c (can_mult_highpart_p): Likewise.
>   * optabs-tree.c (expand_vec_cond_expr_p): Likewise.
>   * optabs.c (expand_vector_broadcast, expand_binop_directly)
>   (shift_amt_for_vec_perm_mask, expand_vec_perm, expand_vec_cond_expr)
>   (expand_mult_highpart): Likewise.
>   * rtlanal.c (subreg_get_info): Likewise.
>   * simplify-rtx.c (simplify_unary_operation_1): Likewise.
>   (simplify_const_unary_operation, simplify_binary_operation_1)
>   (simplify_const_binary_operation, simplify_ternary_operation)
>   (test_vector_ops_duplicate, test_vector_ops): Likewise.
>   * tree-vect-data-refs.c (vect_grouped_store_supported): Likewise.
>   (vect_grouped_load_supported): Likewise.
>   * tree-vect-generic.c (type_for_widest_vector_mode): Likewise.
>   * tree-vect-loop.c (have_whole_vector_shift): Likewise.
> 
> gcc/ada/
>   * gcc-interface/misc.c (enumerate_modes): Handle polynomial
>   GET_MODE_NUNITS.
OK.
jeff


[101/nnn] poly_int: GET_MODE_NUNITS

2017-10-23 Thread Richard Sandiford
This patch changes GET_MODE_NUNITS from unsigned char
to poly_uint16, although it remains a macro when compiling
target code with NUM_POLY_INT_COEFFS == 1.

If the number of units isn't known at compile time, we use:

  (const:M (vec_duplicate:M X))

to represent a vector in which every element is equal to X.  The code
ensures that there is only a single instance of each constant, so that
pointer equality is enough.  (This is a requirement for the constants
that go in const_tiny_rtx, but we might as well do it for all constants.)

Similarly we use:

  (const:M (vec_series:M A B))

for a linear series starting at A and having step B.

The to_constant call in make_vector_type goes away in a later patch.


2017-10-23  Richard Sandiford  
Alan Hayward  
David Sherwood  

gcc/
* machmode.h (mode_nunits): Change from unsigned char to
poly_uint16_pod.
(ONLY_FIXED_SIZE_MODES): New macro.
(pod_mode::measurement_type, scalar_int_mode::measurement_type)
(scalar_float_mode::measurement_type, scalar_mode::measurement_type)
(complex_mode::measurement_type, fixed_size_mode::measurement_type):
New typedefs.
(mode_to_nunits): Return a poly_uint16 rather than an unsigned short.
(GET_MODE_NUNITS): Return a constant if ONLY_FIXED_SIZE_MODES,
or if measurement_type is not polynomial.
* genmodes.c (ZERO_COEFFS): New macro.
(emit_mode_nunits_inline): Make mode_nunits_inline return a
poly_uint16.
(emit_mode_nunits): Change the type of mode_nunits to poly_uint16_pod.
Use ZERO_COEFFS when emitting initializers.
* data-streamer.h (bp_pack_poly_value): New function.
(bp_unpack_poly_value): Likewise.
* lto-streamer-in.c (lto_input_mode_table): Use bp_unpack_poly_value
for GET_MODE_NUNITS.
* lto-streamer-out.c (lto_write_mode_table): Use bp_pack_poly_value
for GET_MODE_NUNITS.
* tree.c (make_vector_type): Remove temporary shim and make
the real function take the number of units as a poly_uint64
rather than an int.
(build_vector_type_for_mode): Handle polynomial nunits.
* emit-rtl.c (gen_const_vec_duplicate_1): Likewise.
(gen_const_vec_series, gen_rtx_CONST_VECTOR): Likewise.
* genrecog.c (validate_pattern): Likewise.
* optabs-query.c (can_mult_highpart_p): Likewise.
* optabs-tree.c (expand_vec_cond_expr_p): Likewise.
* optabs.c (expand_vector_broadcast, expand_binop_directly)
(shift_amt_for_vec_perm_mask, expand_vec_perm, expand_vec_cond_expr)
(expand_mult_highpart): Likewise.
* rtlanal.c (subreg_get_info): Likewise.
* simplify-rtx.c (simplify_unary_operation_1): Likewise.
(simplify_const_unary_operation, simplify_binary_operation_1)
(simplify_const_binary_operation, simplify_ternary_operation)
(test_vector_ops_duplicate, test_vector_ops): Likewise.
* tree-vect-data-refs.c (vect_grouped_store_supported): Likewise.
(vect_grouped_load_supported): Likewise.
* tree-vect-generic.c (type_for_widest_vector_mode): Likewise.
* tree-vect-loop.c (have_whole_vector_shift): Likewise.

gcc/ada/
* gcc-interface/misc.c (enumerate_modes): Handle polynomial
GET_MODE_NUNITS.

Index: gcc/machmode.h
===
--- gcc/machmode.h  2017-10-23 17:11:54.535862371 +0100
+++ gcc/machmode.h  2017-10-23 17:25:48.620492005 +0100
@@ -25,7 +25,7 @@ typedef opt_mode opt_machi
 extern CONST_MODE_SIZE unsigned short mode_size[NUM_MACHINE_MODES];
 extern const unsigned short mode_precision[NUM_MACHINE_MODES];
 extern const unsigned char mode_inner[NUM_MACHINE_MODES];
-extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
+extern const poly_uint16_pod mode_nunits[NUM_MACHINE_MODES];
 extern CONST_MODE_UNIT_SIZE unsigned char mode_unit_size[NUM_MACHINE_MODES];
 extern const unsigned short mode_unit_precision[NUM_MACHINE_MODES];
 extern const unsigned char mode_wider[NUM_MACHINE_MODES];
@@ -76,6 +76,14 @@ struct mode_traits
   typedef machine_mode from_int;
 };
 
+/* Always treat machine modes as fixed-size while compiling code specific
+   to targets that have no variable-size modes.  */
+#if defined (IN_TARGET_CODE) && NUM_POLY_INT_COEFFS == 1
+#define ONLY_FIXED_SIZE_MODES 1
+#else
+#define ONLY_FIXED_SIZE_MODES 0
+#endif
+
 /* Get the name of mode MODE as a string.  */
 
 extern const char * const mode_name[NUM_MACHINE_MODES];
@@ -313,6 +321,7 @@ opt_mode::exists (U *mode) const
 struct pod_mode
 {
   typedef typename mode_traits::from_int from_int;
+  typedef typename T::measurement_type measurement_type;
 
   machine_mode m_mode;
   ALWAYS_INLINE operator machine_mode () const { return m_mode; }
@@ -391,6 +400,7 @@ is_a (machine_mode m, U *result)
 {