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

Reply via email to