For now, vect_get_constant_vectors can only cope with constant-length
vectors, although a patch after the main SVE submission relaxes this.
This patch adds an appropriate guard for variable-length vectors.
The TYPE_VECTOR_SUBPARTS use in vect_get_constant_vectors will then
have a to_constant call when TYPE_VECTOR_SUBPARTS becomes a poly_int.


2017-10-23  Richard Sandiford  <richard.sandif...@linaro.org>
            Alan Hayward  <alan.hayw...@arm.com>
            David Sherwood  <david.sherw...@arm.com>

gcc/
        * tree-vect-slp.c (vect_get_and_check_slp_defs): Reject
        constant and extern definitions for variable-length vectors.
        (vect_get_constant_vectors): Note that the number of units
        is known to be constant.

Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c 2017-10-23 17:22:32.728227020 +0100
+++ gcc/tree-vect-slp.c 2017-10-23 17:22:42.827179461 +0100
@@ -403,6 +403,20 @@ vect_get_and_check_slp_defs (vec_info *v
        {
        case vect_constant_def:
        case vect_external_def:
+         /* We must already have set a vector size by now.  */
+         gcc_checking_assert (maybe_nonzero (current_vector_size));
+         if (!current_vector_size.is_constant ())
+           {
+             if (dump_enabled_p ())
+               {
+                 dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                                  "Build SLP failed: invalid type of def "
+                                  "for variable-length SLP ");
+                 dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM, oprnd);
+                 dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
+               }
+             return -1;
+           }
          break;
 
        case vect_reduction_def:
@@ -3219,6 +3233,7 @@ vect_get_constant_vectors (tree op, slp_
       = build_same_sized_truth_vector_type (STMT_VINFO_VECTYPE (stmt_vinfo));
   else
     vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
+  /* Enforced by vect_get_and_check_slp_defs.  */
   nunits = TYPE_VECTOR_SUBPARTS (vector_type);
 
   if (STMT_VINFO_DATA_REF (stmt_vinfo))

Reply via email to