diff mbox

[rs6000] Fix PR target/70168

Message ID 20160310231036.0AAB77B54@oc7340732750.ibm.com
State New
Headers show

Commit Message

Ulrich Weigand March 10, 2016, 11:10 p.m. UTC
Hello,

this patch fixes PR target/70168, a wrong code generation problem
caused by rs6000_expand_atomic_compare_and_swap not properly handling
the case where changing retval clobbers newval due to a register overlap.

Tested with no regressions on powerpc64le-linux on mainline
and gcc-5-branch.

OK for both?

Bye,
Ulrich


ChangeLog:

	PR target/70168
	* config/rs6000/rs6000.c (rs6000_expand_atomic_compare_and_swap):
	Handle overlapping retval and newval.

Comments

David Edelsohn March 10, 2016, 11:33 p.m. UTC | #1
On Thu, Mar 10, 2016 at 6:10 PM, Ulrich Weigand <uweigand@de.ibm.com> wrote:
> Hello,
>
> this patch fixes PR target/70168, a wrong code generation problem
> caused by rs6000_expand_atomic_compare_and_swap not properly handling
> the case where changing retval clobbers newval due to a register overlap.
>
> Tested with no regressions on powerpc64le-linux on mainline
> and gcc-5-branch.
>
> OK for both?
>
> Bye,
> Ulrich
>
>
> ChangeLog:
>
>         PR target/70168
>         * config/rs6000/rs6000.c (rs6000_expand_atomic_compare_and_swap):
>         Handle overlapping retval and newval.

Okay everywhere.

Thanks, David
diff mbox

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 234119)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -20740,6 +20740,9 @@ 
   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;