The following fix from Uros properly (not) handles XFmode vectors in type_natural_mode.
Bootstrapped and tested on x86_64-unknown-linux-gnu by Uros, applied. Richard. 2016-03-02 Richard Biener <rguent...@suse.de> Uros Bizjak <ubiz...@gmail.com> PR target/67278 * config/i386/i386.c (type_natural_mode): Handle XFmode vectors. * gcc.dg/simd-8.c: New testcase. Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 233897) +++ gcc/config/i386/i386.c (working copy) @@ -7794,6 +7794,10 @@ type_natural_mode (const_tree type, cons { machine_mode innermode = TYPE_MODE (TREE_TYPE (type)); + /* There are no XFmode vector modes. */ + if (innermode = XFmode) + return mode; + if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE) mode = MIN_MODE_VECTOR_FLOAT; else Index: gcc/testsuite/gcc.dg/simd-8.c =================================================================== --- gcc/testsuite/gcc.dg/simd-8.c (revision 0) +++ gcc/testsuite/gcc.dg/simd-8.c (working copy) @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +#if __SIZEOF_LONG_DOUBLE__ == 16 || __SIZEOF_LONG_DOUBLE__ == 8 +typedef long double a __attribute__((vector_size (32))); + +a __attribute__((noinline)) +sum (a first, a second) +{ + return first + second; +} + +a +foo (a x, a y, a z) +{ + return sum (x, y) + z; +} +#else +int main() {} +#endif