diff mbox series

[081/nnn] poly_int: brig vector elements

Message ID 8760b5hirk.fsf@linaro.org
State New
Headers show
Series [081/nnn] poly_int: brig vector elements | expand

Commit Message

Richard Sandiford Oct. 23, 2017, 5:32 p.m. UTC
This patch adds a brig-specific wrapper around TYPE_VECTOR_SUBPARTS,
since presumably it will never need to support variable vector lengths.


2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/brig/
	* brigfrontend/brig-util.h (gccbrig_type_vector_subparts): New
	function.
	* brigfrontend/brig-basic-inst-handler.cc
	(brig_basic_inst_handler::build_shuffle): Use it instead of
	TYPE_VECTOR_SUBPARTS.
	(brig_basic_inst_handler::build_unpack): Likewise.
	(brig_basic_inst_handler::build_pack): Likewise.
	(brig_basic_inst_handler::build_unpack_lo_or_hi): Likewise.
	(brig_basic_inst_handler::operator ()): Likewise.
	(brig_basic_inst_handler::build_lower_element_broadcast): Likewise.
	* brigfrontend/brig-code-entry-handler.cc
	(brig_code_entry_handler::get_tree_cst_for_hsa_operand): Likewise.
	(brig_code_entry_handler::get_comparison_result_type): Likewise.
	(brig_code_entry_handler::expand_or_call_builtin): Likewise.

Comments

Pekka Jääskeläinen Oct. 24, 2017, 6:40 a.m. UTC | #1
Hi Richard,

Indeed, HSAIL doesn't so far support variable length vectors.
If it ever will, there will be wider changes needed anyways.

So, this patch LGTM.

Pekka,
A HSA/BRIG maintainer


On Mon, Oct 23, 2017 at 7:32 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> This patch adds a brig-specific wrapper around TYPE_VECTOR_SUBPARTS,

> since presumably it will never need to support variable vector lengths.

>

>

> 2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>

>             Alan Hayward  <alan.hayward@arm.com>

>             David Sherwood  <david.sherwood@arm.com>

>

> gcc/brig/

>         * brigfrontend/brig-util.h (gccbrig_type_vector_subparts): New

>         function.

>         * brigfrontend/brig-basic-inst-handler.cc

>         (brig_basic_inst_handler::build_shuffle): Use it instead of

>         TYPE_VECTOR_SUBPARTS.

>         (brig_basic_inst_handler::build_unpack): Likewise.

>         (brig_basic_inst_handler::build_pack): Likewise.

>         (brig_basic_inst_handler::build_unpack_lo_or_hi): Likewise.

>         (brig_basic_inst_handler::operator ()): Likewise.

>         (brig_basic_inst_handler::build_lower_element_broadcast): Likewise.

>         * brigfrontend/brig-code-entry-handler.cc

>         (brig_code_entry_handler::get_tree_cst_for_hsa_operand): Likewise.

>         (brig_code_entry_handler::get_comparison_result_type): Likewise.

>         (brig_code_entry_handler::expand_or_call_builtin): Likewise.

>

> Index: gcc/brig/brigfrontend/brig-util.h

> ===================================================================

> --- gcc/brig/brigfrontend/brig-util.h   2017-10-02 09:10:56.960755788 +0100

> +++ gcc/brig/brigfrontend/brig-util.h   2017-10-23 17:22:46.882758777 +0100

> @@ -76,4 +76,12 @@ bool gccbrig_might_be_host_defined_var_p

>  /* From hsa.h.  */

>  bool hsa_type_packed_p (BrigType16_t type);

>

> +/* Return the number of elements in a VECTOR_TYPE.  BRIG does not support

> +   variable-length vectors.  */

> +inline unsigned HOST_WIDE_INT

> +gccbrig_type_vector_subparts (const_tree type)

> +{

> +  return TYPE_VECTOR_SUBPARTS (type);

> +}

> +

>  #endif

> Index: gcc/brig/brigfrontend/brig-basic-inst-handler.cc

> ===================================================================

> --- gcc/brig/brigfrontend/brig-basic-inst-handler.cc    2017-08-10 14:36:07.092506123 +0100

> +++ gcc/brig/brigfrontend/brig-basic-inst-handler.cc    2017-10-23 17:22:46.882758777 +0100

> @@ -97,9 +97,10 @@ brig_basic_inst_handler::build_shuffle (

>       output elements can originate from any input element.  */

>    vec<constructor_elt, va_gc> *mask_offset_vals = NULL;

>

> +  unsigned int element_count = gccbrig_type_vector_subparts (arith_type);

> +

>    vec<constructor_elt, va_gc> *input_mask_vals = NULL;

> -  size_t input_mask_element_size

> -    = exact_log2 (TYPE_VECTOR_SUBPARTS (arith_type));

> +  size_t input_mask_element_size = exact_log2 (element_count);

>

>    /* Unpack the tightly packed mask elements to BIT_FIELD_REFs

>       from which to construct the mask vector as understood by

> @@ -109,7 +110,7 @@ brig_basic_inst_handler::build_shuffle (

>    tree mask_element_type

>      = build_nonstandard_integer_type (input_mask_element_size, true);

>

> -  for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)

> +  for (size_t i = 0; i < element_count; ++i)

>      {

>        tree mask_element

>         = build3 (BIT_FIELD_REF, mask_element_type, mask_operand,

> @@ -119,17 +120,15 @@ brig_basic_inst_handler::build_shuffle (

>        mask_element = convert (element_type, mask_element);

>

>        tree offset;

> -      if (i < TYPE_VECTOR_SUBPARTS (arith_type) / 2)

> +      if (i < element_count / 2)

>         offset = build_int_cst (element_type, 0);

>        else

> -       offset

> -         = build_int_cst (element_type, TYPE_VECTOR_SUBPARTS (arith_type));

> +       offset = build_int_cst (element_type, element_count);

>

>        CONSTRUCTOR_APPEND_ELT (mask_offset_vals, NULL_TREE, offset);

>        CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE, mask_element);

>      }

> -  tree mask_vec_type

> -    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));

> +  tree mask_vec_type = build_vector_type (element_type, element_count);

>

>    tree mask_vec = build_constructor (mask_vec_type, input_mask_vals);

>    tree offset_vec = build_constructor (mask_vec_type, mask_offset_vals);

> @@ -158,7 +157,8 @@ brig_basic_inst_handler::build_unpack (t

>    vec<constructor_elt, va_gc> *input_mask_vals = NULL;

>    vec<constructor_elt, va_gc> *and_mask_vals = NULL;

>

> -  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));

> +  size_t element_count

> +    = gccbrig_type_vector_subparts (TREE_TYPE (operands[0]));

>    tree vec_type = build_vector_type (element_type, element_count);

>

>    for (size_t i = 0; i < element_count; ++i)

> @@ -213,7 +213,7 @@ brig_basic_inst_handler::build_pack (tre

>       TODO: Reuse this for implementing 'bitinsert'

>       without a builtin call.  */

>

> -  size_t ecount = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));

> +  size_t ecount = gccbrig_type_vector_subparts (TREE_TYPE (operands[0]));

>    size_t vecsize = int_size_in_bytes (TREE_TYPE (operands[0])) * BITS_PER_UNIT;

>    tree wide_type = build_nonstandard_integer_type (vecsize, 1);

>

> @@ -275,9 +275,10 @@ brig_basic_inst_handler::build_unpack_lo

>  {

>    tree element_type = get_unsigned_int_type (TREE_TYPE (arith_type));

>    tree mask_vec_type

> -    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));

> +    = build_vector_type (element_type,

> +                        gccbrig_type_vector_subparts (arith_type));

>

> -  size_t element_count = TYPE_VECTOR_SUBPARTS (arith_type);

> +  size_t element_count = gccbrig_type_vector_subparts (arith_type);

>    vec<constructor_elt, va_gc> *input_mask_vals = NULL;

>

>    size_t offset = (brig_opcode == BRIG_OPCODE_UNPACKLO) ? 0 : element_count / 2;

> @@ -600,8 +601,8 @@ brig_basic_inst_handler::operator () (co

>         }

>

>        size_t promoted_type_size = int_size_in_bytes (promoted_type) * 8;

> -

> -      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)

> +      size_t element_count = gccbrig_type_vector_subparts (arith_type);

> +      for (size_t i = 0; i < element_count; ++i)

>         {

>           tree operand0 = convert (promoted_type, operand0_elements.at (i));

>           tree operand1 = convert (promoted_type, operand1_elements.at (i));

> @@ -708,7 +709,8 @@ brig_basic_inst_handler::build_lower_ele

>    tree element_type = TREE_TYPE (TREE_TYPE (vec_operand));

>    size_t esize = 8 * int_size_in_bytes (element_type);

>

> -  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec_operand));

> +  size_t element_count

> +    = gccbrig_type_vector_subparts (TREE_TYPE (vec_operand));

>    tree mask_inner_type = build_nonstandard_integer_type (esize, 1);

>    vec<constructor_elt, va_gc> *constructor_vals = NULL;

>

> Index: gcc/brig/brigfrontend/brig-code-entry-handler.cc

> ===================================================================

> --- gcc/brig/brigfrontend/brig-code-entry-handler.cc    2017-10-02 09:10:56.960755788 +0100

> +++ gcc/brig/brigfrontend/brig-code-entry-handler.cc    2017-10-23 17:22:46.882758777 +0100

> @@ -641,7 +641,8 @@ brig_code_entry_handler::get_tree_cst_fo

>         {

>           /* In case of vector type elements (or sole vectors),

>              create a vector ctor.  */

> -         size_t element_count = TYPE_VECTOR_SUBPARTS (tree_element_type);

> +         size_t element_count

> +           = gccbrig_type_vector_subparts (tree_element_type);

>           if (bytes_left < scalar_element_size * element_count)

>             fatal_error (UNKNOWN_LOCATION,

>                          "Not enough bytes left for the initializer "

> @@ -844,7 +845,7 @@ brig_code_entry_handler::get_comparison_

>        size_t element_size = int_size_in_bytes (TREE_TYPE (source_type));

>        return build_vector_type

>         (build_nonstandard_boolean_type (element_size * BITS_PER_UNIT),

> -        TYPE_VECTOR_SUBPARTS (source_type));

> +        gccbrig_type_vector_subparts (source_type));

>      }

>    else

>      return gccbrig_tree_type_for_hsa_type (BRIG_TYPE_B1);

> @@ -949,7 +950,8 @@ brig_code_entry_handler::expand_or_call_

>

>        tree_stl_vec result_elements;

>

> -      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)

> +      size_t element_count = gccbrig_type_vector_subparts (arith_type);

> +      for (size_t i = 0; i < element_count; ++i)

>         {

>           tree_stl_vec call_operands;

>           if (operand0_elements.size () > 0)
diff mbox series

Patch

Index: gcc/brig/brigfrontend/brig-util.h
===================================================================
--- gcc/brig/brigfrontend/brig-util.h	2017-10-02 09:10:56.960755788 +0100
+++ gcc/brig/brigfrontend/brig-util.h	2017-10-23 17:22:46.882758777 +0100
@@ -76,4 +76,12 @@  bool gccbrig_might_be_host_defined_var_p
 /* From hsa.h.  */
 bool hsa_type_packed_p (BrigType16_t type);
 
+/* Return the number of elements in a VECTOR_TYPE.  BRIG does not support
+   variable-length vectors.  */
+inline unsigned HOST_WIDE_INT
+gccbrig_type_vector_subparts (const_tree type)
+{
+  return TYPE_VECTOR_SUBPARTS (type);
+}
+
 #endif
Index: gcc/brig/brigfrontend/brig-basic-inst-handler.cc
===================================================================
--- gcc/brig/brigfrontend/brig-basic-inst-handler.cc	2017-08-10 14:36:07.092506123 +0100
+++ gcc/brig/brigfrontend/brig-basic-inst-handler.cc	2017-10-23 17:22:46.882758777 +0100
@@ -97,9 +97,10 @@  brig_basic_inst_handler::build_shuffle (
      output elements can originate from any input element.  */
   vec<constructor_elt, va_gc> *mask_offset_vals = NULL;
 
+  unsigned int element_count = gccbrig_type_vector_subparts (arith_type);
+
   vec<constructor_elt, va_gc> *input_mask_vals = NULL;
-  size_t input_mask_element_size
-    = exact_log2 (TYPE_VECTOR_SUBPARTS (arith_type));
+  size_t input_mask_element_size = exact_log2 (element_count);
 
   /* Unpack the tightly packed mask elements to BIT_FIELD_REFs
      from which to construct the mask vector as understood by
@@ -109,7 +110,7 @@  brig_basic_inst_handler::build_shuffle (
   tree mask_element_type
     = build_nonstandard_integer_type (input_mask_element_size, true);
 
-  for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+  for (size_t i = 0; i < element_count; ++i)
     {
       tree mask_element
 	= build3 (BIT_FIELD_REF, mask_element_type, mask_operand,
@@ -119,17 +120,15 @@  brig_basic_inst_handler::build_shuffle (
       mask_element = convert (element_type, mask_element);
 
       tree offset;
-      if (i < TYPE_VECTOR_SUBPARTS (arith_type) / 2)
+      if (i < element_count / 2)
 	offset = build_int_cst (element_type, 0);
       else
-	offset
-	  = build_int_cst (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+	offset = build_int_cst (element_type, element_count);
 
       CONSTRUCTOR_APPEND_ELT (mask_offset_vals, NULL_TREE, offset);
       CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE, mask_element);
     }
-  tree mask_vec_type
-    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+  tree mask_vec_type = build_vector_type (element_type, element_count);
 
   tree mask_vec = build_constructor (mask_vec_type, input_mask_vals);
   tree offset_vec = build_constructor (mask_vec_type, mask_offset_vals);
@@ -158,7 +157,8 @@  brig_basic_inst_handler::build_unpack (t
   vec<constructor_elt, va_gc> *input_mask_vals = NULL;
   vec<constructor_elt, va_gc> *and_mask_vals = NULL;
 
-  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));
+  size_t element_count
+    = gccbrig_type_vector_subparts (TREE_TYPE (operands[0]));
   tree vec_type = build_vector_type (element_type, element_count);
 
   for (size_t i = 0; i < element_count; ++i)
@@ -213,7 +213,7 @@  brig_basic_inst_handler::build_pack (tre
      TODO: Reuse this for implementing 'bitinsert'
      without a builtin call.  */
 
-  size_t ecount = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0]));
+  size_t ecount = gccbrig_type_vector_subparts (TREE_TYPE (operands[0]));
   size_t vecsize = int_size_in_bytes (TREE_TYPE (operands[0])) * BITS_PER_UNIT;
   tree wide_type = build_nonstandard_integer_type (vecsize, 1);
 
@@ -275,9 +275,10 @@  brig_basic_inst_handler::build_unpack_lo
 {
   tree element_type = get_unsigned_int_type (TREE_TYPE (arith_type));
   tree mask_vec_type
-    = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type));
+    = build_vector_type (element_type,
+			 gccbrig_type_vector_subparts (arith_type));
 
-  size_t element_count = TYPE_VECTOR_SUBPARTS (arith_type);
+  size_t element_count = gccbrig_type_vector_subparts (arith_type);
   vec<constructor_elt, va_gc> *input_mask_vals = NULL;
 
   size_t offset = (brig_opcode == BRIG_OPCODE_UNPACKLO) ? 0 : element_count / 2;
@@ -600,8 +601,8 @@  brig_basic_inst_handler::operator () (co
 	}
 
       size_t promoted_type_size = int_size_in_bytes (promoted_type) * 8;
-
-      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+      size_t element_count = gccbrig_type_vector_subparts (arith_type);
+      for (size_t i = 0; i < element_count; ++i)
 	{
 	  tree operand0 = convert (promoted_type, operand0_elements.at (i));
 	  tree operand1 = convert (promoted_type, operand1_elements.at (i));
@@ -708,7 +709,8 @@  brig_basic_inst_handler::build_lower_ele
   tree element_type = TREE_TYPE (TREE_TYPE (vec_operand));
   size_t esize = 8 * int_size_in_bytes (element_type);
 
-  size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec_operand));
+  size_t element_count
+    = gccbrig_type_vector_subparts (TREE_TYPE (vec_operand));
   tree mask_inner_type = build_nonstandard_integer_type (esize, 1);
   vec<constructor_elt, va_gc> *constructor_vals = NULL;
 
Index: gcc/brig/brigfrontend/brig-code-entry-handler.cc
===================================================================
--- gcc/brig/brigfrontend/brig-code-entry-handler.cc	2017-10-02 09:10:56.960755788 +0100
+++ gcc/brig/brigfrontend/brig-code-entry-handler.cc	2017-10-23 17:22:46.882758777 +0100
@@ -641,7 +641,8 @@  brig_code_entry_handler::get_tree_cst_fo
 	{
 	  /* In case of vector type elements (or sole vectors),
 	     create a vector ctor.  */
-	  size_t element_count = TYPE_VECTOR_SUBPARTS (tree_element_type);
+	  size_t element_count
+	    = gccbrig_type_vector_subparts (tree_element_type);
 	  if (bytes_left < scalar_element_size * element_count)
 	    fatal_error (UNKNOWN_LOCATION,
 			 "Not enough bytes left for the initializer "
@@ -844,7 +845,7 @@  brig_code_entry_handler::get_comparison_
       size_t element_size = int_size_in_bytes (TREE_TYPE (source_type));
       return build_vector_type
 	(build_nonstandard_boolean_type (element_size * BITS_PER_UNIT),
-	 TYPE_VECTOR_SUBPARTS (source_type));
+	 gccbrig_type_vector_subparts (source_type));
     }
   else
     return gccbrig_tree_type_for_hsa_type (BRIG_TYPE_B1);
@@ -949,7 +950,8 @@  brig_code_entry_handler::expand_or_call_
 
       tree_stl_vec result_elements;
 
-      for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i)
+      size_t element_count = gccbrig_type_vector_subparts (arith_type);
+      for (size_t i = 0; i < element_count; ++i)
 	{
 	  tree_stl_vec call_operands;
 	  if (operand0_elements.size () > 0)