I did run into an ICE with a single element vector triggered by dividing the number of elements by 2 with exact_div here:
tree-vect-data-refs.c:5132 else { /* If length is not equal to 3 then only power of 2 is supported. */ gcc_assert (pow2p_hwi (count)); poly_uint64 nelt = GET_MODE_NUNITS (mode); /* The encoding has 2 interleaved stepped patterns. */ vec_perm_builder sel (nelt, 2, 3); sel.quick_grow (6); for (i = 0; i < 3; i++) { sel[i * 2] = i; sel[i * 2 + 1] = i + nelt; } vec_perm_indices indices (sel, 2, nelt); if (can_vec_perm_const_p (mode, indices)) { for (i = 0; i < 6; i++) sel[i] += exact_div (nelt, 2); <----- indices.new_vector (sel, 2, nelt); if (can_vec_perm_const_p (mode, indices)) return true; } } The patch adds a check to prevent this. Ok? -Andreas- gcc/ChangeLog: 2018-04-16 Andreas Krebbel <kreb...@linux.ibm.com> * tree-vect-data-refs.c (vect_grouped_store_supported): Exit for single element vectors. --- gcc/tree-vect-data-refs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 161a886..01e28ca 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -5135,6 +5135,9 @@ vect_grouped_store_supported (tree vectype, unsigned HOST_WIDE_INT count) gcc_assert (pow2p_hwi (count)); poly_uint64 nelt = GET_MODE_NUNITS (mode); + if (maybe_eq (nelt, 1U)) + return false; + /* The encoding has 2 interleaved stepped patterns. */ vec_perm_builder sel (nelt, 2, 3); sel.quick_grow (6); -- 2.9.1