Message ID | 20160310231036.0AAB77B54@oc7340732750.ibm.com |
---|---|
State | New |
Headers | show |
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
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;