[PATCH v1 1/2] Aarch64: Add test for non-commutative SIMD intrinsic
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]
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]
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
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.
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
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
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.
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.
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.
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.
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
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
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.
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
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
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
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
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
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
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
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
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
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
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