Tamar Christina <tamar.christ...@arm.com> writes:
> Hi All,
>
> in g:e91a17fe39c39e98cebe6e1cbc8064ee6846a3a7 we added the ability for
> -mcpu=native on unknown CPUs to still enable architecture extensions.
>
> This has worked great but was only added for homogenous systems.
>
> However the same thing works for big.LITTLE as in such system the cores must
> have the same extensions otherwise it doesn't fundamentally work.
>
> i.e. task migration from one core to the other wouldn't work.
>
> This extends the same handling to non-homogenous systems.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
>
> Ok for master?
>
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
>       PR target/113257
>       * config/aarch64/driver-aarch64.cc (host_detect_local_cpu):
>
> gcc/testsuite/ChangeLog:
>
>       PR target/113257
>       * gcc.target/aarch64/cpunative/info_34: New test.
>       * gcc.target/aarch64/cpunative/native_cpu_34.c: New test.
>
> ---
>
> diff --git a/gcc/config/aarch64/driver-aarch64.cc 
> b/gcc/config/aarch64/driver-aarch64.cc
> index 
> 45fce67a646351b848b7cd7d0fd35d343731c0d1..2a454daf031aa3ac81a9a2c03b15c09731e4f56e
>  100644
> --- a/gcc/config/aarch64/driver-aarch64.cc
> +++ b/gcc/config/aarch64/driver-aarch64.cc
> @@ -449,6 +449,20 @@ host_detect_local_cpu (int argc, const char **argv)
>             break;
>           }
>       }
> +
> +      /* On big.LITTLE if we find any unknown CPUs we can still pick arch
> +      features as the cores should have the same features.  So just pick
> +      the feature flags from any of the cpus.  */
> +      if (aarch64_cpu_data[i].name == NULL)
> +     {
> +       auto arch_info = get_arch_from_id (DEFAULT_ARCH);
> +
> +       gcc_assert (arch_info);
> +
> +       res = concat ("-march=", arch_info->name, NULL);
> +       default_flags = arch_info->flags;
> +     }
> +

Currently, if gcc recognises the host cpu, and if one-thing is more
restrictive than that cpu, gcc will warn on:

  gcc -march=one-thing -mcpu=native

and choose one-thing.  It looks like one consequence of this patch
is that, for unrecognised big.LITTLE, the command line would get
converted to:

  gcc -march=one-thing -march=above-replacement

and so -mcpu=native would silently "win" over one-thing.  Is that right?

Perhaps we should adjust:

   " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}"              \

to pass something like "cpu/arch" rather than "cpu" when -march
is not specified, so that the routine knows that it has the choice
of using either -mcpu or -march.  We wouldn't get the warning, but we
would get predictable preemption of -march over -mcpu.

Admittedly, it looks like we already have this problem with:

      if (aarch64_cpu_data[i].name == NULL)
        {
          auto arch_info = get_arch_from_id (DEFAULT_ARCH);

          gcc_assert (arch_info);

          res = concat ("-march=", arch_info->name, NULL);
          default_flags = arch_info->flags;
        }

so I guess this is pre-existing.

Thanks,
Richard

>        if (!res)
>       goto not_found;
>      }
> diff --git a/gcc/testsuite/gcc.target/aarch64/cpunative/info_34 
> b/gcc/testsuite/gcc.target/aarch64/cpunative/info_34
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..61cb254785a4b9ec19ebe388402223c9a82af7ed
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/cpunative/info_34
> @@ -0,0 +1,18 @@
> +processor    : 0
> +BogoMIPS     : 100.00
> +Features     : fp asimd evtstrm aes pmull sha1 sha2 crc32 asimddp sve sve2 
> fphp asimdhp fcma
> +CPU implementer      : 0xfe
> +CPU architecture: 8
> +CPU variant  : 0x0
> +CPU part     : 0xd08
> +CPU revision : 2
> +
> +processor    : 0
> +BogoMIPS     : 100.00
> +Features     : fp asimd evtstrm aes pmull sha1 sha2 crc32 asimddp sve sve2 
> fphp asimdhp fcma
> +CPU implementer      : 0xfe
> +CPU architecture: 8
> +CPU variant  : 0x0
> +CPU part     : 0xd09
> +CPU revision : 2
> +
> diff --git a/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_34.c 
> b/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_34.c
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..168140002a0f0205c0f552de0cce9b2d356e09e2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_34.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile { target { { aarch64*-*-linux*} && native } } } */
> +/* { dg-set-compiler-env-var GCC_CPUINFO 
> "$srcdir/gcc.target/aarch64/cpunative/info_34" } */
> +/* { dg-additional-options "-mcpu=native" } */
> +
> +int main()
> +{
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler {\.arch 
> armv8-a\+dotprod\+crc\+crypto\+sve2\n} } } */
> +
> +/* Test a normal looking procinfo.  */

Reply via email to