Hi All, Resending due to some email issues resulting in undelivered email.
Thank you so much for the reviews. This revision is mostly addressing feedback from Richard S. Changes since V8: - Several stylistic changes/code clarity. - Change check_target_clone_version to take a pointer to location_t rather than location_t and bool. - Clarified the logic in redirect_to_specific_clone and added a check that the caller must have its default defined in the current TU for the FMV set calling FMV set part of the optimization to be valid. The main outstanding changes to review are the C and C++ front end changes now. Bootstrapped and reg tested on Aarch64 and x86. Still hoping for GCC 16 for this, we're keen to get this synced with LLVM before we start pushing it for users. Kind regards, Alfie Patches ======= Alfie Richards (13): cgraph: Add clone_identifier function. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-August/692100.html) fmv: Refactor FMV name mangling. Approved except C++, x86, and RISC-V changes. riscv: Refactor riscv target parsing to take string_slice. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-June/687986.html) fmv: Add check_target_clone hook for filtering target_clone versions. Changed substantially to address feedback, needs re-review. fmv: Change target_version semantics to follow ACLE specification. Approved except C++ front end changes. c/c++: Add target_[version/clones] to decl diagnostics formatting. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-June/687988.html) c++: Refactor FMV frontend conflict and merging logic and hooks. Needs review. fmv: Support mixing of target_clones and target_version. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-August/691401.html) aarch64: testsuite: Add diagnostic tests for Aarch64 FMV. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-July/690688.html) aarch64: Remove FMV beta warning. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-July/690689.html) c: Add target_version attribute support. Needs review. c/aarch64: Add FMV diagnostic tests. Approved (https://gcc.gnu.org/pipermail/gcc-patches/2025-July/690690.html) FMV: Redirect to specific target Approved, but with minor logic changes possibly needing re-review. Change log ========== V9: - Addressed nits and feedback - Fixed login in redirect_to_specific_clone V8: (can't find link on pipermail?) - Addressed nits and feedback - Changed clone_identifier function. - Shuffled some changes and code paths to where they are actually relevant. - Changed the a_implies_b hook quite substantially. V7: https://gcc.gnu.org/pipermail/gcc-patches/2025-July/690784.html - Removed committed patches and rebased - Addressed Jasons formatting comments V6: https://gcc.gnu.org/pipermail/gcc-patches/2025-June/686662.html - Merged "Add assembler_name to cgraph_function_version_info" and "fmv: Refactor FMV name mangling" patches into one. - Removed committed patches. V5: https://gcc.gnu.org/pipermail/gcc-patches/2025-May/685058.html - Merged patch series with C support series, and FMV call inlining optimization - Addressed Jason's feedback and simplified the diagnostics for FMV. V4: https://gcc.gnu.org/pipermail/gcc-patches/2025-April/681047.html - 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.html - Initial gcc/attribs.cc | 151 +++-- gcc/attribs.h | 3 +- gcc/c-family/c-attribs.cc | 32 +- gcc/c-family/c-pretty-print.cc | 81 +++ gcc/c-family/c-pretty-print.h | 2 + gcc/c/c-decl.cc | 115 ++++ gcc/c/c-objc-common.cc | 6 + gcc/cgraph.cc | 5 +- gcc/cgraph.h | 24 +- gcc/cgraphclones.cc | 58 +- gcc/cgraphunit.cc | 9 + gcc/config/aarch64/aarch64.cc | 325 ++++++----- gcc/config/aarch64/aarch64.opt | 2 +- gcc/config/i386/i386-features.cc | 74 +-- gcc/config/riscv/riscv-protos.h | 2 + gcc/config/riscv/riscv-target-attr.cc | 14 +- gcc/config/riscv/riscv.cc | 245 ++++---- gcc/config/rs6000/rs6000.cc | 82 ++- gcc/cp/call.cc | 10 + gcc/cp/class.cc | 16 +- gcc/cp/cp-gimplify.cc | 11 +- gcc/cp/cxx-pretty-print.h | 4 + gcc/cp/decl.cc | 29 +- gcc/cp/decl2.cc | 2 +- gcc/cp/error.cc | 3 + gcc/cp/typeck.cc | 10 + gcc/doc/invoke.texi | 5 +- gcc/doc/tm.texi | 37 +- gcc/doc/tm.texi.in | 4 + gcc/hooks.cc | 15 + gcc/hooks.h | 4 + gcc/ipa.cc | 11 + gcc/multiple_target.cc | 546 ++++++++++-------- gcc/passes.def | 3 +- gcc/target.def | 52 +- .../g++.target/aarch64/fmv-selection1.C | 40 ++ .../g++.target/aarch64/fmv-selection2.C | 40 ++ .../g++.target/aarch64/fmv-selection3.C | 25 + .../g++.target/aarch64/fmv-selection4.C | 30 + .../g++.target/aarch64/fmv-selection5.C | 28 + .../g++.target/aarch64/fmv-selection6.C | 27 + .../g++.target/aarch64/fmv-selection7.C | 65 +++ 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 | 12 +- gcc/testsuite/g++.target/i386/mv-symbols3.C | 10 +- gcc/testsuite/g++.target/i386/mv-symbols4.C | 10 +- gcc/testsuite/g++.target/i386/mv-symbols5.C | 10 +- 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/testsuite/gcc.target/aarch64/mv-1.c | 43 ++ .../gcc.target/aarch64/mv-and-mvc-error1.c | 9 + .../gcc.target/aarch64/mv-and-mvc-error2.c | 9 + .../gcc.target/aarch64/mv-and-mvc-error3.c | 8 + .../gcc.target/aarch64/mv-and-mvc1.c | 37 ++ .../gcc.target/aarch64/mv-and-mvc2.c | 28 + .../gcc.target/aarch64/mv-and-mvc3.c | 40 ++ .../gcc.target/aarch64/mv-and-mvc4.c | 37 ++ gcc/testsuite/gcc.target/aarch64/mv-error1.c | 18 + gcc/testsuite/gcc.target/aarch64/mv-error2.c | 9 + gcc/testsuite/gcc.target/aarch64/mv-error3.c | 12 + gcc/testsuite/gcc.target/aarch64/mv-error4.c | 9 + gcc/testsuite/gcc.target/aarch64/mv-error5.c | 8 + gcc/testsuite/gcc.target/aarch64/mv-error6.c | 20 + gcc/testsuite/gcc.target/aarch64/mv-error7.c | 11 + gcc/testsuite/gcc.target/aarch64/mv-error8.c | 12 + gcc/testsuite/gcc.target/aarch64/mv-error9.c | 12 + .../gcc.target/aarch64/mv-symbols1.c | 38 ++ .../gcc.target/aarch64/mv-symbols10.c | 42 ++ .../gcc.target/aarch64/mv-symbols11.c | 16 + .../gcc.target/aarch64/mv-symbols12.c | 27 + .../gcc.target/aarch64/mv-symbols13.c | 28 + .../gcc.target/aarch64/mv-symbols14.c | 34 ++ .../gcc.target/aarch64/mv-symbols2.c | 28 + .../gcc.target/aarch64/mv-symbols3.c | 27 + .../gcc.target/aarch64/mv-symbols4.c | 31 + .../gcc.target/aarch64/mv-symbols5.c | 36 ++ .../gcc.target/aarch64/mv-symbols6.c | 20 + .../gcc.target/aarch64/mv-symbols7.c | 47 ++ .../gcc.target/aarch64/mv-symbols8.c | 47 ++ .../gcc.target/aarch64/mv-symbols9.c | 44 ++ gcc/testsuite/gcc.target/aarch64/mvc-error1.c | 9 + gcc/testsuite/gcc.target/aarch64/mvc-error2.c | 9 + .../gcc.target/aarch64/mvc-symbols1.c | 25 + .../gcc.target/aarch64/mvc-symbols2.c | 15 + .../gcc.target/aarch64/mvc-symbols3.c | 19 + .../gcc.target/aarch64/mvc-symbols4.c | 12 + .../gcc.target/aarch64/mvc-warning1.c | 13 + gcc/tree.cc | 286 ++++++++- gcc/tree.h | 20 +- 129 files changed, 3331 insertions(+), 820 deletions(-) create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection1.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection2.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection3.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection4.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection5.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection6.C create mode 100644 gcc/testsuite/g++.target/aarch64/fmv-selection7.C 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/gcc.target/aarch64/mv-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc-error3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-and-mvc4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-error9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols10.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols11.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols12.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols13.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols14.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols7.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols8.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols9.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-error2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-warning1.c -- 2.34.1 -- Alfie Richards