On Wed, Mar 24, 2021 at 10:23:44AM -0700, H.J. Lu via Gcc-patches wrote:
> For always_inline in system headers, we don't know if caller's ISAs are
> compatible with callee's ISAs until much later.  Skip ISA check for
> always_inline in system headers if caller has target attribute.
> 
> gcc/
> 
>       PR target/98209
>       PR target/99744
>       * config/i386/i386.c (ix86_can_inline_p): Don't check ISA for
>       always_inline in system headers.

Aren't *intrin.h system headers too?
Doesn't this mean we can now inline all the intrinsics if the caller doesn't
have the default target options and doesn't have the needed ISA?

Consider e.g.
#include <x86intrin.h>

#ifdef FOO
void
foo (__m512 *p)
{
  *p = _mm512_setzero_ps ();
}
#else
__attribute__((target ("avx"))) void
bar (__m512 *p)
{
  *p = _mm512_setzero_ps ();
}
#endif

#ifdef FOO
void
baz (__m512d *p, __m512d *q, int mask)
{
  *p = _mm512_mask_mov_pd (*p, mask, *q);
}
#else
__attribute__((target ("avx"))) void
qux (__m512d *p, __m512d *q, int mask)
{
  *p = _mm512_mask_mov_pd (*p, mask, *q);
}
#endif

If you compile this without your patch, you'll get
inlining failed in call to ‘always_inline’ ‘_mm512_setzero_ps’: target specific 
option mismatch
errors in all cases (always the first one), but with your patch
the _mm512_setzero_ps (); gets through completely and on the mask move
one gets instead
‘__builtin_ia32_movapd512_mask’ needs isa option -mavx512f
error and
the ABI for passing parameters with 64-byte alignment has changed in GCC 4.6
note.  IMNSHO this change needs to be reverted and we need to come up with a
way (some attribute) to say explicitly whether we can or can't inline that
always_inline function despite target specific option mismatches.

        Jakub

Reply via email to