aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2014-02-20 16:11:43 -0800
committerRichard Henderson <rth@gcc.gnu.org>2014-02-20 16:11:43 -0800
commit2fdc29e8c7f95019aecdcbed5b556c82dbd91c7c (patch)
tree6623a57d7a1b9906bd2dfda145c31783f15dd8c8 /gcc
parentaa637f667f9c6b5f96af8c96c956f58041cdb2ba (diff)
downloadgcc-2fdc29e8c7f95019aecdcbed5b556c82dbd91c7c.zip
gcc-2fdc29e8c7f95019aecdcbed5b556c82dbd91c7c.tar.gz
gcc-2fdc29e8c7f95019aecdcbed5b556c82dbd91c7c.tar.bz2
re PR c++/60272 (atomic<>::compare_exchange_weak has spurious store and can cause race conditions)
PR c++/60272 * builtins.c (expand_builtin_atomic_compare_exchange): Always make a new pseudo for OLDVAL. From-SVN: r207972
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/builtins.c7
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cbdecf8..c51d139 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-02-20 Richard Henderson <rth@redhat.com>
+
+ PR c++/60272
+ * builtins.c (expand_builtin_atomic_compare_exchange): Always make
+ a new pseudo for OLDVAL.
+
2014-02-20 Jakub Jelinek <jakub@redhat.com>
PR target/57896
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 09fefe50..35969ad 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -5332,9 +5332,12 @@ expand_builtin_atomic_compare_exchange (enum machine_mode mode, tree exp,
if (target == const0_rtx)
target = NULL;
- oldval = expect;
- if (!expand_atomic_compare_and_swap (&target, &oldval, mem, oldval, desired,
+ /* Lest the rtl backend create a race condition with an imporoper store
+ to memory, always create a new pseudo for OLDVAL. */
+ oldval = NULL;
+
+ if (!expand_atomic_compare_and_swap (&target, &oldval, mem, expect, desired,
is_weak, success, failure))
return NULL_RTX;