]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add warning for non-spec compliant FMV in Aarch64
authorAlfie Richards <alfie.richards@arm.com>
Thu, 9 Jan 2025 09:45:32 +0000 (09:45 +0000)
committerAlfie Richards <alfie.richards@arm.com>
Tue, 21 Jan 2025 08:57:24 +0000 (08:57 +0000)
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.

16 files changed:
gcc/config/aarch64/aarch64.cc
gcc/config/aarch64/aarch64.opt
gcc/doc/invoke.texi
gcc/testsuite/g++.target/aarch64/mv-1.C
gcc/testsuite/g++.target/aarch64/mv-pragma.C
gcc/testsuite/g++.target/aarch64/mv-symbols1.C
gcc/testsuite/g++.target/aarch64/mv-symbols2.C
gcc/testsuite/g++.target/aarch64/mv-symbols3.C
gcc/testsuite/g++.target/aarch64/mv-symbols4.C
gcc/testsuite/g++.target/aarch64/mv-symbols5.C
gcc/testsuite/g++.target/aarch64/mv-warning1.C [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/mvc-symbols1.C
gcc/testsuite/g++.target/aarch64/mvc-symbols2.C
gcc/testsuite/g++.target/aarch64/mvc-symbols3.C
gcc/testsuite/g++.target/aarch64/mvc-symbols4.C
gcc/testsuite/g++.target/aarch64/mvc-warning1.C [new file with mode: 0644]

index 1dbbc9c3cf9b2afba80fa05d6b37e11d5780169e..dba779a8e51e4262a9e7e8b8a72253b355741019 100644 (file)
@@ -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))
index da9e0c18d47781dee1b954735cbc28da1e7f1846..7e309d9efe46a3eb073f948316441a2cb90959d3 100644 (file)
@@ -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.
index 72811042700b5a5be363e191d6377cf32e4884da..75fbe8838f48c06f29cb89988a12271f8714aa05 100644 (file)
@@ -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
index b4b0e5e3fea0ed481de1918d30cd8248bb4f7ab5..b10037f1b9bae4a593fe59f6913c937c072c97e2 100644 (file)
@@ -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 ()
index 545d0735438d4774a2cb909f28584ddbf4f54d2a..6e5929328bbf1488401e9cc1f0b2938b7a568bc7 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-require-ifunc "" } */
 /* { dg-options "-O0" } */
+/* { dg-additional-options "-Wno-experimental-fmv-target" } */
 
 #pragma GCC target ("+sve")
 
index 53e0abcd9b4333590a4c1415ec56cf09fb1ce2bf..73cde42fa3431f7e4eb06030b39607b7361d6d88 100644 (file)
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-require-ifunc "" } */
 /* { dg-options "-O0" } */
+/* { dg-additional-options "-Wno-experimental-fmv-target" } */
 
 int foo ()
 {
index f0c7967a97abb31f3cf9430ae9e8bb807beb8485..6da88ddfb48d777287c30a220eb2eabfac8fdd87 100644 (file)
@@ -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 ()
index 3d30e27deb8b54b838cd8f5f18d5b68e87f4515e..5dd7b49be2a161a7f8d345f7a0dc9f682b2957dd 100644 (file)
@@ -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 ();
index 73e3279ec314a5e5be3c6f8f1d2b6a520e639d27..4b25d17cc15a8c706b191353732677f5f113281c 100644 (file)
@@ -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 ()
index 05d1379f53ec1b74c29d386c8bd43a81de7ed0e4..fac00b203135e659fd4f8ace217820a5e8c18f25 100644 (file)
@@ -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 (file)
index 0000000..6346c16
--- /dev/null
@@ -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; }
index 2dd7c79f16cf7b6ac715c2ad2b35fface2695bed..983194d74af223916fe798e8d19da25ec0b89076 100644 (file)
@@ -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 ()
index 75b9c126dd8c337ac983862e3ba736a2c2c9a5ac..58a797947cea056130d23980f172d714d0547504 100644 (file)
@@ -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 ()
index 82e777c8fc6ef5fa45aed431641a928b1960303a..350a5586643fb82ed3e90cfdac10a826a742de1b 100644 (file)
@@ -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 ();
index 6c86ae61e5fa52d14ed28cebb41d5fd8a7e1552f..9c8a7bd37f279eba78d0d412172c958a9f077140 100644 (file)
@@ -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 (file)
index 0000000..59acec3
--- /dev/null
@@ -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" } */