[PATCH v1 1/2] Aarch64: Add test for non-commutative SIMD intrinsic

2024-07-03 Thread alfie.richards

This adds a test for non-commutative SIMD NEON intrinsics.
Specifically addp is non-commutative and has a bug in the current big-endian 
implementation.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/vector_intrinsics_asm.c: New test.
---
 .../aarch64/vector_intrinsics_asm.c   | 371 ++
 1 file changed, 371 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c

diff --git a/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c b/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c
new file mode 100644
index 000..b7d5620abab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c
@@ -0,0 +1,371 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { check-function-bodies "**" "" "" { xfail be } } } */
+
+#include "arm_neon.h"
+
+// SIGNED VADD INTRINSICS
+
+/*
+**test_vadd_s8:
+**	addp	v0\.8b, v0\.8b, v1\.8b
+**	ret
+*/
+int8x8_t test_vadd_s8(int8x8_t v1, int8x8_t v2) {
+ int8x8_t v3 = vpadd_s8(v1, v2);
+ return v3;
+}
+
+/*
+**test_vadd_s16:
+**addp	v0\.4h, v0\.4h, v1\.4h
+**ret
+*/
+int16x4_t test_vadd_s16(int16x4_t v1, int16x4_t v2) {
+ int16x4_t v3 = vpadd_s16(v1, v2);
+ return v3;
+}
+
+/*
+**test_vadd_s32:
+**	addp	v0\.2s, v0\.2s, v1\.2s
+**	ret
+*/
+int32x2_t test_vadd_s32(int32x2_t v1, int32x2_t v2) {
+ int32x2_t v3 = vpadd_s32(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_s8:
+**...
+**	addp	v0\.16b, v0\.16b, v1\.16b
+**	ret
+*/
+int8x16_t test_vaddq_s8(int8x16_t v1, int8x16_t v2) {
+ int8x16_t v3 = vpaddq_s8(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_s16:
+**...
+**	addp	v0\.8h, v0\.8h, v1\.8h
+**	ret
+*/
+int16x8_t test_vaddq_s16(int16x8_t v1, int16x8_t v2) {
+ int16x8_t v3 = vpaddq_s16(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_s32:
+**...
+**	addp	v0\.4s, v0\.4s, v1\.4s
+**	ret
+*/
+int32x4_t test_vaddq_s32(int32x4_t v1, int32x4_t v2) {
+ int32x4_t v3 = vpaddq_s32(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_s64:
+**...
+**	addp	v0\.2d, v0\.2d, v1\.2d
+**	ret
+*/
+int64x2_t test_vaddq_s64(int64x2_t v1, int64x2_t v2) {
+ int64x2_t v3 = vpaddq_s64(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddd_s64:
+**...
+**	addp	(d[0-9]+), v0\.2d
+**	fmov	x0, \1
+**	ret
+*/
+int64_t test_vaddd_s64(int64x2_t v1) {
+ int64_t v2 = vpaddd_s64(v1);
+ return v2;
+}
+
+/*
+**test_vaddl_s8:
+**...
+**	saddlp	v0\.4h, v0\.8b
+**	ret
+*/
+int16x4_t test_vaddl_s8(int8x8_t v1) {
+ int16x4_t v2 = vpaddl_s8(v1);
+ return v2;
+}
+
+/*
+**test_vaddlq_s8:
+**...
+**	saddlp	v0\.8h, v0\.16b
+**	ret
+*/
+int16x8_t test_vaddlq_s8(int8x16_t v1) {
+ int16x8_t v2 = vpaddlq_s8(v1);
+ return v2;
+}
+/*
+**test_vaddl_s16:
+**...
+**	saddlp	v0\.2s, v0\.4h
+**	ret
+*/
+int32x2_t test_vaddl_s16(int16x4_t v1) {
+ int32x2_t v2 = vpaddl_s16(v1);
+ return v2;
+}
+
+/*
+**test_vaddlq_s16:
+**...
+**	saddlp	v0\.4s, v0\.8h
+**	ret
+*/
+int32x4_t test_vaddlq_s16(int16x8_t v1) {
+ int32x4_t v2 = vpaddlq_s16(v1);
+ return v2;
+}
+
+/*
+**test_vaddl_s32:
+**...
+**	saddlp	v0\.1d, v0\.2s
+**	ret
+*/
+int64x1_t test_vaddl_s32(int32x2_t v1) {
+ int64x1_t v2 = vpaddl_s32(v1);
+ return v2;
+}
+
+/*
+**test_vaddlq_s32:
+**...
+**	saddlp	v0\.2d, v0\.4s
+**	ret
+*/
+int64x2_t test_vaddlq_s32(int32x4_t v1) {
+ int64x2_t v2 = vpaddlq_s32(v1);
+ return v2;
+}
+
+// UNSIGNED VADD INTRINSICS
+
+/*
+**test_vadd_u8:
+**...
+**	addp	v0\.8b, v0\.8b, v1\.8b
+**	ret
+*/
+uint8x8_t test_vadd_u8(uint8x8_t v1, uint8x8_t v2) {
+ uint8x8_t v3 = vpadd_u8(v1, v2);
+ return v3;
+}
+
+/*
+**test_vadd_u16:
+**...
+**	addp	v0\.4h, v0\.4h, v1\.4h
+**	ret
+*/
+uint16x4_t test_vadd_u16(uint16x4_t v1, uint16x4_t v2) {
+ uint16x4_t v3 = vpadd_u16(v1, v2);
+ return v3;
+}
+
+/*
+**test_vadd_u32:
+**...
+**	addp	v0\.2s, v0\.2s, v1\.2s
+**	ret
+*/
+uint32x2_t test_vadd_u32(uint32x2_t v1, uint32x2_t v2) {
+ uint32x2_t v3 = vpadd_u32(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_u8:
+**...
+**	addp	v0\.16b, v0\.16b, v1\.16b
+**	ret
+*/
+uint8x16_t test_vaddq_u8(uint8x16_t v1, uint8x16_t v2) {
+ uint8x16_t v3 = vpaddq_u8(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_u16:
+**...
+**	addp	v0\.8h, v0\.8h, v1\.8h
+**	ret
+*/
+uint16x8_t test_vaddq_u16(uint16x8_t v1, uint16x8_t v2) {
+ uint16x8_t v3 = vpaddq_u16(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_u32:
+**...
+**	addp	v0\.4s, v0\.4s, v1\.4s
+**	ret
+*/
+uint32x4_t test_vaddq_u32(uint32x4_t v1, uint32x4_t v2) {
+ uint32x4_t v3 = vpaddq_u32(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddq_u64:
+**...
+**	addp	v0\.2d, v0\.2d, v1\.2d
+**	ret
+*/
+uint64x2_t test_vaddq_u64(uint64x2_t v1, uint64x2_t v2) {
+ uint64x2_t v3 = vpaddq_u64(v1, v2);
+ return v3;
+}
+
+/*
+**test_vaddd_u64:
+**...
+**	addp	(d[0-9]+), v0\.2d
+**	fmov	x0, \1
+**	ret
+*/
+uint64_t test_vaddd_u64(uint64x2_t v1) {
+ uint64_t v2 = vpaddd_u64(v1);
+ return v2;
+}
+
+/*
+**test_vaddl_u8:
+**...
+**	uaddlp	v0\.4h, v0\.8b
+**	ret
+*/
+uint16x4_t test_vaddl_u8(uint8x8_t v1) {
+ uint16x4_t v2 = vpaddl_u8(v1);
+ return v2;
+}
+
+/*
+**test_vaddlq_u8:
+**...
+**	uadd

[PATCH v1 0/2] Aarch64: addp NEON big-endian fix [PR114890]

2024-07-03 Thread alfie.richards
From: Alfie Richards 

Hi All,

This fixes a case where the operands for the addp NEON intrinsic were 
erroneously swapped.

Regtested on aarch64-unknown-linux-gnu

Ok for master and GCC14.2?

Kind regards,
Alfie Richards

Alfie Richards (2):
  Aarch64: Add test for non-commutative SIMD intrinsic
  Aarch64, bugfix: Fix NEON bigendian addp intrinsic [PR114890]

 gcc/config/aarch64/aarch64-simd.md|   2 -
 .../aarch64/vector_intrinsics_asm.c   | 371 ++
 2 files changed, 371 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c

-- 
2.34.1



[PATCH v1 2/2] Aarch64, bugfix: Fix NEON bigendian addp intrinsic [PR114890]

2024-07-03 Thread alfie.richards

This change removes code that switches the operands in bigendian mode 
erroneously.
This fixes the related test also.

gcc/ChangeLog:

PR target/114890
* config/aarch64/aarch64-simd.md: Remove bigendian operand swap.

gcc/testsuite/ChangeLog:

PR target/114890
* gcc.target/aarch64/vector_intrinsics_asm.c: Remove xfail.
---
 gcc/config/aarch64/aarch64-simd.md   | 2 --
 gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c | 2 +-
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index 868f4486218..095ef3228cc 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -7341,8 +7341,6 @@ (define_expand "aarch64_addp"
   nunits /= 2;
 rtx par_even = aarch64_gen_stepped_int_parallel (nunits, 0, 2);
 rtx par_odd = aarch64_gen_stepped_int_parallel (nunits, 1, 2);
-if (BYTES_BIG_ENDIAN)
-  std::swap (operands[1], operands[2]);
 emit_insn (gen_aarch64_addp_insn (operands[0], operands[1],
 	operands[2], par_even, par_odd));
 DONE;
diff --git a/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c b/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c
index b7d5620abab..e3dcd0830c8 100644
--- a/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c
+++ b/gcc/testsuite/gcc.target/aarch64/vector_intrinsics_asm.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2" } */
-/* { dg-final { check-function-bodies "**" "" "" { xfail be } } } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_neon.h"
 


[PATCH] [PATCH] C: Support target_version FMV for the C front end

2024-10-22 Thread alfie.richards
From: Alfie Richards 

This patch adds support for `target_version` function multiversioning to
the C frontend.

The functionality and behavior matches the CPP frontend. This is likely
to need to be changed later down the line for the Aarch64 backend to
match the ACLE but that is future work.

Note, in particular this adds a call to process_same_body_aliases
to the C frontend. this function is seems to be intended to be used
in the CPP and D frontends. However, not calling this function was
meaning cpp_implicit_aliases_done was false for the C FMV cgraph nodes
and so the references to the dispatched symbol were not being followed
resulting in the nodes getting deleted and a segfault later.

gcc/c-family/ChangeLog:

* c-gimplify.cc (c_gimplify_expr): Process calls to FMV functions.

gcc/c/ChangeLog:

* c-decl.cc (maybe_mark_function_versioned): New function.
(diagnose_mismatched_decls): Add logic for target_version functions.
(duplicate_decls): Add logic to differentiate target_version functions.
(c_parse_final_cleanups): Add call to process_same_body_aliases.

gcc/ChangeLog:

* calls.cc (get_c_function_version_dispatcher): New function.
* calls.h (get_c_function_version_dispatcher): New function.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-symbols6.C: New test.
* gcc.target/aarch64/mv-1.c: New test.
* gcc.target/aarch64/mv-symbols1.c: New test.
* gcc.target/aarch64/mv-symbols2.c: New test.
* gcc.target/aarch64/mv-symbols3.c: New test.
* gcc.target/aarch64/mv-symbols4.c: New test.
* gcc.target/aarch64/mv-symbols5.c: New test.
* gcc.target/aarch64/mv-symbols6.c: New test.
* gcc.target/aarch64/mvc-symbols1.c: New test.
* gcc.target/aarch64/mvc-symbols2.c: New test.
* gcc.target/aarch64/mvc-symbols3.c: New test.
* gcc.target/aarch64/mvc-symbols4.c: New test.

This has been reg tested on Aarch64 and X86.
Bootstrapped for aarch64-none-linux-gnu.

OK for master?
---
 gcc/c-family/c-gimplify.cc| 11 +++
 gcc/c/c-decl.cc   | 73 ++-
 gcc/calls.cc  | 23 ++
 gcc/calls.h   |  1 +
 .../g++.target/aarch64/mv-symbols6.C  | 16 
 gcc/testsuite/gcc.target/aarch64/mv-1.c   | 39 ++
 .../gcc.target/aarch64/mv-symbols1.c  | 37 ++
 .../gcc.target/aarch64/mv-symbols2.c  | 28 +++
 .../gcc.target/aarch64/mv-symbols3.c  | 26 +++
 .../gcc.target/aarch64/mv-symbols4.c  | 29 
 .../gcc.target/aarch64/mv-symbols5.c  | 35 +
 .../gcc.target/aarch64/mv-symbols6.c  | 17 +
 .../gcc.target/aarch64/mvc-symbols1.c | 25 +++
 .../gcc.target/aarch64/mvc-symbols2.c | 16 
 .../gcc.target/aarch64/mvc-symbols3.c | 19 +
 .../gcc.target/aarch64/mvc-symbols4.c | 12 +++
 16 files changed, 405 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c

diff --git a/gcc/c-family/c-gimplify.cc b/gcc/c-family/c-gimplify.cc
index 09ea1b79159..d288303d118 100644
--- a/gcc/c-family/c-gimplify.cc
+++ b/gcc/c-family/c-gimplify.cc
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "context.h"
 #include "tree-pass.h"
 #include "internal-fn.h"
+#include "calls.h"
 
 /*  The gimplification pass converts the language-dependent trees
 (ld-trees) emitted by the parser into language-independent trees
@@ -904,6 +905,16 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p 
ATTRIBUTE_UNUSED,
 case CALL_EXPR:
   {
tree fndecl = get_callee_fndecl (*expr_p);
+
+   /* Change any calls to a multiversioned function to instead
+* be a call to the dispatched symbol.  */
+   if (fndecl && DECL_FUNCTION_VERSIONED (fndecl))
+ if (tree dis = get_c_function_version_dispatcher (fndecl))
+   {
+ dis = build_fold_addr_expr_loc (EXPR_LOCATION (dis), dis);
+ CALL_EXPR_FN (*expr_p) = dis;
+   }
+
if (fndecl
&& fndecl_built_in_p (fndecl, BUILT_IN_CLZG, BUILT_IN_CTZG)
  

[PATCH v2 0/1] Support for FMV in C front end.

2024-10-24 Thread alfie.richards
From: Alfie Richards 

This update serves to provide a minor cleanup and to CC in relevant
maintainers.

Additionally, I looked into the behavior of FMV on x86 with this patch
and found the assembly looks reasonable, however the assembler produces an
error for duplicate definitons so have left this for disucssion.

Alfie Richards (1):
  C: Support Function multiversionsing in the C front end

 gcc/c-family/c-gimplify.cc| 11 
 gcc/c/c-decl.cc   | 63 ++-
 gcc/calls.cc  | 23 +++
 gcc/calls.h   |  1 +
 .../g++.target/aarch64/mv-symbols6.C  | 16 +
 gcc/testsuite/gcc.target/aarch64/mv-1.c   | 39 
 .../gcc.target/aarch64/mv-symbols1.c  | 37 +++
 .../gcc.target/aarch64/mv-symbols2.c  | 28 +
 .../gcc.target/aarch64/mv-symbols3.c  | 26 
 .../gcc.target/aarch64/mv-symbols4.c  | 29 +
 .../gcc.target/aarch64/mv-symbols5.c  | 35 +++
 .../gcc.target/aarch64/mv-symbols6.c  | 17 +
 .../gcc.target/aarch64/mvc-symbols1.c | 25 
 .../gcc.target/aarch64/mvc-symbols2.c | 16 +
 .../gcc.target/aarch64/mvc-symbols3.c | 19 ++
 .../gcc.target/aarch64/mvc-symbols4.c | 12 
 16 files changed, 396 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c

-- 
2.34.1



[PATCH v2 1/1] C: Support Function multiversionsing in the C front end

2024-10-24 Thread alfie.richards

This patch adds support for `target_version` function multiversioning to
the C frontend, specifically intended for enabling this for Aarch64
targets.

The functionality and behavior matches the CPP frontend. This is likely
to need to be changed later down the line for Aarch64 targets to
match the updated ACLE details but that is future work.

Note, in particular this adds a call to process_same_body_aliases
to the C frontend. this function is seems to be intended to be used
in the CPP and D frontends. However, not calling this function was
meaning cpp_implicit_aliases_done was false for the C cgraph nodes
and then references to the dispatched symbol were not being resolved
resulting in the nodes getting deleted and a segfault later.

I experimented with this patch on X86 and found that the assembler
produces a duplicate symbol error. I would like input from relevant
teams if there is interest in supporting this for their backends.

gcc/c-family/ChangeLog:

* c-gimplify.cc (c_gimplify_expr): Process calls to FMV functions.

gcc/c/ChangeLog:

* c-decl.cc (maybe_mark_function_versioned): New function.
(diagnose_mismatched_decls): Add logic for target_version functions.
(duplicate_decls): Add logic to differentiate target_version functions.
(c_parse_final_cleanups): Add call to process_same_body_aliases.

gcc/ChangeLog:

* calls.cc (get_c_function_version_dispatcher): New function.
* calls.h (get_c_function_version_dispatcher): New function.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-symbols6.C: New test.
* gcc.target/aarch64/mv-1.c: New test.
* gcc.target/aarch64/mv-symbols1.c: New test.
* gcc.target/aarch64/mv-symbols2.c: New test.
* gcc.target/aarch64/mv-symbols3.c: New test.
* gcc.target/aarch64/mv-symbols4.c: New test.
* gcc.target/aarch64/mv-symbols5.c: New test.
* gcc.target/aarch64/mv-symbols6.c: New test.
* gcc.target/aarch64/mvc-symbols1.c: New test.
* gcc.target/aarch64/mvc-symbols2.c: New test.
* gcc.target/aarch64/mvc-symbols3.c: New test.
* gcc.target/aarch64/mvc-symbols4.c: New test.

This has been reg tested on Aarch64 and X86, and bootstrapped for
aarch64-none-linux-gnu and x86_64-unknown-linux-gnu.

OK for master?
---
 gcc/c-family/c-gimplify.cc| 11 
 gcc/c/c-decl.cc   | 63 ++-
 gcc/calls.cc  | 23 +++
 gcc/calls.h   |  1 +
 .../g++.target/aarch64/mv-symbols6.C  | 16 +
 gcc/testsuite/gcc.target/aarch64/mv-1.c   | 39 
 .../gcc.target/aarch64/mv-symbols1.c  | 37 +++
 .../gcc.target/aarch64/mv-symbols2.c  | 28 +
 .../gcc.target/aarch64/mv-symbols3.c  | 26 
 .../gcc.target/aarch64/mv-symbols4.c  | 29 +
 .../gcc.target/aarch64/mv-symbols5.c  | 35 +++
 .../gcc.target/aarch64/mv-symbols6.c  | 17 +
 .../gcc.target/aarch64/mvc-symbols1.c | 25 
 .../gcc.target/aarch64/mvc-symbols2.c | 16 +
 .../gcc.target/aarch64/mvc-symbols3.c | 19 ++
 .../gcc.target/aarch64/mvc-symbols4.c | 12 
 16 files changed, 396 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mvc-symbols4.c

diff --git a/gcc/c-family/c-gimplify.cc b/gcc/c-family/c-gimplify.cc
index 09ea1b79159..d288303d118 100644
--- a/gcc/c-family/c-gimplify.cc
+++ b/gcc/c-family/c-gimplify.cc
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "context.h"
 #include "tree-pass.h"
 #include "internal-fn.h"
+#include "calls.h"
 
 /*  The gimplification pass converts the language-dependent trees
 (ld-trees) emitted by the parser into language-independent trees
@@ -904,6 +905,16 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
 case CALL_EXPR:
   {
 	tree fndecl = get_callee_fndecl (*expr_p);
+
+	/* Change any calls to a multiversioned function to instead
+	 * be a call to the dispatched symbol.  */
+	if (fndecl && DECL_FUNCTION_VERSIONED (fndecl))
+	  if (tree dis = get_c_function_version_dispa

[PATCH v3] C: Support Function multiversionsing in the C front end

2024-11-04 Thread alfie.richards
Hi,

Joseph pointed out a pretty major flaw that this previously
did not merge fmv declarations and definitons or check properly
for duplicate definitons.

I rewrote the fmv logic and moved it to pushdecl resulting in a
patch that I much prefer.

The logic in pushdecl now detects the FMV case and attempts to
change the binding to run duplicate_decls on versions with the
same target, to be merged/diagnosed as duplicate, or runs 
duplicate decls on incompatible decls to output the diagnostics.

I added some tests for these cases also.

Reg tested on Aarch64 and X86
Bootstrapped on aarch64-none-linux-gnu and x86_64-unknown-linux-gnu.

Alfie

=

This patch adds support for `target_version` function multiversioning to
the C frontend, specifically intended for enabling this for Aarch64
targets.

The functionality and behavior matches the CPP frontend. This is likely
to need to be changed later down the line for Aarch64 targets to
match the updated ACLE details but that is future work.

Note, in particular this adds a call to process_same_body_aliases
to the C frontend. this function is seems to be intended to be used
in the CPP and D frontends. However, not calling this function was
meaning cpp_implicit_aliases_done was false for the C cgraph nodes
and then references to the dispatched symbol were not being resolved
resulting in the nodes getting deleted and a segfault later.

I experimented with this patch on X86 and found that the assembler
produces a duplicate symbol error. I would like input from relevant
teams if there is interest in supporting this for their backends.

gcc/c-family/ChangeLog:

* c-gimplify.cc (c_gimplify_expr): Process calls to FMV functions.

gcc/c/ChangeLog:

* c-decl.cc (maybe_mark_function_versioned): New function.
(pushdecl): Add logic for handling target versions.
(c_parse_final_cleanups): Add call to process_same_body_aliases.

gcc/ChangeLog:

* calls.cc (get_c_function_version_dispatcher): New function.
* calls.h (get_c_function_version_dispatcher): New function.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-symbols6.C: New test.
* gcc.target/aarch64/mv-1.c: New test.
* gcc.target/aarch64/mv-symbols-error1.c: New test.
* gcc.target/aarch64/mv-symbols-error2.c: New test.
* gcc.target/aarch64/mv-symbols-error3.c: New test.
* gcc.target/aarch64/mv-symbols-error4.c: New test.
* gcc.target/aarch64/mv-symbols-error5.c: New test.
* gcc.target/aarch64/mv-symbols1.c: New test.
* gcc.target/aarch64/mv-symbols10.c: New test.
* gcc.target/aarch64/mv-symbols2.c: New test.
* gcc.target/aarch64/mv-symbols3.c: New test.
* gcc.target/aarch64/mv-symbols4.c: New test.
* gcc.target/aarch64/mv-symbols5.c: New test.
* gcc.target/aarch64/mv-symbols6.c: New test.
* gcc.target/aarch64/mv-symbols8.c: New test.
* gcc.target/aarch64/mv-symbols9.c: New test.
* gcc.target/aarch64/mvc-symbols1.c: New test.
* gcc.target/aarch64/mvc-symbols2.c: New test.
* gcc.target/aarch64/mvc-symbols3.c: New test.
* gcc.target/aarch64/mvc-symbols4.c: New test.
---
 gcc/c-family/c-gimplify.cc| 11 
 gcc/c/c-decl.cc   | 65 ++-
 gcc/calls.cc  | 22 +++
 gcc/calls.h   |  2 +
 .../g++.target/aarch64/mv-symbols6.C  | 16 +
 gcc/testsuite/gcc.target/aarch64/mv-1.c   | 40 
 .../gcc.target/aarch64/mv-symbols-error1.c| 11 
 .../gcc.target/aarch64/mv-symbols-error2.c|  8 +++
 .../gcc.target/aarch64/mv-symbols-error3.c|  8 +++
 .../gcc.target/aarch64/mv-symbols-error4.c|  8 +++
 .../gcc.target/aarch64/mv-symbols-error5.c| 11 
 .../gcc.target/aarch64/mv-symbols1.c  | 38 +++
 .../gcc.target/aarch64/mv-symbols10.c | 42 
 .../gcc.target/aarch64/mv-symbols2.c  | 28 
 .../gcc.target/aarch64/mv-symbols3.c  | 27 
 .../gcc.target/aarch64/mv-symbols4.c  | 31 +
 .../gcc.target/aarch64/mv-symbols5.c  | 36 ++
 .../gcc.target/aarch64/mv-symbols6.c  | 16 +
 .../gcc.target/aarch64/mv-symbols8.c  | 47 ++
 .../gcc.target/aarch64/mv-symbols9.c  | 44 +
 .../gcc.target/aarch64/mvc-symbols1.c | 25 +++
 .../gcc.target/aarch64/mvc-symbols2.c | 15 +
 .../gcc.target/aarch64/mvc-symbols3.c | 19 ++
 .../gcc.target/aarch64/mvc-symbols4.c | 12 
 24 files changed, 581 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error2.c
 create mod

[PATCH v2] C and CPP: Add flag to generate resolver at default version implementation.

2024-11-05 Thread alfie.richards
Hi all,

Updating this patch to rebase ontop of the new version of the C FMV
patch.

As I mentioned in that series, we are very keen to get ACLE Compliant
FMV support for Aarch64 in for GCC 15. I am aware this is a busy
period for all though.

Regtested on Aarch64, X86
Bootstrapped on aarch64-none-linux-gnu and x86_64-unknown-linux-gnu.

Again for master (after the FMV C patch).

Kind regards,
Alfie Richards

===

This patch adds the TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL hook
which changes FMV behavior for target_version functions to match the Arm
C Language Extension.

The functional differences consist of:
1. Generating the resolver for the dispatched symbol at the site of the
   default version definition.
2. Mangling non-default FMV annotated functions even when no other
   versions are present.

This allows for better behavior when definitions are spread across
different TU's as one resolver will be created and the
[ACLE](https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning)
stipulates that the default implementation must have visibility of all
other versions so that resolver will be complete. This also matches
Clangs behavior.

The only remaining discrepancy I'm aware of when targeting AArch64 is we
do not allow the coexistence of target_version and target_clone, which
is specified as supported in the ACLE but I will look at later.

This patch requires my previous patch enabling FMV in C.

Note this hook is only true on Aarch64, so other targets will not be
affected.

To enable these functionality changes I added mangling to the initial
processing of functions in the C and CPP frontends, and changed the
logic for the creation of resolver bodies to create at default
declaration implementations.

Additionally, the previous naming logic relied on the fact that if there
existed a call to a dispatched function the resolver would also be
created which would do some renaming. As that no longer is guaranteed
this patch hacks on the assembler names to make them correct.

Reg tested on AArch64 and X86_64.
Bootstrapped tested on aarch64-none-linux-gnu and
x86_64-unknown-linux-gnu.

Ok for master?

gcc/ChangeLog:

* attribs.cc (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add check_versioned parameter.
* attribs.h (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add optional check_versioned parameter.
* cgraphunit.cc (cgraph_node::analyze): Change dispatcher creation 
logic.
* config/aarch64/aarch64.cc (get_assembler_name_without_default): New.
(get_suffixed_assembler_name): Change to use 
get_assembler_name_without_default.
(aarch64_get_function_versions_dispatcher): Change to use 
get_assembler_name_without_default.
* config/aarch64/aarch64.h 
(TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.
* defaults.h (TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.

gcc/c/ChangeLog:

* c-decl.cc (diagnose_mismatched_decls): Simplify logic.
(start_function): Add mark for versioned functions.

gcc/cp/ChangeLog:

* class.cc (add_method): Remove argument for maybe_version_functions.
* cp-tree.h (maybe_version_functions): Remove parameter for 
maybe_version_functions.
* decl.cc (decls_match): Simplify logic.
(maybe_version_functions): Remove parameter.
(start_preparsed_function): Add mark for versioned functions.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-1.C: Update.
* g++.target/aarch64/mv-symbols2.C: Update.
* g++.target/aarch64/mv-symbols3.C: Update.
* g++.target/aarch64/mv-symbols4.C: Update.
* g++.target/aarch64/mv-symbols5.C: Update.
* g++.target/aarch64/mv-symbols6.C: Update.
* gcc.target/aarch64/mv-symbols1.c: Update.
* gcc.target/aarch64/mv-symbols2.c: Update.
* gcc.target/aarch64/mv-symbols3.c: Update.
* gcc.target/aarch64/mv-symbols5.c: Update.
* gcc.target/aarch64/mv-symbols6.c: Update.
---
 gcc/attribs.cc| 30 ++-
 gcc/attribs.h |  4 +-
 gcc/c/c-decl.cc   |  9 +
 gcc/cgraphunit.cc | 38 ++-
 gcc/config/aarch64/aarch64.cc | 31 ---
 gcc/config/aarch64/aarch64.h  |  2 +
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 18 ++---
 gcc/defaults.h|  9 +
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 ++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++---
 .../g++.target/aarch64/mv-symbols3.C  |  6 +--
 .../g++.target/aarch64/mv-symbols4.C  |  6 +--
 .../g++.target/aarch64/mv-symbols5.C  |  6 +--
 .../g++

[PATCH] C and CPP: Add flag to generate resolver at default version implementation.

2024-10-30 Thread alfie.richards
Hi all,

This patch adds the TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL hook
which changes FMV behavior for target_version functions to match the Arm
C Language Extension.

The functional differences consist of:
1. Generating the resolver for the dispatched symbol at the site of the
   default version definition.
2. Mangling non-default FMV annotated functions even when no other
   versions are present.

This allows for better behavior when definitions are spread across
different TU's as one resolver will be created and the
[ACLE](https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning)
stipulates that the default implementation must have visibility of all
other versions so that resolver will be complete. This also matches
Clangs behavior.

The only remaining discrepancy I'm aware of when targeting AArch64 is we
do not allow the coexistence of target_version and target_clone, which
is specified as supported in the ACLE but I will look at later.

This patch requires my previous patch enabling FMV in C.

Note this hook is only true on Aarch64, so other targets will not be
affected.

To enable these functionality changes I added mangling to the initial
processing of functions in the C and CPP frontends, and changed the
logic for the creation of resolver bodies to create at default
declaration implementations.

Additionally, the previous naming logic relied on the fact that if there
existed a call to a dispatched function the resolver would also be
created which would do some renaming. As that no longer is guaranteed
this patch hacks on the assembler names to make them correct.

Reg tested on AArch64 and X86_64.
Bootstrapped tested on aarch64-none-linux-gnu and
x86_64-unknown-linux-gnu.

Ok for master?

gcc/ChangeLog:

* attribs.cc (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add check_versioned parameter.
* attribs.h (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add optional check_versioned parameter.
* cgraphunit.cc (cgraph_node::analyze): Change dispatcher creation 
logic.
* config/aarch64/aarch64.cc (get_assembler_name_without_default): New.
(get_suffixed_assembler_name): Change to use 
get_assembler_name_without_default.
(aarch64_get_function_versions_dispatcher): Change to use 
get_assembler_name_without_default.
* config/aarch64/aarch64.h 
(TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.
* defaults.h (TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.

gcc/c/ChangeLog:

* c-decl.cc (diagnose_mismatched_decls): Simplify logic.
(start_function): Add mark for versioned functions.

gcc/cp/ChangeLog:

* class.cc (add_method): Remove argument for maybe_version_functions.
* cp-tree.h (maybe_version_functions): Remove parameter for 
maybe_version_functions.
* decl.cc (decls_match): Simplify logic.
(maybe_version_functions): Remove parameter.
(start_preparsed_function): Add mark for versioned functions.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-1.C: Update.
* g++.target/aarch64/mv-symbols2.C: Update.
* g++.target/aarch64/mv-symbols3.C: Update.
* g++.target/aarch64/mv-symbols4.C: Update.
* g++.target/aarch64/mv-symbols5.C: Update.
* g++.target/aarch64/mv-symbols6.C: Update.
* gcc.target/aarch64/mv-symbols1.c: Update.
* gcc.target/aarch64/mv-symbols2.c: Update.
* gcc.target/aarch64/mv-symbols3.c: Update.
* gcc.target/aarch64/mv-symbols5.c: Update.
* gcc.target/aarch64/mv-symbols6.c: Update.
---
 gcc/attribs.cc| 30 ++-
 gcc/attribs.h |  5 ++-
 gcc/c/c-decl.cc   | 16 +---
 gcc/cgraphunit.cc | 38 ++-
 gcc/config/aarch64/aarch64.cc | 31 ---
 gcc/config/aarch64/aarch64.h  |  2 +
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 18 ++---
 gcc/defaults.h|  9 +
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 ++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++---
 .../g++.target/aarch64/mv-symbols3.C  |  6 +--
 .../g++.target/aarch64/mv-symbols4.C  |  6 +--
 .../g++.target/aarch64/mv-symbols5.C  |  6 +--
 .../g++.target/aarch64/mv-symbols6.C  |  6 +++
 .../gcc.target/aarch64/mv-symbols1.c  |  1 -
 .../gcc.target/aarch64/mv-symbols2.c  |  6 +--
 .../gcc.target/aarch64/mv-symbols3.c  |  6 +--
 .../gcc.target/aarch64/mv-symbols5.c  |  6 +--
 .../gcc.target/aarch64/mv-symbols6.c  |  4 ++
 21 files changed, 150 insertions(+), 66 deletions(-)

diff --git a/gcc/attribs.

[PATCH v3 1/1] CPP: Add flag to generate resolver at default version implementation.

2024-11-26 Thread alfie.richards

This patch adds the TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL flag
which changes FMV behavior for target_version functions to match the Arm
C Language Extension.

The functional differences consist of:
1. Generating the resolver for the dispatched symbol at the site of the
   default version definition.
2. Mangling non-default FMV annotated functions even when no other
   versions are present.

This allows for better behavior when definitions are spread across
different TU's as one resolver will be created and the
[ACLE](https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning)
stipulates that the default implementation must have visibility of all
other versions so that resolver will be complete. This also matches
Clangs behavior.

The only remaining discrepancy I'm aware of when targeting AArch64 is we
do not allow the coexistence of target_version and target_clone, which
is specified as supported in the ACLE but will be addressed later.

Note this hook is only true on Aarch64, so other targets will not be
affected.

To enable these functionality changes I added mangling to the initial
processing of functions in the CPP frontend, and changed the
logic for the creation of resolver bodies to create at default
declaration implementations.

Additionally, the previous naming logic relied on the fact that if there
existed a call to a dispatched function the resolver would also be
created which would do some renaming. As that no longer is guaranteed
this patch hacks on the assembler names to make them correct.

Reg tested on AArch64 and X86_64.
Bootstrapped tested on aarch64-none-linux-gnu and
x86_64-unknown-linux-gnu.

gcc/ChangeLog:

* attribs.cc (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add check_versioned parameter.
* attribs.h (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add optional check_versioned parameter.
* cgraphunit.cc (cgraph_node::analyze): Change dispatcher creation 
logic.
* config/aarch64/aarch64.cc (get_assembler_name_without_default): New.
(get_suffixed_assembler_name): Change to use 
get_assembler_name_without_default.
(aarch64_get_function_versions_dispatcher): Change to use 
get_assembler_name_without_default.
* config/aarch64/aarch64.h 
(TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.
* defaults.h (TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.

gcc/cp/ChangeLog:

* class.cc (add_method): Update call
* cp-tree.h (maybe_version_functions): Remove unecessary argument.
* decl.cc (decls_match): Remove unecessary argument.
(maybe_version_functions): Remove unecessary parameter.
(start_preparsed_function): Change logic.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-1.C: Update.
* g++.target/aarch64/mv-symbols2.C: Update.
* g++.target/aarch64/mv-symbols3.C: Update.
* g++.target/aarch64/mv-symbols4.C: Update.
* g++.target/aarch64/mv-symbols5.C: Update.
* g++.target/aarch64/mv-symbols6.C: New test.
---
 gcc/attribs.cc| 31 +++-
 gcc/attribs.h |  6 ++--
 gcc/cgraphunit.cc | 36 +++
 gcc/config/aarch64/aarch64.cc | 31 
 gcc/config/aarch64/aarch64.h  |  2 ++
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 18 ++
 gcc/defaults.h| 10 ++
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 +++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++
 .../g++.target/aarch64/mv-symbols3.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols4.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols5.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols6.C  | 22 
 15 files changed, 148 insertions(+), 46 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C

diff --git a/gcc/attribs.cc b/gcc/attribs.cc
index 1d6589835a1..a8474db3b0a 100644
--- a/gcc/attribs.cc
+++ b/gcc/attribs.cc
@@ -1250,13 +1250,17 @@ common_function_versions (tree fn1, tree fn2)
by the front-end.  Return the decl created.  */
 
 tree
-make_dispatcher_decl (const tree decl)
+make_dispatcher_decl (const tree decl, const char *name)
 {
   tree func_decl;
-  char *func_name;
   tree fn_type, func_type;
 
-  func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
+  char *func_name;
+
+  if (name)
+func_name = xstrdup (name);
+  else
+func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
 
   fn_type = TREE_TYPE (decl);
   func_type = build_function_type (TREE_TYPE (fn_type),
@@ -1277,17 +1281,26 @@ make_dispatcher_decl (const tree decl)
   return

[PATCH v3 0/1] CPP: Add flag to generate resolver at default version implementation.

2024-11-26 Thread alfie.richards
From: Alfie Richards 

Hello,

I have changed this patch to not rely on the C multiversion patch.
I still plan to get that patch up eventually, but I think it requires
some more work and feedback.

This patch now just changes the FMV dispatcher generation for Aarch64
to comply with the ACLE.

If possible I would still like to get this in GCC 15 to avoid divergences
in codebases between the behaviour with LLVM which is ACLE compliant.

Kind regards,
Alfie Richards

Alfie Richards (1):
  CPP: Add flag to generate resolver at default version implementation.

 gcc/attribs.cc| 31 +++-
 gcc/attribs.h |  6 ++--
 gcc/cgraphunit.cc | 36 +++
 gcc/config/aarch64/aarch64.cc | 31 
 gcc/config/aarch64/aarch64.h  |  2 ++
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 18 ++
 gcc/defaults.h| 10 ++
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 +++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++
 .../g++.target/aarch64/mv-symbols3.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols4.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols5.C  |  6 ++--
 .../g++.target/aarch64/mv-symbols6.C  | 22 
 15 files changed, 148 insertions(+), 46 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C

-- 
2.34.1



[PATCH v4 0/1] C: Support Function multiversioning in the C front end

2024-11-15 Thread alfie.richards
From: Alfie Richards 

Hi Joseph and all,

I worked through Josephs feedback, and as I fixed certain issues I came to the
conclusion he was correct that a rethink was required.

I reworked this to only have the one FMV binding for each function set which
gets replaced with the dispatched symbol decl when the second target is 
processed. 
I prefer this code structure, and think it is far clearer to the reader to 
what was happening previously.

I also added some more tests for more error situations in particular.

This probably still has some rough edges, but I'm hoping its a better direction
overall.
Note, this does slightly change the interface for backend hooks. In particular 
it will require changing the assumptions for get_function_versions_dispatcher
as it now can get called before all the functions have been processed in the C
frontend (maybe without default).
This shouldn't be a big deal but will require work in other backends if we
want to enable this for them also.

Kind regards,
Alfie Richards


Alfie Richards (1):
  C: Support Function multiversioning in the C front end

 gcc/attribs.cc|  21 ++-
 gcc/attribs.h |   3 +-
 gcc/c-family/c-gimplify.cc|  13 ++
 gcc/c/c-decl.cc   | 162 --
 gcc/calls.cc  |  17 ++
 gcc/calls.h   |   2 +
 gcc/cgraph.cc |  61 ++-
 gcc/cgraphunit.cc |  23 +++
 gcc/config/aarch64/aarch64.cc |  29 +---
 .../g++.target/aarch64/mv-symbols10.C |  42 +
 .../g++.target/aarch64/mv-symbols6.C  |  16 ++
 .../g++.target/aarch64/mv-symbols8.C  |  47 +
 .../g++.target/aarch64/mv-symbols9.C  |  44 +
 gcc/testsuite/gcc.target/aarch64/mv-1.c   |  40 +
 .../gcc.target/aarch64/mv-symbols-error1.c|  11 ++
 .../gcc.target/aarch64/mv-symbols-error10.c   |  11 ++
 .../gcc.target/aarch64/mv-symbols-error2.c|   8 +
 .../gcc.target/aarch64/mv-symbols-error3.c|   8 +
 .../gcc.target/aarch64/mv-symbols-error4.c|   8 +
 .../gcc.target/aarch64/mv-symbols-error5.c|  11 ++
 .../gcc.target/aarch64/mv-symbols-error6.c|   8 +
 .../gcc.target/aarch64/mv-symbols-error7.c|  12 ++
 .../gcc.target/aarch64/mv-symbols-error8.c|  11 ++
 .../gcc.target/aarch64/mv-symbols-error9.c|  10 ++
 .../gcc.target/aarch64/mv-symbols1.c  |  38 
 .../gcc.target/aarch64/mv-symbols10.c |  42 +
 .../gcc.target/aarch64/mv-symbols11.c |  16 ++
 .../gcc.target/aarch64/mv-symbols2.c  |  28 +++
 .../gcc.target/aarch64/mv-symbols3.c  |  27 +++
 .../gcc.target/aarch64/mv-symbols4.c  |  31 
 .../gcc.target/aarch64/mv-symbols5.c  |  36 
 .../gcc.target/aarch64/mv-symbols6.c  |  16 ++
 .../gcc.target/aarch64/mv-symbols7.c  |  47 +
 .../gcc.target/aarch64/mv-symbols8.c  |  47 +
 .../gcc.target/aarch64/mv-symbols9.c  |  44 +
 .../gcc.target/aarch64/mvc-symbols1.c |  25 +++
 .../gcc.target/aarch64/mvc-symbols2.c |  15 ++
 .../gcc.target/aarch64/mvc-symbols3.c |  19 ++
 .../gcc.target/aarch64/mvc-symbols4.c |  12 ++
 39 files changed, 1011 insertions(+), 50 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols10.C
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols8.C
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols9.C
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error10.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error4.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error5.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error6.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error7.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error8.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols-error9.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols10.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols11.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols2.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols3.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols4.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols5.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/mv-symbols6.c
 create mo

[PATCH v4 1/1] C: Support Function multiversioning in the C front end

2024-11-15 Thread alfie.richards

This patch adds support for `target_version` function multiversioning to
the C frontend, specifically intended for enabling this for Aarch64
targets.

The functionality and behavior matches the CPP frontend. Which is to
say it is not ACLE compliant, as I have another patch achieving this.

The majority of the logic for this patch is in `pushdecl` and works as
follows (for a given set of FMV functions):
- When the first FMV function is pushed, a binding is created as
  for any function declaration.
- When a second FMV function with distinct target is pushed, colliding
  with the first, the first declaration is replaced with the dispatched
  symbol declaration, and the two functions are stored in the cgraph
  function_version structure of this funciton
- When subsequent declarations are pushed, they are added to the
  cgraph function version structure also.

Additionally to this, the logic for analyzing functions has been
modified so that when the dispatcher function is analyzed it queues all
the function versions in its structure.

Note, while this should change little for C++ FMV, it does requires
a change in frontend hooks to enable the C FMV frontend. This is to allow
the creation of the FMV dispatched symbol declaration before all
versions are processed and in the structure. Notably, this means the
default version may not be present yet. This breaks previous assumptions.

This has been regression tested for both Aarch64 and X68_64.
Bootstrapped for aarch64-none-linux-gnu and x86_64-unknown-linux-gnu.

gcc/ChangeLog:

* attribs.cc (is_function_default_version): Add option for unannotated.
* attribs.h (is_function_default_version): Support option for 
unannotated.
* calls.cc (get_c_function_version_dispatcher): New function
* calls.h (get_c_function_version_dispatcher): New function
* cgraph.cc (cgraph_node::record_function_versions): Change logic
(delete_function_version): Add new case.
* cgraphunit.cc (cgraph_node::analyze): Change logic
(analyze_functions): Enqueue FMV versions.
* config/aarch64/aarch64.cc (aarch64_get_function_versions_dispatcher): 
Change logic

gcc/c-family/ChangeLog:

* c-gimplify.cc (c_gimplify_expr): Change logic.

gcc/c/ChangeLog:

* c-decl.cc (maybe_mark_function_versioned): New function.
(diagnose_mismatched_decls): Add allow duplicates parameter.
(pushdecl): Add FMV logic.
(start_function): Add error case.
(c_parse_final_cleanups): Add call to process_same_body_aliases.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-symbols10.C: New test.
* g++.target/aarch64/mv-symbols6.C: New test.
* g++.target/aarch64/mv-symbols8.C: New test.
* g++.target/aarch64/mv-symbols9.C: New test.
* gcc.target/aarch64/mv-1.c: New test.
* gcc.target/aarch64/mv-symbols-error1.c: New test.
* gcc.target/aarch64/mv-symbols-error10.c: New test.
* gcc.target/aarch64/mv-symbols-error2.c: New test.
* gcc.target/aarch64/mv-symbols-error3.c: New test.
* gcc.target/aarch64/mv-symbols-error4.c: New test.
* gcc.target/aarch64/mv-symbols-error5.c: New test.
* gcc.target/aarch64/mv-symbols-error6.c: New test.
* gcc.target/aarch64/mv-symbols-error7.c: New test.
* gcc.target/aarch64/mv-symbols-error8.c: New test.
* gcc.target/aarch64/mv-symbols-error9.c: New test.
* gcc.target/aarch64/mv-symbols1.c: New test.
* gcc.target/aarch64/mv-symbols10.c: New test.
* gcc.target/aarch64/mv-symbols11.c: New test.
* gcc.target/aarch64/mv-symbols2.c: New test.
* gcc.target/aarch64/mv-symbols3.c: New test.
* gcc.target/aarch64/mv-symbols4.c: New test.
* gcc.target/aarch64/mv-symbols5.c: New test.
* gcc.target/aarch64/mv-symbols6.c: New test.
* gcc.target/aarch64/mv-symbols7.c: New test.
* gcc.target/aarch64/mv-symbols8.c: New test.
* gcc.target/aarch64/mv-symbols9.c: New test.
* gcc.target/aarch64/mvc-symbols1.c: New test.
* gcc.target/aarch64/mvc-symbols2.c: New test.
* gcc.target/aarch64/mvc-symbols3.c: New test.
* gcc.target/aarch64/mvc-symbols4.c: New test.
---
 gcc/attribs.cc|  21 ++-
 gcc/attribs.h |   3 +-
 gcc/c-family/c-gimplify.cc|  13 ++
 gcc/c/c-decl.cc   | 162 --
 gcc/calls.cc  |  17 ++
 gcc/calls.h   |   2 +
 gcc/cgraph.cc |  61 ++-
 gcc/cgraphunit.cc |  23 +++
 gcc/config/aarch64/aarch64.cc |  29 +---
 .../g++.target/aarch64/mv-symbols10.C |  42 +
 .../g++.target/aarch64/mv-symbols6.C  |  16 ++
 .../g++.target/aarch64/mv-symbols8.C  |  47 +
 .../g++.target/aarc

[PATCH v4 1/1] C++: Add flag to generate resolver at default version implementation.

2024-12-05 Thread alfie.richards

This patch adds the TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL flag
which changes FMV behavior for target_version functions to match the Arm
C Language Extension.

The functional differences consist of:
1. Generating the resolver for the dispatched symbol at the site of the
   default version definition.
2. Mangling non-default FMV annotated functions even when no other
   versions are present.

This allows for better behavior when definitions are spread across
different TU's as one resolver will be created and the
[ACLE](https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning)
stipulates that the default implementation must have visibility of all
other versions so that resolver will be complete. This also matches
Clangs behavior.

The only remaining discrepancy I'm aware of when targeting AArch64 is we
do not allow the coexistence of target_version and target_clone, which
is specified as supported in the ACLE and will be addressed later.

Note patch only enables the hook for Aarch64, with the aim that other
targets are not effected.

To enable these functionality changes I added mangling to the initial
processing of functions in the C++ frontend, and changed the
logic for the creation of resolver bodies to create at default
declaration implementations.

Additionally, the previous naming logic relied on the fact that if there
existed a call to a dispatched function the resolver would also be
created which would do some renaming. As that no longer is guaranteed
this patch hacks on the assembler names to make them correct.

Reg tested on AArch64 and X86_64.
Bootstrapped tested on aarch64-none-linux-gnu and
x86_64-unknown-linux-gnu.

gcc/ChangeLog:

* attribs.cc (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add check_versioned parameter.
* attribs.h (make_dispatcher_decl): Add optional name parameter.
(is_function_default_version): Add optional check_versioned parameter.
* cgraphunit.cc (cgraph_node::analyze): Change dispatcher creation 
logic.
* config/aarch64/aarch64.cc (get_assembler_name_without_default): New.
(get_suffixed_assembler_name): Change to use 
get_assembler_name_without_default.
(aarch64_get_function_versions_dispatcher): Change to use 
get_assembler_name_without_default.
* config/aarch64/aarch64.h 
(TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.
* defaults.h (TARGET_CREATE_FMV_DISPATCHER_AT_DEFAULT_IMPL): New.

gcc/cp/ChangeLog:

* class.cc (add_method): Update call
* cp-tree.h (maybe_version_functions): Remove unecessary argument.
* decl.cc (decls_match): Remove unecessary argument.
(maybe_version_functions): Remove unecessary parameter.
(start_preparsed_function): Change logic.

gcc/testsuite/ChangeLog:

* g++.target/aarch64/mv-1.C: Update.
* g++.target/aarch64/mv-symbols2.C: Update.
* g++.target/aarch64/mv-symbols3.C: Update.
* g++.target/aarch64/mv-symbols4.C: Update.
* g++.target/aarch64/mv-symbols5.C: Update.
* g++.target/aarch64/mv-symbols6.C: New test.
---
 gcc/attribs.cc| 32 +++-
 gcc/attribs.h |  2 +-
 gcc/cgraphunit.cc | 38 ---
 gcc/config/aarch64/aarch64.cc | 28 --
 gcc/config/aarch64/aarch64.h  |  2 +
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 20 +-
 gcc/defaults.h| 10 +
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 ++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++---
 .../g++.target/aarch64/mv-symbols3.C  |  6 +--
 .../g++.target/aarch64/mv-symbols4.C  |  6 +--
 .../g++.target/aarch64/mv-symbols5.C  |  6 +--
 .../g++.target/aarch64/mv-symbols6.C  | 22 +++
 15 files changed, 146 insertions(+), 46 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C

diff --git a/gcc/attribs.cc b/gcc/attribs.cc
index 1d6589835a1..acb4e9574bc 100644
--- a/gcc/attribs.cc
+++ b/gcc/attribs.cc
@@ -1247,16 +1247,21 @@ common_function_versions (tree fn1, tree fn2)
 
 /* Make a dispatcher declaration for the multi-versioned function DECL.
Calls to DECL function will be replaced with calls to the dispatcher
-   by the front-end.  Return the decl created.  */
+   by the front-end. NAME, optionally, specifies the name of the created decl.
+   Return the decl created.  */
 
 tree
-make_dispatcher_decl (const tree decl)
+make_dispatcher_decl (const tree decl, const char *name)
 {
   tree func_decl;
-  char *func_name;
   tree fn_type, func_type;
 
-  func_name = xstrdup (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
+  char *func_name;
+
+  if (name)
+func_nam

[PATCH v4 0/1] C++: Add flag to generate resolver at default version implementation

2024-12-05 Thread alfie.richards
From: Alfie Richards 

Hi Jason,

Thank you for the feedback! Hopefully that is all addressed in this version.

Again regtested and I think this version is functionally identical to the 
previous.

Kind regards,
Alfie Richards

Alfie Richards (1):
  C++: Add flag to generate resolver at default version implementation.

 gcc/attribs.cc| 32 +++-
 gcc/attribs.h |  2 +-
 gcc/cgraphunit.cc | 38 ---
 gcc/config/aarch64/aarch64.cc | 28 --
 gcc/config/aarch64/aarch64.h  |  2 +
 gcc/cp/class.cc   |  2 +-
 gcc/cp/cp-tree.h  |  2 +-
 gcc/cp/decl.cc| 20 +-
 gcc/defaults.h| 10 +
 gcc/testsuite/g++.target/aarch64/mv-1.C   |  4 ++
 .../g++.target/aarch64/mv-symbols2.C  | 12 +++---
 .../g++.target/aarch64/mv-symbols3.C  |  6 +--
 .../g++.target/aarch64/mv-symbols4.C  |  6 +--
 .../g++.target/aarch64/mv-symbols5.C  |  6 +--
 .../g++.target/aarch64/mv-symbols6.C  | 22 +++
 15 files changed, 146 insertions(+), 46 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-symbols6.C

-- 
2.34.1



[committed] Regenerate aarch64.opt.urls

2025-01-21 Thread alfie.richards

This updates aarch64.opt.urls after my patch earlier today.

Pushing directly as it;s an obvious fix.

gcc/ChangeLog:

* config/aarch64/aarch64.opt.urls: Regenerate
---
 gcc/config/aarch64/aarch64.opt.urls | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/gcc/config/aarch64/aarch64.opt.urls b/gcc/config/aarch64/aarch64.opt.urls
index 4fa90384378..7ec14a94381 100644
--- a/gcc/config/aarch64/aarch64.opt.urls
+++ b/gcc/config/aarch64/aarch64.opt.urls
@@ -92,3 +92,6 @@ UrlSuffix(gcc/AArch64-Options.html#index-mstack-protector-guard-reg)
 mstack-protector-guard-offset=
 UrlSuffix(gcc/AArch64-Options.html#index-mstack-protector-guard-offset)
 
+Wexperimental-fmv-target
+UrlSuffix(gcc/AArch64-Options.html#index-Wexperimental-fmv-target)
+


[PATCH v4 1/1] Add warning for non-spec compliant FMV in Aarch64

2025-01-17 Thread alfie.richards

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 

[PATCH v4 0/1] FMV AArch64 warning

2025-01-17 Thread alfie.richards
From: Alfie Richards 

Hi,

Thank you Richard for catching that!
It's good to know about keeping it around.

Rebased onto master, fixed up a new test, and addressed your comment.

Kind regards,
Alfie

Alfie Richards (1):
  Add warning for non-spec compliant FMV in Aarch64

 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

-- 
2.34.1



[PATCH v5 1/1] Add warning for non-spec compliant FMV in Aarch64

2025-01-17 Thread alfie.richards

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-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(-)
 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..6f2f54ae752 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
@@ -21880,6 +21881,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 specificat

[PATCH v5 0/1] FMV AArch64 warning

2025-01-17 Thread alfie.richards
From: Alfie Richards 

Appologies, forgot to commit my changes before sending.

Alfie Richards (1):
  Add warning for non-spec compliant FMV in Aarch64

 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(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C
 create mode 100644 gcc/testsuite/g++.target/aarch64/mvc-warning1.C

-- 
2.34.1



[PATCH v2] Add warning for non-spec compliant FMV in Aarch64

2025-01-09 Thread alfie.richards

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_mangle_decl_assembler_name): 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-warning1.C: New test.
---
 gcc/config/aarch64/aarch64.cc   |  4 
 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 +
 14 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 91de13159cb..7d64e99b76b 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -20347,6 +20347,10 @@ aarch64_mangle_decl_assembler_name (tree decl, tree id)
   if (TREE_CODE (decl) == FUNCTION_DECL
   && DECL_FUNCTION_VERSIONED (decl))
 {
+  warning_at (DECL_SOURCE_LOCATION(decl),  OPT_Wexperimental_fmv_target,
+		  "Function Multi Versioning support is experimental, and the "
+		  "behavior is likely to change");
+
   aarch64_fmv_feature_mask feature_mask = get_feature_mask_for_version (decl);
 
   std::string name = IDENTIFIER_POINTER (id);
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 36bc719b822..2a8dd8ea66c 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 51dc871e6bc..bdf9ee1bc0c 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -822,7 +822,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}
 @gccoptlist{-mhalf-reg-file  -mprefer-short-insn-regs
@@ -22087,6 +22088,14 @@ which specify use of that register as a fixed register,
 and @samp{none}, which means that no register is used for this
 purpose.  The default is @option{-m1reg-none}.
 
+@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
 
 @node AMD GCN Options
diff --git a/gcc/testsuite/g++.target/aarch64/mv-1.C b/gcc/testsuite/g++.target/aarch64/mv-1.C
index b4b0e5e3fea..b1003

[PATCH v3 0/1] FMV AArch64 warning

2025-01-17 Thread alfie.richards
From: Alfie Richards 

Hi both,

I updated this patch as in other work I found a more natural place
for this warning to be issued.

I also implemented Kyrylo's suggestion to only issue the warning once.

I don't yet have commit access so if this patch is okay would either
of you be okay to commit it.

Kind regards,
Alfie Richards

Alfie Richards (1):
  Add warning for non-spec compliant FMV in Aarch64

 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

-- 
2.34.1



[PATCH v3 1/1] Add warning for non-spec compliant FMV in Aarch64

2025-01-17 Thread alfie.richards

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-warning1.C: New test.
* g++.target/aarch64/mvc-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 91de13159cb..eae184c7d65 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -20125,6 +20125,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 36bc719b822..2a8dd8ea66c 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 51dc871e6bc..bdf9ee1bc0c 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -822,7 +822,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}
 @gccoptlist{-mhalf-reg-file  -mprefer-short-insn-regs
@@ -22087,6 +22088,14 @@ which specify use of that register as a fixed register,
 and @samp{none}, which means that no register is used for this
 purpose.  The default is @option{-m1reg-none}.
 
+@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 fut

[PATCH] Add warning for use of non-spec FMV in Aarch64

2025-01-09 Thread alfie.richards
This patch adds a warning whenever 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
future compatability issues.

There is a patch for and ACLE compliant version of target_version and
target_clone coming eventually 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_mangle_decl_assembler_name): 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-warning1.C: New test.
---
 gcc/config/aarch64/aarch64.cc   | 3 +++
 gcc/config/aarch64/aarch64.opt  | 4 
 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 +
 13 files changed, 26 insertions(+)
 create mode 100644 gcc/testsuite/g++.target/aarch64/mv-warning1.C

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 91de13159cb..afc0749fd67 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -20347,6 +20347,9 @@ aarch64_mangle_decl_assembler_name (tree decl, tree id)
   if (TREE_CODE (decl) == FUNCTION_DECL
   && DECL_FUNCTION_VERSIONED (decl))
 {
+  warning_at(DECL_SOURCE_LOCATION(decl),  OPT_Wexperimental_fmv_target,
+		 "function multi-versioning support is experimental");
+
   aarch64_fmv_feature_mask feature_mask = get_feature_mask_for_version (decl);
 
   std::string name = IDENTIFIER_POINTER (id);
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 36bc719b822..55670eeb74f 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/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..5d