diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 07:16:22 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 07:16:22 +0000 |
commit | cf1b2ba4ea9ee4b27e341c3f704416dc77d7172f (patch) | |
tree | 17bb834b43110573e9272538071dae4523444139 /gcc | |
parent | c7bda0f40e1ddd9fc2c347fafeab93350be036f8 (diff) | |
download | gcc-cf1b2ba4ea9ee4b27e341c3f704416dc77d7172f.zip gcc-cf1b2ba4ea9ee4b27e341c3f704416dc77d7172f.tar.gz gcc-cf1b2ba4ea9ee4b27e341c3f704416dc77d7172f.tar.bz2 |
poly_int: vectorizable_simd_clone_call
This patch makes vectorizable_simd_clone_call cope with variable-length
vectors. For now we don't support SIMD clones for variable-length
vectors; this will be post GCC 8 material.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* tree-vect-stmts.c (simd_clone_subparts): New function.
(vectorizable_simd_clone_call): Use it instead of TYPE_VECTOR_SUBPARTS.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256138
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 44 |
2 files changed, 34 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9aded12..5379f03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,13 @@ Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> + * tree-vect-stmts.c (simd_clone_subparts): New function. + (vectorizable_simd_clone_call): Use it instead of TYPE_VECTOR_SUBPARTS. + +2018-01-03 Richard Sandiford <richard.sandiford@linaro.org> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + * tree-vect-stmts.c (vectorizable_call): Treat the number of vectors as polynomial. Use build_index_vector for IFN_GOMP_SIMD_LANE. diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 210632b..6035261 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -3219,6 +3219,16 @@ vect_simd_lane_linear (tree op, struct loop *loop, } } +/* Return the number of elements in vector type VECTYPE, which is associated + with a SIMD clone. At present these vectors always have a constant + length. */ + +static unsigned HOST_WIDE_INT +simd_clone_subparts (tree vectype) +{ + return TYPE_VECTOR_SUBPARTS (vectype); +} + /* Function vectorizable_simd_clone_call. Check if STMT performs a function call that can be vectorized @@ -3487,7 +3497,7 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, = get_vectype_for_scalar_type (TREE_TYPE (gimple_call_arg (stmt, i))); if (arginfo[i].vectype == NULL - || (TYPE_VECTOR_SUBPARTS (arginfo[i].vectype) + || (simd_clone_subparts (arginfo[i].vectype) > bestn->simdclone->simdlen)) return false; } @@ -3574,15 +3584,15 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, { case SIMD_CLONE_ARG_TYPE_VECTOR: atype = bestn->simdclone->args[i].vector_type; - o = nunits / TYPE_VECTOR_SUBPARTS (atype); + o = nunits / simd_clone_subparts (atype); for (m = j * o; m < (j + 1) * o; m++) { - if (TYPE_VECTOR_SUBPARTS (atype) - < TYPE_VECTOR_SUBPARTS (arginfo[i].vectype)) + if (simd_clone_subparts (atype) + < simd_clone_subparts (arginfo[i].vectype)) { unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (atype)); - k = (TYPE_VECTOR_SUBPARTS (arginfo[i].vectype) - / TYPE_VECTOR_SUBPARTS (atype)); + k = (simd_clone_subparts (arginfo[i].vectype) + / simd_clone_subparts (atype)); gcc_assert ((k & (k - 1)) == 0); if (m == 0) vec_oprnd0 @@ -3608,8 +3618,8 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, } else { - k = (TYPE_VECTOR_SUBPARTS (atype) - / TYPE_VECTOR_SUBPARTS (arginfo[i].vectype)); + k = (simd_clone_subparts (atype) + / simd_clone_subparts (arginfo[i].vectype)); gcc_assert ((k & (k - 1)) == 0); vec<constructor_elt, va_gc> *ctor_elts; if (k != 1) @@ -3727,11 +3737,11 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, new_stmt = gimple_build_call_vec (fndecl, vargs); if (vec_dest) { - gcc_assert (ratype || TYPE_VECTOR_SUBPARTS (rtype) == nunits); + gcc_assert (ratype || simd_clone_subparts (rtype) == nunits); if (ratype) new_temp = create_tmp_var (ratype); - else if (TYPE_VECTOR_SUBPARTS (vectype) - == TYPE_VECTOR_SUBPARTS (rtype)) + else if (simd_clone_subparts (vectype) + == simd_clone_subparts (rtype)) new_temp = make_ssa_name (vec_dest, new_stmt); else new_temp = make_ssa_name (rtype, new_stmt); @@ -3741,11 +3751,11 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, if (vec_dest) { - if (TYPE_VECTOR_SUBPARTS (vectype) < nunits) + if (simd_clone_subparts (vectype) < nunits) { unsigned int k, l; unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (vectype)); - k = nunits / TYPE_VECTOR_SUBPARTS (vectype); + k = nunits / simd_clone_subparts (vectype); gcc_assert ((k & (k - 1)) == 0); for (l = 0; l < k; l++) { @@ -3780,16 +3790,16 @@ vectorizable_simd_clone_call (gimple *stmt, gimple_stmt_iterator *gsi, } continue; } - else if (TYPE_VECTOR_SUBPARTS (vectype) > nunits) + else if (simd_clone_subparts (vectype) > nunits) { - unsigned int k = (TYPE_VECTOR_SUBPARTS (vectype) - / TYPE_VECTOR_SUBPARTS (rtype)); + unsigned int k = (simd_clone_subparts (vectype) + / simd_clone_subparts (rtype)); gcc_assert ((k & (k - 1)) == 0); if ((j & (k - 1)) == 0) vec_alloc (ret_ctor_elts, k); if (ratype) { - unsigned int m, o = nunits / TYPE_VECTOR_SUBPARTS (rtype); + unsigned int m, o = nunits / simd_clone_subparts (rtype); for (m = 0; m < o; m++) { tree tem = build4 (ARRAY_REF, rtype, new_temp, |