Hello,
I have another revision of this coming as I discovered some issues at
higher optimisation levels and have found a bunch of nits.
Kind regards,
Alfie
On 27/03/2025 15:45, Alfie Richards wrote:
Hi All,
This is an update on the patch series enabling ACLE compliant FMV
behaviour for targets supporting target_version and a refactor of FMV
in the front end.
This patch series leaves much of the logic that enables FMV for x86
in place, often gated behind TARGET_HAS_FMV_TARGET_ATTRIBUTE.
I would like to refactor more of the x86/PPC logic. Possibly even
making it match ACLE behaviour/semantics in places. but want to avoid
breaking changes and regressions, and as I could not find any x86/PPC
spec I thought best left alone for now.
The main changes between last patch series and this one are:
* Added pretty-print formatting support for string_slice.
(I'm not sure I did this completely correctly though in
the c-family front end?)
* Large refactor to the merging/conflicting logic in the
C++ front end. This is because I found flaws in the previous version
which could merge target_version decls that weren't distinct, but
weren't mergaeble.
* This involved a large refactor of the common_function_version
hook to take string_slices instead of decls, and moving
the target_version/target_clone distinctness/mergability
logic into shared code.
* This has the added benefit of enabling riscv target_version/
target_clones automatically as it now uses the same shared code
which wasn't possible before the hook refactor.
* This did also require some hacks to the riscv target parsing code
which would benefit from a more careful refactor.
* Added warning and skipping for unparsable target_clones values
* This is part of the ACLE that I missed last time.
* It only works properly for Aarch64 at the moment. Though I use
the hook to check parsing and emit errors for riscv as otherwise
I was breaking a lot of things.
* Ideally this would be implemented by other targets (especially riscv
with the shared target_clones semantics) to enable some portability.
I am also working on a patch to add target_version support to the C frontend
while making it ACLE compliant, and a patch to update the
redirect_to_specific_clone logic to work properly with ACLE semantics which
will both use the work in this patch.
Reg tested and bootstrapped on x86-linux-gnu and aarch64-linux-gnu.
FMV tests ran for PowerPC and RiscV.
Kind regards,
Alfie Richards
Alfie Richards (17):
Add string_slice class.
Remove unnecessary `record` argument from maybe_version_functions.
Update is_function_default_version to work with target_version.
Change function versions to be implicitly ordered.
Change make_attribute to take string_slice.
Add get_clone_versions and get_version functions.
Add assembler_name to cgraph_function_version_info.
Add dispatcher_resolver_function and is_target_clone to cgraph_node.
Add clone_identifier function.
Refactor FMV name mangling.
Refactor riscv target parsing to take string_slice.
Add regect_target_clone hook and filter target_clone versions.
Change target_version semantics to follow ACLE specification.
Refactor FMV frontend hooks and logic.
Support mixing of target_clones and target_version.
Add error cases and tests for Aarch64 FMV.
Remove FMV beta warning.
Andrew Carlotti (2):
Add PowerPC FMV symbol tests.
Add x86 FMV symbol tests
gcc/attribs.cc | 252 +++++----------
gcc/attribs.h | 6 +-
gcc/c-family/c-attribs.cc | 29 +-
gcc/c-family/c-format.cc | 9 +
gcc/c-family/c-format.h | 1 +
gcc/cgraph.cc | 28 +-
gcc/cgraph.h | 20 +-
gcc/cgraphclones.cc | 16 +-
gcc/cgraphunit.cc | 9 +
gcc/config/aarch64/aarch64.cc | 247 ++++++--------
gcc/config/aarch64/aarch64.opt | 2 +-
gcc/config/i386/i386-features.cc | 141 ++++----
gcc/config/i386/i386.cc | 3 +
gcc/config/riscv/riscv-protos.h | 2 +
gcc/config/riscv/riscv-target-attr.cc | 14 +-
gcc/config/riscv/riscv.cc | 231 ++++++-------
gcc/config/rs6000/rs6000.cc | 153 ++++++---
gcc/cp/call.cc | 10 +
gcc/cp/class.cc | 19 +-
gcc/cp/cp-gimplify.cc | 11 +-
gcc/cp/cp-tree.h | 4 +-
gcc/cp/decl.cc | 79 ++++-
gcc/cp/decl2.cc | 2 +-
gcc/cp/typeck.cc | 10 +
gcc/doc/invoke.texi | 5 +-
gcc/doc/tm.texi | 9 +-
gcc/doc/tm.texi.in | 2 +
gcc/ipa.cc | 11 +
gcc/multiple_target.cc | 304 +++++++++---------
gcc/pretty-print.cc | 10 +
gcc/target.def | 14 +-
gcc/testsuite/g++.target/aarch64/mv-1.C | 5 +-
.../g++.target/aarch64/mv-and-mvc-error1.C | 9 +
.../g++.target/aarch64/mv-and-mvc-error2.C | 9 +
.../g++.target/aarch64/mv-and-mvc-error3.C | 8 +
.../g++.target/aarch64/mv-and-mvc1.C | 37 +++
.../g++.target/aarch64/mv-and-mvc2.C | 28 ++
.../g++.target/aarch64/mv-and-mvc3.C | 40 +++
.../g++.target/aarch64/mv-and-mvc4.C | 37 +++
gcc/testsuite/g++.target/aarch64/mv-error1.C | 18 ++
gcc/testsuite/g++.target/aarch64/mv-error2.C | 9 +
gcc/testsuite/g++.target/aarch64/mv-error3.C | 12 +
gcc/testsuite/g++.target/aarch64/mv-error4.C | 9 +
gcc/testsuite/g++.target/aarch64/mv-error5.C | 8 +
gcc/testsuite/g++.target/aarch64/mv-error6.C | 20 ++
gcc/testsuite/g++.target/aarch64/mv-error7.C | 11 +
gcc/testsuite/g++.target/aarch64/mv-error8.C | 12 +
gcc/testsuite/g++.target/aarch64/mv-pragma.C | 1 -
.../g++.target/aarch64/mv-symbols1.C | 1 -
.../g++.target/aarch64/mv-symbols10.C | 26 ++
.../g++.target/aarch64/mv-symbols11.C | 29 ++
.../g++.target/aarch64/mv-symbols12.C | 27 ++
.../g++.target/aarch64/mv-symbols13.C | 27 ++
.../g++.target/aarch64/mv-symbols2.C | 13 +-
.../g++.target/aarch64/mv-symbols3.C | 7 +-
.../g++.target/aarch64/mv-symbols4.C | 7 +-
.../g++.target/aarch64/mv-symbols5.C | 7 +-
.../g++.target/aarch64/mv-symbols6.C | 24 ++
.../g++.target/aarch64/mv-symbols7.C | 47 +++
.../g++.target/aarch64/mv-symbols8.C | 45 +++
.../g++.target/aarch64/mv-symbols9.C | 42 +++
.../g++.target/aarch64/mv-warning1.C | 9 -
gcc/testsuite/g++.target/aarch64/mvc-error1.C | 9 +
gcc/testsuite/g++.target/aarch64/mvc-error2.C | 9 +
.../g++.target/aarch64/mvc-symbols1.C | 1 -
.../g++.target/aarch64/mvc-symbols2.C | 1 -
.../g++.target/aarch64/mvc-symbols3.C | 13 +-
.../g++.target/aarch64/mvc-symbols4.C | 1 -
.../g++.target/aarch64/mvc-warning1.C | 11 +-
gcc/testsuite/g++.target/i386/mv-symbols1.C | 68 ++++
gcc/testsuite/g++.target/i386/mv-symbols2.C | 56 ++++
gcc/testsuite/g++.target/i386/mv-symbols3.C | 44 +++
gcc/testsuite/g++.target/i386/mv-symbols4.C | 50 +++
gcc/testsuite/g++.target/i386/mv-symbols5.C | 56 ++++
gcc/testsuite/g++.target/i386/mvc-symbols1.C | 44 +++
gcc/testsuite/g++.target/i386/mvc-symbols2.C | 29 ++
gcc/testsuite/g++.target/i386/mvc-symbols3.C | 35 ++
gcc/testsuite/g++.target/i386/mvc-symbols4.C | 23 ++
.../g++.target/powerpc/mvc-symbols1.C | 47 +++
.../g++.target/powerpc/mvc-symbols2.C | 35 ++
.../g++.target/powerpc/mvc-symbols3.C | 41 +++
.../g++.target/powerpc/mvc-symbols4.C | 29 ++
gcc/testsuite/g++.target/riscv/mv-symbols2.C | 12 +-
gcc/testsuite/g++.target/riscv/mv-symbols3.C | 6 +-
gcc/testsuite/g++.target/riscv/mv-symbols4.C | 6 +-
gcc/testsuite/g++.target/riscv/mv-symbols5.C | 6 +-
gcc/testsuite/g++.target/riscv/mvc-symbols3.C | 12 +-
gcc/tree.cc | 224 +++++++++++--
gcc/tree.h | 21 +-
gcc/vec.cc | 207 ++++++++++++
gcc/vec.h | 45 +++
91 files changed, 2504 insertions(+), 874 deletions(-)
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error1.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error2.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc-error3.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc1.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc2.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc3.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-and-mvc4.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error1.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error2.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error3.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error4.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error5.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error6.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error7.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-error8.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols10.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols11.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols12.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols13.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols7.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols8.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols9.C
delete mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-error1.C
create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-error2.C
create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols1.C
create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols2.C
create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols3.C
create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols4.C
create mode 100644 gcc/testsuite/g++.target/i386/mv-symbols5.C
create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols1.C
create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols2.C
create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols3.C
create mode 100644 gcc/testsuite/g++.target/i386/mvc-symbols4.C
create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols1.C
create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols2.C
create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols3.C
create mode 100644 gcc/testsuite/g++.target/powerpc/mvc-symbols4.C