From: Matthew Wahab Date: Mon, 29 Jun 2015 16:09:10 +0000 (+0000) Subject: re PR target/65697 (__atomic memory barriers not strong enough for __sync builtins) X-Git-Tag: upstream/12.2.0~53889 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a96297a28065d27559d17ebe1e0eda308a05e965;p=platform%2Fupstream%2Fgcc.git re PR target/65697 (__atomic memory barriers not strong enough for __sync builtins) 2015-06-29 Matthew Wahab PR target/65697 * config/armc/arm.c (arm_split_compare_and_swap): For ARMv8, replace an initial acquire barrier with final barrier. From-SVN: r225133 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a7ef9d..6ecc469 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2015-06-29 Matthew Wahab PR target/65697 + * config/armc/arm.c (arm_split_compare_and_swap): For ARMv8, replace an + initial acquire barrier with final barrier. + +2015-06-29 Matthew Wahab + + PR target/65697 * config/armc/arm.c (arm_split_atomic_op): For ARMv8, replace an initial acquire barrier with final barrier. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 5667763..c2dce95 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -27614,6 +27614,8 @@ arm_split_compare_and_swap (rtx operands[]) scratch = operands[7]; mode = GET_MODE (mem); + bool is_armv8_sync = arm_arch8 && is_mm_sync (mod_s); + bool use_acquire = TARGET_HAVE_LDACQ && !(is_mm_relaxed (mod_s) || is_mm_consume (mod_s) || is_mm_release (mod_s)); @@ -27622,6 +27624,11 @@ arm_split_compare_and_swap (rtx operands[]) && !(is_mm_relaxed (mod_s) || is_mm_consume (mod_s) || is_mm_acquire (mod_s)); + /* For ARMv8, the load-acquire is too weak for __sync memory orders. Instead, + a full barrier is emitted after the store-release. */ + if (is_armv8_sync) + use_acquire = false; + /* Checks whether a barrier is needed and emits one accordingly. */ if (!(use_acquire || use_release)) arm_pre_atomic_barrier (mod_s); @@ -27662,7 +27669,8 @@ arm_split_compare_and_swap (rtx operands[]) emit_label (label2); /* Checks whether a barrier is needed and emits one accordingly. */ - if (!(use_acquire || use_release)) + if (is_armv8_sync + || !(use_acquire || use_release)) arm_post_atomic_barrier (mod_s); if (is_mm_relaxed (mod_f))