On Wed, Mar 24, 2021 at 6:23 PM H.J. Lu <hjl.to...@gmail.com> 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.
>
> gcc/testsuite/
>
>         PR target/98209
>         PR target/99744
>         * gcc.target/i386/pr98209.c: New test.
>         * gcc.target/i386/pr99744-1.c: Likewise.
>         * gcc.target/i386/pr99744-2.c: Likewise.

LGTM.

Thanks,
Uros.

> ---
>  gcc/config/i386/i386.c                    | 24 +++++++++++++++--------
>  gcc/testsuite/gcc.target/i386/pr98209.c   | 13 ++++++++++++
>  gcc/testsuite/gcc.target/i386/pr99744-1.c | 16 +++++++++++++++
>  gcc/testsuite/gcc.target/i386/pr99744-2.c | 13 ++++++++++++
>  4 files changed, 58 insertions(+), 8 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr98209.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr99744-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr99744-2.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 7c41302c75b..1b4567e34ba 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -578,21 +578,29 @@ ix86_can_inline_p (tree caller, tree callee)
>         && lookup_attribute ("always_inline",
>                             DECL_ATTRIBUTES (callee)));
>
> +  /* NB: Skip ISA check for always_inline in system headers if caller
> +     has target attribute.  */
> +  bool skip_isa_check = (always_inline
> +                        && caller_tree != target_option_default_node
> +                        && DECL_IN_SYSTEM_HEADER (callee));
> +
>    cgraph_node *callee_node = cgraph_node::get (callee);
>    /* Callee's isa options should be a subset of the caller's, i.e. a SSE4
>       function can inline a SSE2 function but a SSE2 function can't inline
>       a SSE4 function.  */
> -  if (((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags)
> -       != callee_opts->x_ix86_isa_flags)
> -      || ((caller_opts->x_ix86_isa_flags2 & callee_opts->x_ix86_isa_flags2)
> -         != callee_opts->x_ix86_isa_flags2))
> +  if (!skip_isa_check
> +      && (((caller_opts->x_ix86_isa_flags & callee_opts->x_ix86_isa_flags)
> +          != callee_opts->x_ix86_isa_flags)
> +         || ((caller_opts->x_ix86_isa_flags2 & 
> callee_opts->x_ix86_isa_flags2)
> +             != callee_opts->x_ix86_isa_flags2)))
>      ret = false;
>
>    /* See if we have the same non-isa options.  */
> -  else if ((!always_inline
> -           && caller_opts->x_target_flags != callee_opts->x_target_flags)
> -          || (caller_opts->x_target_flags & ~always_inline_safe_mask)
> -              != (callee_opts->x_target_flags & ~always_inline_safe_mask))
> +  else if (!skip_isa_check
> +          && ((!always_inline
> +               && caller_opts->x_target_flags != callee_opts->x_target_flags)
> +              || ((caller_opts->x_target_flags & ~always_inline_safe_mask)
> +                  != (callee_opts->x_target_flags & 
> ~always_inline_safe_mask))))
>      ret = false;
>
>    /* See if arch, tune, etc. are the same.  */
> diff --git a/gcc/testsuite/gcc.target/i386/pr98209.c 
> b/gcc/testsuite/gcc.target/i386/pr98209.c
> new file mode 100644
> index 00000000000..4566d4c7fc3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr98209.c
> @@ -0,0 +1,13 @@
> +/* { dg-do run { target *-*-linux* } } */
> +/* { dg-options "-O2 -D_FORTIFY_SOURCE=2" } */
> +
> +#include <stdio.h>
> +
> +extern int main(int argc, char** argv)
> +  __attribute__ ((__target__ ("no-sse,no-mmx")));
> +
> +int main(int argc, char** argv)
> +{
> +  printf ("hello!\n");
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr99744-1.c 
> b/gcc/testsuite/gcc.target/i386/pr99744-1.c
> new file mode 100644
> index 00000000000..92535923a56
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr99744-1.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O0" } */
> +
> +#include <x86intrin.h>
> +
> +extern unsigned long long int curr_deadline;
> +extern void bar (void);
> +
> +__attribute__ ((target("general-regs-only")))
> +void
> +foo (void)
> +{
> +  if (__rdtsc () < curr_deadline)
> +    return;
> +  bar ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr99744-2.c 
> b/gcc/testsuite/gcc.target/i386/pr99744-2.c
> new file mode 100644
> index 00000000000..4bb2a6bb6dc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr99744-2.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile { target { ! ia32 } } } */
> +/* { dg-options "-O2" } */
> +
> +#include <x86intrin.h>
> +
> +extern __m128i x, y;
> +
> +__attribute__ ((target("general-regs-only")))
> +void
> +foo (void)
> +{
> +  x = _mm_move_epi64 (y); /* { dg-error "SSE register return with SSE 
> disabled" } */
> +}
> --
> 2.30.2
>

Reply via email to