Hi all, Another update to this series.
This patch changes the version info structure to be sorted by priority. This allows easier reasoning for optimisations and prevents having to calculate the priority of functions repeatedly. The other change is that the target_clones pass was split in two. This is because the target_clones pass now dispatches the target_versions and target_clones, and different versions may have arbitrarily idfferent bodies. Therefore, allowing passes like efvp before dispatching made some invalid optimisations. However, as Alice Carlotti (alice.carlo...@arm.com) pointed out offline, the target_clones pass was likely put in this position late as for target_clones it is valid, as all the versions have the same body. So I split it in two. In the early stage complicated cases where there are multiple decls are expanded and dispatched. In the later stages, the simple case of a lone target_clones decl is dispatched (as is always the case for TARGET_HAS_FMV_TARGET_ATTRIBUTE targets). Regression tested and bootstrapped for aarch64-none-linux-gnu and x86_64-unknown-linux-gnu. Cross compiled and checked FMV tests for riscv and powerpc. Hoping for GCC16 stage 1 for this. I have a Forgejo PR if reviewers want to try using that for review: https://forge.sourceware.org/gcc/gcc-TEST/pulls/49 Kind regards, Alfie Change log ========== V4: - Changed version_info structure to be sorted by priority - Split the target_clones pass into early/late stages - Split out fix for PR c++/119498 V3: https://gcc.gnu.org/pipermail/gcc-patches/2025-March/679488.html - Added reject target_clones version logic and hook - Added pretty print for string_slice - Refactored merging and conflict logic in front end - Improved diagnostics V2: https://gcc.gnu.org/pipermail/gcc-patches/2025-February/675960.html - Changed recording of assembly name to be done in version into initialisation - Changed behaviour for a lone default decl V1: https://gcc.gnu.org/pipermail/gcc-patches/2025-February/674973.htmlhttps://gcc.gnu.org/pipermail/gcc-patches/2025-February/674973.html - Initial Alfie Richards (18): Add string_slice class. Remove unnecessary `record` argument from maybe_version_functions. Update is_function_default_version to work with target_version (Approved). Refactor record_function_versions. Change make_attribute to take string_slice (Approved). Add get_clone_versions and get_target_version functions. Add assembler_name to cgraph_function_version_info. Add dispatcher_resolver_function and is_target_clone flags to cgraph_node. Add clone_identifier function. Refactor FMV name mangling. Refactor riscv target parsing to take string_slice. Add reject_target_clone hook for filtering target_clone versions. Change target_version semantics to follow ACLE specification. Refactor FMV frontend conflict and merging logic and hooks. Support mixing of target_clones and target_version. Fix FMV return type ambiguation Add diagnostic tests for Aarch64 FMV. Remove FMV beta warning. Alice Carlotti (2): Add PowerPC FMV symbol tests. Add x86 FMV symbol tests gcc/attribs.cc | 170 ++++--- gcc/attribs.h | 5 +- gcc/c-family/c-attribs.cc | 33 +- gcc/c-family/c-format.cc | 7 + gcc/c-family/c-format.h | 1 + gcc/cgraph.cc | 80 ++-- gcc/cgraph.h | 29 +- gcc/cgraphclones.cc | 16 +- gcc/cgraphunit.cc | 9 + gcc/config/aarch64/aarch64.cc | 273 +++++------- gcc/config/aarch64/aarch64.opt | 2 +- gcc/config/i386/i386-features.cc | 141 +++--- gcc/config/riscv/riscv-protos.h | 2 + gcc/config/riscv/riscv-target-attr.cc | 14 +- gcc/config/riscv/riscv.cc | 267 +++++------ gcc/config/rs6000/rs6000.cc | 150 +++++-- 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 | 90 +++- gcc/cp/decl2.cc | 2 +- gcc/cp/typeck.cc | 10 + gcc/doc/invoke.texi | 5 +- gcc/doc/tm.texi | 16 +- gcc/doc/tm.texi.in | 2 + gcc/hooks.cc | 13 + gcc/hooks.h | 4 + gcc/ipa.cc | 11 + gcc/multiple_target.cc | 421 ++++++++++-------- gcc/passes.def | 3 +- gcc/pretty-print.cc | 10 + gcc/target.def | 21 +- 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 | 20 + .../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 | 283 +++++++++++- gcc/tree.h | 21 +- gcc/vec.cc | 207 +++++++++ gcc/vec.h | 45 ++ 93 files changed, 2718 insertions(+), 913 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 -- 2.34.1