aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2016-03-10 23:58:44 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2016-03-10 23:58:44 +0000
commit8287dbce7bcb7c6b1a0aa45f05b8c94a25a7c723 (patch)
treed9aa09cc218ec8431a7dacf1cbd0e7f9df0c44d3 /gcc
parentf6c1032d03cd45af05f427a3b33bc12e88c44c3a (diff)
downloadgcc-8287dbce7bcb7c6b1a0aa45f05b8c94a25a7c723.zip
gcc-8287dbce7bcb7c6b1a0aa45f05b8c94a25a7c723.tar.gz
gcc-8287dbce7bcb7c6b1a0aa45f05b8c94a25a7c723.tar.bz2
re PR target/70168 (Wrong code generation in __sync_val_compare_and_swap on PowerPC)
PR target/70168 * config/rs6000/rs6000.c (rs6000_expand_atomic_compare_and_swap): Handle overlapping retval and newval. From-SVN: r234126
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c3
2 files changed, 9 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d53c261..cc91e84 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-10 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ PR target/70168
+ * config/rs6000/rs6000.c (rs6000_expand_atomic_compare_and_swap):
+ Handle overlapping retval and newval.
+
2016-03-10 Nick Clifton <nickc@redhat.com>
PR target/7044
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 5b03f9e..fd4b7cc 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -22283,6 +22283,9 @@ rs6000_expand_atomic_compare_and_swap (rtx operands[])
if (mode != TImode && !reg_or_short_operand (oldval, mode))
oldval = copy_to_mode_reg (mode, oldval);
+ if (reg_overlap_mentioned_p (retval, newval))
+ newval = copy_to_reg (newval);
+
mem = rs6000_pre_atomic_barrier (mem, mod_s);
label1 = NULL_RTX;