> On 19 Nov 2024, at 4:18 PM, Tamar Christina <tamar.christ...@arm.com> wrote:
> 
> External email: Use caution opening links or attachments
> 
> 
>> -----Original Message-----
>> From: Andrew Pinski <pins...@gmail.com>
>> Sent: Friday, November 15, 2024 7:16 PM
>> To: Tamar Christina <tamar.christ...@arm.com>
>> Cc: gcc-patches@gcc.gnu.org; nd <n...@arm.com>; Richard Earnshaw
>> <richard.earns...@arm.com>; ktkac...@gcc.gnu.org; Richard Sandiford
>> <richard.sandif...@arm.com>
>> Subject: Re: [PATCH]AArch64 Suppress default options when march or mcpu used
>> is not affected by it.
>> 
>> On Fri, Nov 15, 2024 at 6:30 AM Tamar Christina <tamar.christ...@arm.com>
>> wrote:
>>> 
>>> Hi All,
>>> 
>>> This patch makes it so that when you use any of the Cortex-A53 errata
>>> workarounds but have specified an -march or -mcpu we know is not affected by
>> it
>>> that we suppress the errata workaround.
>>> 
>>> This is a driver only patch as the linker invocation needs to be changed as
>>> well.  The linker and cc SPECs are different because for the linker we 
>>> didn't
>>> seem to add an inversion flag for the option.  That said, it's also not 
>>> possible
>>> to configure the linker with it on by default.  So not passing the flag is
>>> sufficient to turn it off.
>>> 
>>> For the compilers however we have an inversion flag using -mno-, which is
>> needed
>>> to disable the workarounds when the compiler has been configured with it by
>>> default.
>>> 
>>> Note that theoretically speaking -mcpu=native on a Cortex-A53 would turn it 
>>> off,
>>> but this should be ok because it's unlikely anyone is running GCC-15+ on a
>>> Cortex-A53 which needs it.  If this is a concern I can adjust the patch to 
>>> for
>>> targets that have HAVE_LOCAL_CPU_DETECT I can make a new custom function
>> that
>>> re-queries host detection to see if it's an affected system.
>>> 
>>> The workaround has the effect of suppressing certain inlining and 
>>> multiply-add
>>> formation which leads to about ~1% SPECCPU 2017 Intrate regression on
>> modern
>>> cores.  This patch is needed because most distros configure GCC with the
>>> workaround enabled by default.
>>> 
>>> I tried writing automated testcases for these, however the testsuite doesn't
>>> want to scan the output of -### and it makes the excess error tests always 
>>> fail
>>> unless you use dg-error, which also looks for"error:".  So tested manually:
>> 
>> You might be able to use dg-message instead. dg-message does not look
>> for a `note:` (dg-note), `error:` (dg-note) or `warning:`
>> (dg-warning).
>> 
>> From gcc-dg.exp:
>> ```
>> # Look for messages that don't have standard prefixes.
>> proc dg-message { args } {
>> ```
>> 
> 
> Thanks for the suggestion, I did try it before but both dg-output and 
> dg-message fail
> test for excess errors since the -### output goes to stderr.
> 
> But I realized I misunderstood the dg-message syntax and found a way to 
> silence the
> excess error. So respinning the patch.
> 
> Thanks,
> Tamar
>> Thanks,
>> Andrew Pinski
>> 
>>> 
>>>> gcc -mcpu=neoverse-v1 -mfix-cortex-a53-835769 -xc - -O3 -o - < /dev/null 
>>>> -###
>> 2>&1 | grep "\-mfix" | wc -l
>>> 0
>>> 
>>>> gcc -mfix-cortex-a53-835769 -xc - -O3 -o - < /dev/null -### 2>&1 | grep "\-
>> mfix" | wc -l
>>> 5
>>> 
>>>> gcc -mfix-cortex-a53-835769 -march=armv8-a -xc - -O3 -o - < /dev/null -###
>> 2>&1 | grep "\-mfix" | wc -l
>>> 5
>>> 
>>>> gcc -mfix-cortex-a53-835769 -march=armv8.1-a -xc - -O3 -o - < /dev/null 
>>>> -###
>> 2>&1 | grep "\-mfix" | wc -l
>>> 0
>>> 
>>>> gcc -mfix-cortex-a53-835769 -march=armv8.1-a -xc - -O3 -o - < /dev/null 
>>>> -###
>> 2>&1 | grep "\-\-fix" | wc -l
>>> 0
>>> 
>>>> gcc -mfix-cortex-a53-835769 -march=armv8-a -xc - -O3 -o - < /dev/null -###
>> 2>&1 | grep "\-\-fix" | wc -l
>>> 1
>>> 
>>>> -gcc -mfix-cortex-a53-835769 -xc - -O3 -o - < /dev/null -### 2>&1 | grep 
>>>> "\-\-
>> fix" | wc -l
>>> 1
>>> 
>>> Bootstrapped Regtested on aarch64-none-linux-gnu and no issues.
>>> 
>>> Ok for master?
>>> 
>>> Thanks,
>>> Tamar
>>> 
>>> gcc/ChangeLog:
>>> 
>>>        * config/aarch64/aarch64-errata.h (TARGET_SUPPRESS_OPT_SPEC,
>>>        TARGET_TURN_OFF_OPT_SPEC, CA53_ERR_835769_COMPILE_SPEC,
>>>        CA53_ERR_843419_COMPILE_SPEC): New.
>>>        (CA53_ERR_835769_SPEC, CA53_ERR_843419_SPEC): Use them.
>>>        (AARCH64_ERRATA_COMPILE_SPEC):
>>>        * config/aarch64/aarch64-elf-raw.h (CC1_SPEC, CC1PLUS_SPEC): Add
>>>        AARCH64_ERRATA_COMPILE_SPEC.
>>>        * config/aarch64/aarch64-freebsd.h (CC1_SPEC, CC1PLUS_SPEC): 
>>> Likewise.
>>>        * config/aarch64/aarch64-gnu.h (CC1_SPEC, CC1PLUS_SPEC): Likewise.
>>>        * config/aarch64/aarch64-linux.h (CC1_SPEC, CC1PLUS_SPEC): Likewise.
>>>        * config/aarch64/aarch64-netbsd.h (CC1_SPEC, CC1PLUS_SPEC): Likewise.
>>>        * doc/invoke.texi: Document it.
>>> 
>>> ---
>>> diff --git a/gcc/config/aarch64/aarch64-elf-raw.h
>> b/gcc/config/aarch64/aarch64-elf-raw.h
>>> index
>> 5396da9b2d626e23e4c4d56e19cd7aa70804c475..8442a664c4fdedd9696da90
>> e6727293c4d472a3f 100644
>>> --- a/gcc/config/aarch64/aarch64-elf-raw.h
>>> +++ b/gcc/config/aarch64/aarch64-elf-raw.h
>>> @@ -38,4 +38,12 @@
>>>   AARCH64_ERRATA_LINK_SPEC
>>> #endif
>>> 
>>> +#ifndef CC1_SPEC
>>> +# define CC1_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> +#ifndef CC1PLUS_SPEC
>>> +# define CC1PLUS_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> #endif /* GCC_AARCH64_ELF_RAW_H */
>>> diff --git a/gcc/config/aarch64/aarch64-errata.h 
>>> b/gcc/config/aarch64/aarch64-
>> errata.h
>>> index
>> c323595ee49553f2b3bc106e993c14f62aee235b..ac0156848abe3e7df669a7ff5
>> 4e07e72e978c5f0 100644
>>> --- a/gcc/config/aarch64/aarch64-errata.h
>>> +++ b/gcc/config/aarch64/aarch64-errata.h
>>> @@ -21,24 +21,61 @@
>>> #ifndef GCC_AARCH64_ERRATA_H
>>> #define GCC_AARCH64_ERRATA_H
>>> 
>>> +/* Completely ignore the option if we've explicitly specify something 
>>> other than
>>> +   mcpu=cortex-a53 or march=armv8-a.  */
>>> +#define TARGET_SUPPRESS_OPT_SPEC(OPT) \
>>> +  "mcpu=*:%{!mcpu=cortex-a53:; " OPT  \
>>> +  "}; march=*:%{!march=armv8-a:;" OPT "}; " OPT
>>> +
>>> +/* Explicitly turn off the option if we've explicitly specify something 
>>> other
>>> +   than mcpu=cortex-a53 or march=armv8-a.  This will also erase any other 
>>> usage
>>> +   of the flag making the order of the options not relevant.  */
>>> +#define TARGET_TURN_OFF_OPT_SPEC(FLAG)   \
>>> +  "mcpu=*:%{!mcpu=cortex-a53:%<m" FLAG " -mno-" FLAG \
>>> +  "}; march=*:%{!march=armv8-a:%<m" FLAG " -mno-" FLAG "}"
>>> +
>>> +/* Cortex-A53 835769 Errata.  */
>>> +
>>> #if TARGET_FIX_ERR_A53_835769_DEFAULT
>>> -#define CA53_ERR_835769_SPEC \
>>> -  " %{!mno-fix-cortex-a53-835769:--fix-cortex-a53-835769}"
>>> +#define CA53_ERR_835769_SPEC     \
>>> +  " %{" \
>>> +  TARGET_SUPPRESS_OPT_SPEC ("!mno-fix-cortex-a53-835769:--fix-cortex-
>> a53-835769") \
>>> +  " }"
>>> #else
>>> -#define CA53_ERR_835769_SPEC \
>>> -  " %{mfix-cortex-a53-835769:--fix-cortex-a53-835769}"
>>> +#define CA53_ERR_835769_SPEC     \
>>> +  " %{" \
>>> +  TARGET_SUPPRESS_OPT_SPEC ("mfix-cortex-a53-835769:--fix-cortex-a53-
>> 835769") \
>>> +  " }"
>>> #endif
>>> 
>>> +#define CA53_ERR_835769_COMPILE_SPEC \
>>> +  " %{" TARGET_TURN_OFF_OPT_SPEC ("fix-cortex-a53-835769") "}"
>>> +
>>> +/* Cortex-A53 843419 Errata.  */
>>> +
>>> #if TARGET_FIX_ERR_A53_843419_DEFAULT
>>> -#define CA53_ERR_843419_SPEC \
>>> -  " %{!mno-fix-cortex-a53-843419:--fix-cortex-a53-843419}"
>>> +#define CA53_ERR_843419_SPEC     \
>>> +  " %{" \
>>> +  TARGET_SUPPRESS_OPT_SPEC ("!mno-fix-cortex-a53-843419:--fix-cortex-
>> a53-843419") \
>>> +  " }"
>>> #else
>>> -#define CA53_ERR_843419_SPEC \
>>> -  " %{mfix-cortex-a53-843419:--fix-cortex-a53-843419}"
>>> +#define CA53_ERR_843419_SPEC     \
>>> +  " %{" \
>>> +  TARGET_SUPPRESS_OPT_SPEC ("mfix-cortex-a53-843419:--fix-cortex-a53-
>> 843419") \
>>> +  " }"
>>> #endif
>>> 
>>> +#define CA53_ERR_843419_COMPILE_SPEC \
>>> +  " %{" TARGET_TURN_OFF_OPT_SPEC ("fix-cortex-a53-843419") "}"
>>> +
>>> +/* Exports to use in SPEC files.  */
>>> +
>>> #define AARCH64_ERRATA_LINK_SPEC               \
>>>   CA53_ERR_835769_SPEC                         \
>>>   CA53_ERR_843419_SPEC
>>> 
>>> +#define AARCH64_ERRATA_COMPILE_SPEC            \
>>> +  CA53_ERR_835769_COMPILE_SPEC                 \
>>> +  CA53_ERR_843419_COMPILE_SPEC
>>> +
>>> #endif /*  GCC_AARCH64_ERRATA_H */
>>> diff --git a/gcc/config/aarch64/aarch64-freebsd.h
>> b/gcc/config/aarch64/aarch64-freebsd.h
>>> index
>> e26d69ce46c7376402c96b846e21a6c0846ebe04..8a76017538a121b4f8ce16d
>> 7a64a080d84c72e25 100644
>>> --- a/gcc/config/aarch64/aarch64-freebsd.h
>>> +++ b/gcc/config/aarch64/aarch64-freebsd.h
>>> @@ -47,6 +47,14 @@
>>>     -X" SUBTARGET_EXTRA_LINK_SPEC "                             \
>>>     %{mbig-endian:-EB} %{mlittle-endian:-EL}"
>>> 
>>> +#ifndef CC1_SPEC
>>> +# define CC1_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> +#ifndef CC1PLUS_SPEC
>>> +# define CC1PLUS_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> #undef  LINK_SPEC
>>> #define LINK_SPEC FBSD_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC
>>> 
>>> diff --git a/gcc/config/aarch64/aarch64-gnu.h b/gcc/config/aarch64/aarch64-
>> gnu.h
>>> index
>> ee54940342d3000513aef28d8b29a44d1424c41b..74456263e5837ea8a53b15
>> ebf632ef5407ae2ffb 100644
>>> --- a/gcc/config/aarch64/aarch64-gnu.h
>>> +++ b/gcc/config/aarch64/aarch64-gnu.h
>>> @@ -36,6 +36,13 @@
>>>    %{mbig-endian:-EB} %{mlittle-endian:-EL}     \
>>>    -maarch64gnu%{mabi=ilp32:32}%{mbig-endian:b}"
>>> 
>>> +#ifndef CC1_SPEC
>>> +# define CC1_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> +#ifndef CC1PLUS_SPEC
>>> +# define CC1PLUS_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> 
>>> #define LINK_SPEC GNU_TARGET_LINK_SPEC AARCH64_ERRATA_LINK_SPEC
>>> 
>>> diff --git a/gcc/config/aarch64/aarch64-linux.h 
>>> b/gcc/config/aarch64/aarch64-
>> linux.h
>>> index
>> 8e51c8202ccc87c19deb97e046ad688899680b62..7582d1734892dbbd550077
>> b0f5a87e095f938ad8 100644
>>> --- a/gcc/config/aarch64/aarch64-linux.h
>>> +++ b/gcc/config/aarch64/aarch64-linux.h
>>> @@ -29,8 +29,12 @@
>>> #undef  ASAN_CC1_SPEC
>>> #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
>>> 
>>> -#undef  CC1_SPEC
>>> -#define CC1_SPEC GNU_USER_TARGET_CC1_SPEC ASAN_CC1_SPEC
>>> +#undef CC1_SPEC
>>> +#define CC1_SPEC GNU_USER_TARGET_CC1_SPEC ASAN_CC1_SPEC \
>>> +    AARCH64_ERRATA_COMPILE_SPEC
>>> +
>>> +#undef CC1PLUS_SPEC
>>> +#define CC1PLUS_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> 
>>> #define CPP_SPEC "%{pthread:-D_REENTRANT}"
>>> 
>>> diff --git a/gcc/config/aarch64/aarch64-netbsd.h
>> b/gcc/config/aarch64/aarch64-netbsd.h
>>> index
>> fb8d10ffd18f9152740199ad8c481fe2f13f3470..57fffcd448fd976b919cf874f00
>> d3341dd6f0757 100644
>>> --- a/gcc/config/aarch64/aarch64-netbsd.h
>>> +++ b/gcc/config/aarch64/aarch64-netbsd.h
>>> @@ -39,6 +39,15 @@
>>>   "%{mlittle-endian:-EL -m " TARGET_LINKER_LITTLE_EMULATION "} "       \
>>>   "%(netbsd_link_spec)"
>>> 
>>> +
>>> +#ifndef CC1_SPEC
>>> +# define CC1_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> +#ifndef CC1PLUS_SPEC
>>> +# define CC1PLUS_SPEC AARCH64_ERRATA_COMPILE_SPEC
>>> +#endif
>>> +
>>> #undef  LINK_SPEC
>>> #define LINK_SPEC NETBSD_LINK_SPEC_ELF         \
>>>                  NETBSD_TARGET_LINK_SPEC       \
>>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>>> index
>> 4a494f6a668cb0e51cdf56af56c094d982812458..0280126c5c28f563b1956af8
>> 74cc90cd5886d09e 100644
>>> --- a/gcc/doc/invoke.texi
>>> +++ b/gcc/doc/invoke.texi
>>> @@ -21361,7 +21361,9 @@ This option requires binutils 2.26 or newer.
>>> @itemx -mno-fix-cortex-a53-835769
>>> Enable or disable the workaround for the ARM Cortex-A53 erratum number
>> 835769.
>>> This involves inserting a NOP instruction between memory instructions and
>>> -64-bit integer multiply-accumulate instructions.
>>> +64-bit integer multiply-accumulate instructions.  This flag will be 
>>> ignored if
>>> +an architecture or cpu is specified on the commandline which does not need 
>>> the
>>> +workaround.
>>> 
>>> @opindex mfix-cortex-a53-843419
>>> @opindex mno-fix-cortex-a53-843419
>>> @@ -21369,7 +21371,10 @@ This involves inserting a NOP instruction between
>> memory instructions and
>>> @itemx -mno-fix-cortex-a53-843419
>>> Enable or disable the workaround for the ARM Cortex-A53 erratum number
>> 843419.
>>> This erratum workaround is made at link time and this will only pass the
>>> -corresponding flag to the linker.
>>> +corresponding flag to the linker.  This flag will be ignored if
>>> +an architecture or cpu is specified on the commandline which does not need 
>>> the
>>> +workaround.
>>> +
>>> 
>>> @opindex mlow-precision-recip-sqrt
>>> @opindex mno-low-precision-recip-sqrt


LGTM and +1 from me though I cannot approve ! 

Ramana
>>> 
>>> 
>>> 
>>> 
>>> --


Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to