aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfie Richards <alfie.richards@arm.com>2025-01-09 09:45:32 +0000
committerAlfie Richards <alfie.richards@arm.com>2025-01-21 08:57:24 +0000
commite5798872281de0c4c2e87587cbb562552048ccdb (patch)
treeab11ce18edc11f683560290da4646dd258b01a36
parentf31d49d65412d03d2cf91dd3b8b7281815c6d03b (diff)
downloadgcc-e5798872281de0c4c2e87587cbb562552048ccdb.zip
gcc-e5798872281de0c4c2e87587cbb562552048ccdb.tar.gz
gcc-e5798872281de0c4c2e87587cbb562552048ccdb.tar.bz2
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.
-rw-r--r--gcc/config/aarch64/aarch64.cc9
-rw-r--r--gcc/config/aarch64/aarch64.opt4
-rw-r--r--gcc/doc/invoke.texi11
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-1.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-pragma.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-symbols1.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-symbols2.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-symbols3.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-symbols4.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-symbols5.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mv-warning1.C9
-rw-r--r--gcc/testsuite/g++.target/aarch64/mvc-symbols1.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mvc-symbols2.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mvc-symbols3.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mvc-symbols4.C1
-rw-r--r--gcc/testsuite/g++.target/aarch64/mvc-warning1.C6
16 files changed, 49 insertions, 1 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 1dbbc9c..dba779a 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 da9e0c1..7e309d9 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 7281104..75fbe88 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 b4b0e5e..b10037f 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 545d073..6e59293 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 53e0abc..73cde42 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 f0c7967..6da88dd 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 3d30e27..5dd7b49 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 73e3279..4b25d17 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 05d1379..fac00b2 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 0000000..6346c16
--- /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 2dd7c79..983194d 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 75b9c12..58a7979 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 82e777c..350a558 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 6c86ae6..9c8a7bd 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 0000000..59acec3
--- /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" } */