From 9e02b45ffc60e0078bde3c56a14f00c54b7f8039 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 21 May 2020 12:45:47 +0200 Subject: [PATCH] Add outline-atomics to target attribute. * common/config/aarch64/aarch64-common.c (aarch64_handle_option): Handle OPT_moutline_atomics. * config/aarch64/aarch64.c: Add outline-atomics to aarch64_attributes. * doc/extend.texi: Document the newly added target attribute. * gcc.target/aarch64/target_attr_20.c: New test. * gcc.target/aarch64/target_attr_21.c: New test. --- gcc/ChangeLog | 8 ++++++ gcc/common/config/aarch64/aarch64-common.c | 4 +++ gcc/config/aarch64/aarch64.c | 2 ++ gcc/doc/extend.texi | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ .../gcc.target/aarch64/target_attr_20.c | 27 +++++++++++++++++++ .../gcc.target/aarch64/target_attr_21.c | 27 +++++++++++++++++++ 7 files changed, 79 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/target_attr_20.c create mode 100644 gcc/testsuite/gcc.target/aarch64/target_attr_21.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b97e8ea51f7..d48fbfcab81 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-05-21 Martin Liska + + * common/config/aarch64/aarch64-common.c (aarch64_handle_option): + Handle OPT_moutline_atomics. + * config/aarch64/aarch64.c: Add outline-atomics to + aarch64_attributes. + * doc/extend.texi: Document the newly added target attribute. + 2020-05-21 Uroš Bizjak PR target/95218 diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c index 0bddcc8c3e9..51bd319d6d3 100644 --- a/gcc/common/config/aarch64/aarch64-common.c +++ b/gcc/common/config/aarch64/aarch64-common.c @@ -116,6 +116,10 @@ aarch64_handle_option (struct gcc_options *opts, opts->x_flag_omit_leaf_frame_pointer = val; return true; + case OPT_moutline_atomics: + opts->x_aarch64_flag_outline_atomics = val; + return true; + default: return true; } diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 79c016f4dc3..78db0a56323 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -15266,6 +15266,8 @@ static const struct aarch64_attribute_info aarch64_attributes[] = aarch64_handle_attr_branch_protection, OPT_mbranch_protection_ }, { "sign-return-address", aarch64_attr_enum, false, NULL, OPT_msign_return_address_ }, + { "outline-atomics", aarch64_attr_bool, true, NULL, + OPT_moutline_atomics}, { NULL, aarch64_attr_custom, false, NULL, OPT____ } }; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index c80848e9061..a2ebef8cf8c 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -4066,6 +4066,12 @@ Select the function scope on which branch protection will be applied. The behavior and permissible arguments are the same as for the command-line option @option{-mbranch-protection=}. The default value is @code{none}. +@item outline-atomics +@cindex @code{outline-atomics} function attribute, AArch64 +Enable or disable calls to out-of-line helpers to implement atomic operations. +This corresponds to the behavior of the command line options +@option{-moutline-atomics} and @option{-mno-outline-atomics}. + @end table The above target attributes can be specified as follows: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 85f73e48641..3940cfd48c4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-21 Martin Liska + + * gcc.target/aarch64/target_attr_20.c: New test. + * gcc.target/aarch64/target_attr_21.c: New test. + 2020-05-20 Jozef Lawrynowicz * g++.dg/warn/Wconversion-null-2.C: Add explicit declarations for l() diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_20.c b/gcc/testsuite/gcc.target/aarch64/target_attr_20.c new file mode 100644 index 00000000000..509fb039e84 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_20.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv8-a+nolse -moutline-atomics" } */ + +int b, c, d, e, f, h; +short g; +int foo (int) __attribute__ ((__const__)); + +__attribute__ ((target ("no-outline-atomics"))) +void +bar (void) +{ + while (1) + { + while (1) + { + __atomic_load_n (&e, 0); + if (foo (2)) + __sync_val_compare_and_swap (&c, 0, f); + b = 1; + if (h == e) + break; + } + __sync_val_compare_and_swap (&g, -1, f); + } +} + +/* { dg-final { scan-assembler-not "bl.*__aarch64_cas2_acq_rel" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_21.c b/gcc/testsuite/gcc.target/aarch64/target_attr_21.c new file mode 100644 index 00000000000..acace4c8f2a --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_21.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv8-a+nolse -mno-outline-atomics" } */ + +int b, c, d, e, f, h; +short g; +int foo (int) __attribute__ ((__const__)); + +__attribute__ ((target ("outline-atomics"))) +void +bar (void) +{ + while (1) + { + while (1) + { + __atomic_load_n (&e, 0); + if (foo (2)) + __sync_val_compare_and_swap (&c, 0, f); + b = 1; + if (h == e) + break; + } + __sync_val_compare_and_swap (&g, -1, f); + } +} + +/* { dg-final { scan-assembler-times "bl.*__aarch64_cas2_acq_rel" 1 } } */ -- 2.30.2