aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-02 18:26:56 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-02 18:26:56 +0000
commit736d0f28783f12fa042892bc186866dd5101088f (patch)
tree54c83634cd4ce7f8d3f8660188d476af4c271b1b /gcc
parente3342de49cbee48957acc749b9566eee230860be (diff)
downloadgcc-736d0f28783f12fa042892bc186866dd5101088f.zip
gcc-736d0f28783f12fa042892bc186866dd5101088f.tar.gz
gcc-736d0f28783f12fa042892bc186866dd5101088f.tar.bz2
Add a vec_perm_indices_to_tree helper function
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-ssa-forwprop.c5
-rw-r--r--gcc/tree-vect-slp.c8
-rw-r--r--gcc/tree-vect-stmts.c14
-rw-r--r--gcc/vec-perm-indices.c14
-rw-r--r--gcc/vec-perm-indices.h1
6 files changed, 28 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53782f0..7fc70c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
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.
* vec-perm-indices.h: Include int-vector-builder.h.
(vec_perm_indices): Redefine as an int_vector_builder.
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 41eef51..ff8d976 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -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
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index ca7827f..58177ec 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -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;
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index fed870e..8f26320 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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,
diff --git a/gcc/vec-perm-indices.c b/gcc/vec-perm-indices.c
index 3a35425..558ab2e 100644
--- a/gcc/vec-perm-indices.c
+++ b/gcc/vec-perm-indices.c
@@ -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. */
diff --git a/gcc/vec-perm-indices.h b/gcc/vec-perm-indices.h
index a366662..1048f55 100644
--- a/gcc/vec-perm-indices.h
+++ b/gcc/vec-perm-indices.h
@@ -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