diff options
| author | ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-14 09:32:17 +0000 |
|---|---|---|
| committer | ktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-14 09:32:17 +0000 |
| commit | 0a809061ddf6283619b0b4d7b35e207ad38104b8 (patch) | |
| tree | 62b76e9c4a9c42289cc88a7fa1d81afcb121baa7 | |
| parent | b21e3ba87b049a8c2c753a67391e61ed9be35bc6 (diff) | |
| download | ppe42-gcc-0a809061ddf6283619b0b4d7b35e207ad38104b8.tar.gz ppe42-gcc-0a809061ddf6283619b0b4d7b35e207ad38104b8.zip | |
[optabs.c] Fix ICE when expanding single-threaded version of atomic_test_and_set
Backport from mainline
2014-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/61713
* gcc/optabs.c (expand_atomic_test_and_set): Do not try to emit
move to subtarget in serial version if result is ignored.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@213954 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 9 | ||||
| -rw-r--r-- | gcc/optabs.c | 5 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/pr61756.c | 14 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b0a2d5307e..a1e4a9ebcee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-08-14 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + Backport from mainline + 2014-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR target/61713 + * gcc/optabs.c (expand_atomic_test_and_set): Do not try to emit + move to subtarget in serial version if result is ignored. + 2014-08-14 Thomas Preud'homme <thomas.preudhomme@arm.com> Backport from mainline diff --git a/gcc/optabs.c b/gcc/optabs.c index 54f07ab02b9..5359257665a 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -7334,7 +7334,10 @@ expand_atomic_test_and_set (rtx target, rtx mem, enum memmodel model) perform the operation. */ if (!ret) { - emit_move_insn (subtarget, mem); + /* If the result is ignored skip the move to target. */ + if (subtarget != const0_rtx) + emit_move_insn (subtarget, mem); + emit_move_insn (mem, trueval); ret = subtarget; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f5d4a2c867..bdb9b808e40 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-08-14 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + Backport from mainline + 2014-08-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com> + + PR target/61713 + * gcc.dg/pr61756.c: New test. + 2014-08-14 Thomas Preud'homme <thomas.preudhomme@arm.com> Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr61756.c b/gcc/testsuite/gcc.dg/pr61756.c new file mode 100644 index 00000000000..4ca90448f19 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr61756.c @@ -0,0 +1,14 @@ +/* PR target/61756 */ + +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +#include <stdatomic.h> + +static volatile atomic_flag guard = ATOMIC_FLAG_INIT; + +void +try_atomic_flag_test_and_set (void) +{ + atomic_flag_test_and_set (&guard); +} |

