This patch adds a warning when FMV is used for Aarch64. The reasoning for this is the ACLE [1] spec for FMV has diverged significantly from the current implementation and we want to prevent potential future compatability issues.
There is a patch for an ACLE compliant version of target_version and target_clone in progress but it won't make gcc-15. This has been bootstrap and regression tested for Aarch64. Is this okay for master and packport to gcc-14? [1] https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_process_target_version_attr): Add experimental warning. * config/aarch64/aarch64.opt: Add command line option to disable warning. gcc/testsuite/ChangeLog: * g++.target/aarch64/mv-1.C: Add CLI flag * g++.target/aarch64/mv-symbols1.C: Add CLI flag * g++.target/aarch64/mv-symbols2.C: Add CLI flag * g++.target/aarch64/mv-symbols3.C: Add CLI flag * g++.target/aarch64/mv-symbols4.C: Add CLI flag * g++.target/aarch64/mv-symbols5.C: Add CLI flag * g++.target/aarch64/mvc-symbols1.C: Add CLI flag * g++.target/aarch64/mvc-symbols2.C: Add CLI flag * g++.target/aarch64/mvc-symbols3.C: Add CLI flag * g++.target/aarch64/mvc-symbols4.C: Add CLI flag * g++.target/aarch64/mv-pragma.C: Add CLI flag * g++.target/aarch64/mv-warning1.C: New test. * g++.target/aarch64/mcv-warning1.C: New test. --- gcc/config/aarch64/aarch64.cc | 9 +++++++++ gcc/config/aarch64/aarch64.opt | 4 ++++ gcc/doc/invoke.texi | 11 ++++++++++- gcc/testsuite/g++.target/aarch64/mv-1.C | 1 + gcc/testsuite/g++.target/aarch64/mv-symbols1.C | 1 + gcc/testsuite/g++.target/aarch64/mv-symbols2.C | 1 + gcc/testsuite/g++.target/aarch64/mv-symbols3.C | 1 + gcc/testsuite/g++.target/aarch64/mv-symbols4.C | 1 + gcc/testsuite/g++.target/aarch64/mv-symbols5.C | 1 + gcc/testsuite/g++.target/aarch64/mv-warning1.C | 9 +++++++++ gcc/testsuite/g++.target/aarch64/mvc-symbols1.C | 1 + gcc/testsuite/g++.target/aarch64/mvc-symbols2.C | 1 + gcc/testsuite/g++.target/aarch64/mvc-symbols3.C | 1 + gcc/testsuite/g++.target/aarch64/mvc-symbols4.C | 1 + gcc/testsuite/g++.target/aarch64/mvc-warning1.C | 6 ++++++ 15 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-warning1.C
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 1dbbc9c3cf9..dba779a8e51 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -20257,6 +20257,15 @@ aarch64_parse_fmv_features (const char *str, aarch64_feature_flags *isa_flags, static bool aarch64_process_target_version_attr (tree args) { + static bool issued_warning = false; + if (!issued_warning) + { + warning (OPT_Wexperimental_fmv_target, + "Function Multi Versioning support is experimental, and the " + "behavior is likely to change"); + issued_warning = true; + } + if (TREE_CODE (args) == TREE_LIST) { if (TREE_CHAIN (args)) diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt index da9e0c18d47..7e309d9efe4 100644 --- a/gcc/config/aarch64/aarch64.opt +++ b/gcc/config/aarch64/aarch64.opt @@ -431,3 +431,7 @@ handling. One means we try to form pairs involving one or more existing individual writeback accesses where possible. A value of two means we also try to opportunistically form writeback opportunities by folding in trailing destructive updates of the base register used by a pair. + +Wexperimental-fmv-target +Target Var(warn_experimental_fmv) Warning Init(1) +Warn about usage of experimental Function Multi Versioning. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 13afb4a0d0d..4d1612ce7cb 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -827,7 +827,8 @@ Objective-C and Objective-C++ Dialects}. -moverride=@var{string} -mverbose-cost-dump -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{sysreg} -mstack-protector-guard-offset=@var{offset} -mtrack-speculation --moutline-atomics -mearly-ldp-fusion -mlate-ldp-fusion} +-moutline-atomics -mearly-ldp-fusion -mlate-ldp-fusion +-Wexperimental-fmv-target} @emph{Adapteva Epiphany Options} (@ref{Adapteva Epiphany Options}) @gccoptlist{-mhalf-reg-file -mprefer-short-insn-regs @@ -21882,6 +21883,14 @@ The default is @samp{-msve-vector-bits=scalable}, which produces vector-length agnostic code. @end table +@opindex Wexperimental-fmv-target +@opindex Wno-experimental-fmv-target +@item -Wexperimental-fmv-target +Warn about use of experimental Function Multi Versioning. +The Arm C Language Extension specification for Function Multi Versioning +is beta and subject to change. Any usage of FMV is caveated that future +behavior change and incompatibility is likely. + @subsubsection @option{-march} and @option{-mcpu} Feature Modifiers @anchor{aarch64-feature-modifiers} @cindex @option{-march} feature modifiers diff --git a/gcc/testsuite/g++.target/aarch64/mv-1.C b/gcc/testsuite/g++.target/aarch64/mv-1.C index b4b0e5e3fea..b10037f1b9b 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-1.C +++ b/gcc/testsuite/g++.target/aarch64/mv-1.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_version("default"))) int foo () diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols1.C b/gcc/testsuite/g++.target/aarch64/mv-symbols1.C index 53e0abcd9b4..73cde42fa34 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-symbols1.C +++ b/gcc/testsuite/g++.target/aarch64/mv-symbols1.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ int foo () { diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols2.C b/gcc/testsuite/g++.target/aarch64/mv-symbols2.C index f0c7967a97a..6da88ddfb48 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-symbols2.C +++ b/gcc/testsuite/g++.target/aarch64/mv-symbols2.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_version("default"))) int foo () diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols3.C b/gcc/testsuite/g++.target/aarch64/mv-symbols3.C index 3d30e27deb8..5dd7b49be2a 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-symbols3.C +++ b/gcc/testsuite/g++.target/aarch64/mv-symbols3.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_version("default"))) int foo (); diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols4.C b/gcc/testsuite/g++.target/aarch64/mv-symbols4.C index 73e3279ec31..4b25d17cc15 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-symbols4.C +++ b/gcc/testsuite/g++.target/aarch64/mv-symbols4.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_version("default"))) int foo () diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols5.C b/gcc/testsuite/g++.target/aarch64/mv-symbols5.C index 05d1379f53e..fac00b20313 100644 --- a/gcc/testsuite/g++.target/aarch64/mv-symbols5.C +++ b/gcc/testsuite/g++.target/aarch64/mv-symbols5.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_version("default"))) int foo (); diff --git a/gcc/testsuite/g++.target/aarch64/mv-warning1.C b/gcc/testsuite/g++.target/aarch64/mv-warning1.C new file mode 100644 index 00000000000..6346c1673a2 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/mv-warning1.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O0" } */ + +__attribute__((target_version("default"))) +int foo () { return 1; }/* { dg-warning "Function Multi Versioning support is experimental, and the behavior is likely to change" } */ + +__attribute__((target_version("rng"))) +int foo () { return 1; } diff --git a/gcc/testsuite/g++.target/aarch64/mvc-symbols1.C b/gcc/testsuite/g++.target/aarch64/mvc-symbols1.C index 2dd7c79f16c..983194d74af 100644 --- a/gcc/testsuite/g++.target/aarch64/mvc-symbols1.C +++ b/gcc/testsuite/g++.target/aarch64/mvc-symbols1.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_clones("default", "dotprod", "sve+sve2"))) int foo () diff --git a/gcc/testsuite/g++.target/aarch64/mvc-symbols2.C b/gcc/testsuite/g++.target/aarch64/mvc-symbols2.C index 75b9c126dd8..58a797947ce 100644 --- a/gcc/testsuite/g++.target/aarch64/mvc-symbols2.C +++ b/gcc/testsuite/g++.target/aarch64/mvc-symbols2.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_clones("default", "dotprod", "sve+sve2"))) int foo () diff --git a/gcc/testsuite/g++.target/aarch64/mvc-symbols3.C b/gcc/testsuite/g++.target/aarch64/mvc-symbols3.C index 82e777c8fc6..350a5586643 100644 --- a/gcc/testsuite/g++.target/aarch64/mvc-symbols3.C +++ b/gcc/testsuite/g++.target/aarch64/mvc-symbols3.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_clones("default", "dotprod", "sve+sve2"))) int foo (); diff --git a/gcc/testsuite/g++.target/aarch64/mvc-symbols4.C b/gcc/testsuite/g++.target/aarch64/mvc-symbols4.C index 6c86ae61e5f..9c8a7bd37f2 100644 --- a/gcc/testsuite/g++.target/aarch64/mvc-symbols4.C +++ b/gcc/testsuite/g++.target/aarch64/mvc-symbols4.C @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-require-ifunc "" } */ /* { dg-options "-O0" } */ +/* { dg-additional-options "-Wno-experimental-fmv-target" } */ __attribute__((target_clones("default", "dotprod", "sve+sve2"))) int foo (); diff --git a/gcc/testsuite/g++.target/aarch64/mvc-warning1.C b/gcc/testsuite/g++.target/aarch64/mvc-warning1.C new file mode 100644 index 00000000000..59acec3fad2 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/mvc-warning1.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O0" } */ + +__attribute__((target_clones("default", "sve"))) +int foo () { return 1; }/* { dg-warning "Function Multi Versioning support is experimental, and the behavior is likely to change" } */