https://gcc.gnu.org/g:e5798872281de0c4c2e87587cbb562552048ccdb

commit r15-7090-ge5798872281de0c4c2e87587cbb562552048ccdb
Author: Alfie Richards <alfie.richa...@arm.com>
Date:   Thu Jan 9 09:45:32 2025 +0000

    Add warning for non-spec compliant FMV in Aarch64
    
    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.
            * doc/invoke.texi: Add documentation for 
-W[no-]experimental-fmv-target.
    
    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/mv-warning1.C: New test.
            * 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/mvc-warning1.C: New test.

Diff:
---
 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-pragma.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 ++++++
 16 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 1dbbc9c3cf9b..dba779a8e51e 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 da9e0c18d477..7e309d9efe46 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 72811042700b..75fbe8838f48 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
@@ -21881,6 +21882,14 @@ hardware SVE vector lengths.
 
 The default is @samp{-msve-vector-bits=scalable}, which produces
 vector-length agnostic code.
+
+@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.
 @end table
 
 @subsubsection @option{-march} and @option{-mcpu} Feature Modifiers
diff --git a/gcc/testsuite/g++.target/aarch64/mv-1.C 
b/gcc/testsuite/g++.target/aarch64/mv-1.C
index b4b0e5e3fea0..b10037f1b9ba 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-pragma.C 
b/gcc/testsuite/g++.target/aarch64/mv-pragma.C
index 545d0735438d..6e5929328bbf 100644
--- a/gcc/testsuite/g++.target/aarch64/mv-pragma.C
+++ b/gcc/testsuite/g++.target/aarch64/mv-pragma.C
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-require-ifunc "" } */
 /* { dg-options "-O0" } */
+/* { dg-additional-options "-Wno-experimental-fmv-target" } */
 
 #pragma GCC target ("+sve")
 
diff --git a/gcc/testsuite/g++.target/aarch64/mv-symbols1.C 
b/gcc/testsuite/g++.target/aarch64/mv-symbols1.C
index 53e0abcd9b43..73cde42fa343 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 f0c7967a97ab..6da88ddfb48d 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 3d30e27deb8b..5dd7b49be2a1 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 73e3279ec314..4b25d17cc15a 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 05d1379f53ec..fac00b203135 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 000000000000..6346c1673a2e
--- /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 2dd7c79f16cf..983194d74af2 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 75b9c126dd8c..58a797947cea 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 82e777c8fc6e..350a5586643f 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 6c86ae61e5fa..9c8a7bd37f27 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 000000000000..59acec3fad2f
--- /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" } */

Reply via email to