Hi! As the testcase shows, if we want to diagnose a md builtin not enabled in the current ISA, we call error and then return const0_rtx. That isn't a good choice if the result is BLKmode, which can happen for vector modes that aren't enabled in the current ISA. In that case, returning target is better. In the PR I've also mentioned DECL_MODE issues, but looking at expr.c, I see there: /* DECL_MODE might change when TYPE_MODE depends on attribute target settings for VECTOR_TYPE_P that might switch for the function. */ if (currently_expanding_to_rtl && code == VAR_DECL && MEM_P (decl_rtl) && VECTOR_TYPE_P (type) && exp && DECL_MODE (exp) != mode) decl_rtl = change_address (decl_rtl, TYPE_MODE (type), 0); else decl_rtl = copy_rtx (decl_rtl); so we should be fine.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-09-05 Jakub Jelinek <ja...@redhat.com> PR target/69255 * config/i386/i386.c (ix86_expand_builtin): For builtin with unsupported or unknown ISA, return target if non-NULL, instead of const0_rtx. * gcc.target/i386/pr69255-1.c: New test. * gcc.target/i386/pr69255-2.c: New test. * gcc.target/i386/pr69255-3.c: New test. --- gcc/config/i386/i386.c.jj 2016-09-02 18:18:10.000000000 +0200 +++ gcc/config/i386/i386.c 2016-09-05 12:41:03.341382125 +0200 @@ -36107,7 +36107,7 @@ ix86_expand_builtin (tree exp, rtx targe error ("%qE needs isa option %s", fndecl, opts); free (opts); } - return const0_rtx; + return target ? target : const0_rtx; } switch (fcode) --- gcc/testsuite/gcc.target/i386/pr69255-1.c.jj 2016-09-05 12:50:29.455307440 +0200 +++ gcc/testsuite/gcc.target/i386/pr69255-1.c 2016-09-05 12:50:06.000000000 +0200 @@ -0,0 +1,16 @@ +/* PR target/69255 */ +/* { dg-do compile } */ +/* { dg-options "-mno-avx512f" } */ + +#pragma GCC target "avx512vl" +#pragma GCC target "no-avx512vl" +__attribute__ ((__vector_size__ (32))) long long a; +__attribute__ ((__vector_size__ (16))) int b; + +void +foo (const long long *p) +{ + a = __builtin_ia32_gather3siv4di (a, p, b, 1, 1); /* { dg-error "needs isa option -m32 -mavx512vl" } */ +} + +/* { dg-warning "AVX vector return without AVX enabled changes the ABI" "" { target *-*-* } 13 } */ --- gcc/testsuite/gcc.target/i386/pr69255-2.c.jj 2016-09-05 12:50:32.931264038 +0200 +++ gcc/testsuite/gcc.target/i386/pr69255-2.c 2016-09-05 12:49:57.000000000 +0200 @@ -0,0 +1,14 @@ +/* PR target/69255 */ +/* { dg-do compile } */ +/* { dg-options "-mno-avx512f" } */ + +#pragma GCC target "avx512vl" +#pragma GCC target "" +__attribute__ ((__vector_size__ (32))) long long a; +__attribute__ ((__vector_size__ (16))) int b; + +void +foo (const long long *p) +{ + __builtin_ia32_gather3siv4di (a, p, b, 1, 1); /* { dg-error "needs isa option -m32 -mavx512vl" } */ +} --- gcc/testsuite/gcc.target/i386/pr69255-3.c.jj 2016-09-05 12:50:35.951226330 +0200 +++ gcc/testsuite/gcc.target/i386/pr69255-3.c 2016-09-05 12:49:13.000000000 +0200 @@ -0,0 +1,16 @@ +/* PR target/69255 */ +/* { dg-do compile } */ +/* { dg-options "-mno-avx512f" } */ + +#pragma GCC target "avx512vl" +#pragma GCC target "" +__attribute__ ((__vector_size__ (32))) long long a; +__attribute__ ((__vector_size__ (16))) int b; + +void +foo (const long long *p, __attribute__ ((__vector_size__ (32))) long long *q) +{ + *q = __builtin_ia32_gather3siv4di (a, p, b, 1, 1); /* { dg-error "needs isa option -m32 -mavx512vl" } */ +} + +/* { dg-warning "AVX vector return without AVX enabled changes the ABI" "" { target *-*-* } 13 } */ Jakub