Well, not really - but at least don't fail vectorization because of that but allow it to proceed the "build up from scalar pieces" path.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2015-05-12 Richard Biener <rguent...@suse.de> * tree-vect-slp.c (vect_build_slp_tree_1): For BB vectorization do not allow unrolling. * gcc.dg/vect/bb-slp-35.c: New testcase. Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c.orig 2015-05-11 15:25:59.385297283 +0200 +++ gcc/tree-vect-slp.c 2015-05-11 15:21:00.129581537 +0200 @@ -572,6 +572,19 @@ vect_build_slp_tree_1 (loop_vec_info loo return false; } + /* If populating the vector type requires unrolling then fail + before adjusting *max_nunits for basic-block vectorization. */ + if (bb_vinfo + && TYPE_VECTOR_SUBPARTS (vectype) > group_size) + { + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "Build SLP failed: unrolling required " + "in basic block SLP\n"); + /* Fatal mismatch. */ + matches[0] = false; + return false; + } + /* In case of multiple types we need to detect the smallest type. */ if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype)) { Index: gcc/testsuite/gcc.dg/vect/bb-slp-35.c =================================================================== --- gcc/testsuite/gcc.dg/vect/bb-slp-35.c (revision 0) +++ gcc/testsuite/gcc.dg/vect/bb-slp-35.c (working copy) @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +void foo (int * __restrict__ p, short * __restrict__ q) +{ + p[0] = q[0] + 1; + p[1] = q[1] + 1; + p[2] = q[2] + 1; + p[3] = q[3] + 1; +} + +/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */