On Tue, Sep 6, 2016 at 5:06 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Mon, Sep 05, 2016 at 08:58:12PM +0200, Uros Bizjak wrote:
>> ... perhaps we can emit a warning here and expand the builtin as a
>> call? This way, we will mirror the case when builtin requires some
>> ISA, e.g.:
>>
>> void foo ()
>> {
>>   __builtin_ia32_stmxcsr();
>> }
>>
>> $ gcc -S -mno-sse dd.c
>> dd.c: In function ‘foo’:
>> dd.c:3:3: warning: implicit declaration of function
>> ‘__builtin_ia32_stmxcsr’ [-Wimplicit-function-declaration]
>>    __builtin_ia32_stmxcsr();
>>    ^~~~~~~~~~~~~~~~~~~~~~
>
> I'm not sure it is a good idea to emit a warning, we are in the backend
> and we don't know what kind of warning/error the FE would emit if the
> builtin isn't implicitly prototyped.  E.g. C++ would certainly error out,
> C with -pedantic-errors would too, etc., it is simply too hard to replicate
> such behavior this late.

OK.

> Using expand_call works too (only tested on the testcases so far, but can test
> it fully), just had to add some expected warnings for the return and
> argument type -Wpsabi stuff.

Yes, this is what compiling testcase without using #pragmas warns.

> 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, use expand_call.
>
>         * gcc.target/i386/pr69255-1.c: New test.
>         * gcc.target/i386/pr69255-2.c: New test.
>         * gcc.target/i386/pr69255-3.c: New test.

OK for mainline and release branches.

Thanks,
Uros.

> --- gcc/config/i386/i386.c.jj   2016-09-05 19:27:03.287671306 +0200
> +++ gcc/config/i386/i386.c      2016-09-06 16:55:35.524605779 +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 expand_call (exp, target, ignore);
>      }
>
>    switch (fcode)
> --- gcc/testsuite/gcc.target/i386/pr69255-1.c.jj        2016-09-06 
> 16:54:01.793783159 +0200
> +++ gcc/testsuite/gcc.target/i386/pr69255-1.c   2016-09-06 16:59:53.317370510 
> +0200
> @@ -0,0 +1,17 @@
> +/* 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 } */
> +/* { dg-warning "AVX vector argument without AVX enabled changes the ABI" "" 
> { target *-*-* } 13 } */
> --- gcc/testsuite/gcc.target/i386/pr69255-2.c.jj        2016-09-06 
> 16:54:01.793783159 +0200
> +++ gcc/testsuite/gcc.target/i386/pr69255-2.c   2016-09-06 17:00:04.229233625 
> +0200
> @@ -0,0 +1,17 @@
> +/* 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" } */
> +}
> +
> +/* { dg-warning "AVX vector return without AVX enabled changes the ABI" "" { 
> target *-*-* } 13 } */
> +/* { dg-warning "AVX vector argument without AVX enabled changes the ABI" "" 
> { target *-*-* } 13 } */
> --- gcc/testsuite/gcc.target/i386/pr69255-3.c.jj        2016-09-06 
> 16:54:01.794783146 +0200
> +++ gcc/testsuite/gcc.target/i386/pr69255-3.c   2016-09-06 17:00:14.915099574 
> +0200
> @@ -0,0 +1,17 @@
> +/* 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 } */
> +/* { dg-warning "AVX vector argument without AVX enabled changes the ABI" "" 
> { target *-*-* } 13 } */
>
>
>         Jakub

Reply via email to