From 595a1376002a10273fe7b73fed32fbcbb29e5090 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. (cherry picked from commit 9e02b45ffc60e0078bde3c56a14f00c54b7f8039) --- 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 80a48f8341ca..9bab03a9cff1 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-14 Szabolcs Nagy Backport from mainline. diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c index db9842b1ea6f..60121b19d8ac 100644 --- a/gcc/common/config/aarch64/aarch64-common.c +++ b/gcc/common/config/aarch64/aarch64-common.c @@ -161,6 +161,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 78acd7ecfdb4..e61c9bb00cb5 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -12545,6 +12545,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 51ebb90e32d7..e231add27fdd 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -3957,6 +3957,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 667a1edefeab..695ffa33298f 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 Mark Eggleston PR fortran/39695 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 000000000000..509fb039e847 --- /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 000000000000..acace4c8f2af --- /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.47.2