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))