Add a vec_perm_indices_to_tree helper function
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 2 Jan 2018 18:26:56 +0000 (18:26 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 2 Jan 2018 18:26:56 +0000 (18:26 +0000)
This patch adds a function for creating a VECTOR_CST from a
vec_perm_indices, operating directly on the encoding.

2018-01-02  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* vec-perm-indices.h (vec_perm_indices_to_tree): Declare.
* vec-perm-indices.c (vec_perm_indices_to_tree): New function.
* tree-ssa-forwprop.c (simplify_vector_constructor): Use it.
* tree-vect-slp.c (vect_transform_slp_perm_load): Likewise.
* tree-vect-stmts.c (vectorizable_bswap): Likewise.
(vect_gen_perm_mask_any): Likewise.

From-SVN: r256096

gcc/ChangeLog
gcc/tree-ssa-forwprop.c
gcc/tree-vect-slp.c
gcc/tree-vect-stmts.c
gcc/vec-perm-indices.c
gcc/vec-perm-indices.h

index 53782f0c115aed92fde472676b479598b14ef6ed..7fc70c00cfd81b72e92d9eb5eaedeb7840ac9bcb 100644 (file)
@@ -1,3 +1,12 @@
+2018-01-02  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * vec-perm-indices.h (vec_perm_indices_to_tree): Declare.
+       * vec-perm-indices.c (vec_perm_indices_to_tree): New function.
+       * tree-ssa-forwprop.c (simplify_vector_constructor): Use it.
+       * tree-vect-slp.c (vect_transform_slp_perm_load): Likewise.
+       * tree-vect-stmts.c (vectorizable_bswap): Likewise.
+       (vect_gen_perm_mask_any): Likewise.
+
 2018-01-02  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * int-vector-builder.h: New file.
index 41eef51f3e076efadd224a41e1bdfb28cdb2a2c0..ff8d976338b9b68190bf87c2567c267d8c55edcc 100644 (file)
@@ -2119,10 +2119,7 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
          || GET_MODE_SIZE (TYPE_MODE (mask_type))
             != GET_MODE_SIZE (TYPE_MODE (type)))
        return false;
-      tree_vector_builder mask_elts (mask_type, nelts, 1);
-      for (i = 0; i < nelts; i++)
-       mask_elts.quick_push (build_int_cst (TREE_TYPE (mask_type), sel[i]));
-      op2 = mask_elts.build ();
+      op2 = vec_perm_indices_to_tree (mask_type, indices);
       if (conv_code == ERROR_MARK)
        gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig, orig, op2);
       else
index ca7827f51bec0eab752241ad982b946a71d77bb8..58177ec7d1772592b2d3701bfa0016f73bfbcf2d 100644 (file)
@@ -3675,13 +3675,7 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
                  tree mask_vec = NULL_TREE;
                  
                  if (! noop_p)
-                   {
-                     tree_vector_builder mask_elts (mask_type, nunits, 1);
-                     for (int l = 0; l < nunits; ++l)
-                       mask_elts.quick_push (build_int_cst (mask_element_type,
-                                                            mask[l]));
-                     mask_vec = mask_elts.build ();
-                   }
+                   mask_vec = vec_perm_indices_to_tree (mask_type, indices);
 
                  if (second_vec_index == -1)
                    second_vec_index = first_vec_index;
index fed870ea5f63096770e435874189f09369befe7f..8f26320f01803eb62d4266d1cac1373d4f485fd7 100644 (file)
@@ -2529,10 +2529,7 @@ vectorizable_bswap (gimple *stmt, gimple_stmt_iterator *gsi,
       return true;
     }
 
-  tree_vector_builder telts (char_vectype, num_bytes, 1);
-  for (unsigned i = 0; i < num_bytes; ++i)
-    telts.quick_push (build_int_cst (char_type_node, elts[i]));
-  tree bswap_vconst = telts.build ();
+  tree bswap_vconst = vec_perm_indices_to_tree (char_vectype, indices);
 
   /* Transform.  */
   vec<tree> vec_oprnds = vNULL;
@@ -6538,17 +6535,10 @@ vect_gen_perm_mask_any (tree vectype, const vec_perm_indices &sel)
 {
   tree mask_elt_type, mask_type;
 
-  unsigned int nunits = sel.length ();
-  gcc_checking_assert (nunits == TYPE_VECTOR_SUBPARTS (vectype));
-
   mask_elt_type = lang_hooks.types.type_for_mode
     (int_mode_for_mode (TYPE_MODE (TREE_TYPE (vectype))).require (), 1);
   mask_type = get_vectype_for_scalar_type (mask_elt_type);
-
-  tree_vector_builder mask_elts (mask_type, nunits, 1);
-  for (unsigned int i = 0; i < nunits; ++i)
-    mask_elts.quick_push (build_int_cst (mask_elt_type, sel[i]));
-  return mask_elts.build ();
+  return vec_perm_indices_to_tree (mask_type, sel);
 }
 
 /* Checked version of vect_gen_perm_mask_any.  Asserts can_vec_perm_const_p,
index 3a35425bee211223e9e22da3b7e28cada896c187..558ab2efcf2bf30cec5737747e4cae154eb5a920 100644 (file)
@@ -152,6 +152,20 @@ tree_to_vec_perm_builder (vec_perm_builder *builder, tree cst)
   return true;
 }
 
+/* Return a VECTOR_CST of type TYPE for the permutation vector in INDICES.  */
+
+tree
+vec_perm_indices_to_tree (tree type, const vec_perm_indices &indices)
+{
+  gcc_assert (TYPE_VECTOR_SUBPARTS (type) == indices.length ());
+  tree_vector_builder sel (type, indices.encoding ().npatterns (),
+                          indices.encoding ().nelts_per_pattern ());
+  unsigned int encoded_nelts = sel.encoded_nelts ();
+  for (unsigned int i = 0; i < encoded_nelts; i++)
+    sel.quick_push (build_int_cst (TREE_TYPE (type), indices[i]));
+  return sel.build ();
+}
+
 /* Return a CONST_VECTOR of mode MODE that contains the elements of
    INDICES.  */
 
index a36666298ccfcab43978e223ee6fbb98b5a241e9..1048f558d97c6e07a2f60e1f5515aa383fd76725 100644 (file)
@@ -88,6 +88,7 @@ private:
 };
 
 bool tree_to_vec_perm_builder (vec_perm_builder *, tree);
+tree vec_perm_indices_to_tree (tree, const vec_perm_indices &);
 rtx vec_perm_indices_to_rtx (machine_mode, const vec_perm_indices &);
 
 inline