diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-02-21 00:11:43 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-02-21 00:11:43 +0000 |
commit | 3c29a9eaa62f81a4418f75a8fec66f7dc0882dbb (patch) | |
tree | 6623a57d7a1b9906bd2dfda145c31783f15dd8c8 | |
parent | b08864ff7740280a3a346d717abb62b91ab54d33 (diff) | |
download | ppe42-gcc-3c29a9eaa62f81a4418f75a8fec66f7dc0882dbb.tar.gz ppe42-gcc-3c29a9eaa62f81a4418f75a8fec66f7dc0882dbb.zip |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/builtins.c | 7 |
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cbdecf83d20..c51d139850e 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 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; |