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


Reply via email to