aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-02-21 00:11:43 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-02-21 00:11:43 +0000
commit3c29a9eaa62f81a4418f75a8fec66f7dc0882dbb (patch)
tree6623a57d7a1b9906bd2dfda145c31783f15dd8c8 /gcc/builtins.c
parentb08864ff7740280a3a346d717abb62b91ab54d33 (diff)
PR c++/60272
* builtins.c (expand_builtin_atomic_compare_exchange): Always make a new pseudo for OLDVAL. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207972 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 09fefe50a8d..35969ad4184 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;