diff mbox

fix PR/45292, miscompilation of sync_bool_compare_and_swap due to deferred pop

Message ID 4C69BD49.9040209@gnu.org
State New
Headers show

Commit Message

Paolo Bonzini Aug. 16, 2010, 10:35 p.m. UTC
This fixes a bug in expansion of sync_bool_compare_and_swap, where we 
were relying on the CC value from the sync_compare_and_swap optab but 
clobbering it before reading it.  This is due to a 
do_pending_stack_adjust in emit_store_flag_1.  Fixed by doing the stack 
adjust before everything else.

This is a regression from 4.4.  The testcase is libgomp; 
bootstrapped/regtested x86_64-pc-linux-gnu, checked the problematic file 
using -march=i486 -mtune=i586.  Ok for 4.5 and trunk?

Paolo
2010-08-17  Paolo Bonzini  <bonzini@gnu.org>

        * optabs.c (expand_bool_compare_and_swap): Expand pending
        pops before trying the optab.

Comments

Richard Henderson Aug. 16, 2010, 11:02 p.m. UTC | #1
On 08/16/2010 03:35 PM, Paolo Bonzini wrote:
>         * optabs.c (expand_bool_compare_and_swap): Expand pending
>         pops before trying the optab.

Ok.


r~
H.J. Lu Aug. 17, 2010, 1:47 a.m. UTC | #2
On Mon, Aug 16, 2010 at 3:35 PM, Paolo Bonzini <bonzini@gnu.org> wrote:
> This fixes a bug in expansion of sync_bool_compare_and_swap, where we were
> relying on the CC value from the sync_compare_and_swap optab but clobbering
> it before reading it.  This is due to a do_pending_stack_adjust in
> emit_store_flag_1.  Fixed by doing the stack adjust before everything else.
>
> This is a regression from 4.4.  The testcase is libgomp;
> bootstrapped/regtested x86_64-pc-linux-gnu, checked the problematic file
> using -march=i486 -mtune=i586.  Ok for 4.5 and trunk?
>

Can you mention PR 45292 in ChangeLog?

Thanks.
diff mbox

Patch

Index: optabs.c
===================================================================
--- optabs.c	(revision 162940)
+++ optabs.c	(working copy)
@@ -6909,6 +6909,7 @@  expand_bool_compare_and_swap (rtx mem, r
   if (icode == CODE_FOR_nothing)
     return NULL_RTX;
 
+  do_pending_stack_adjust ();
   do
     {
       start_sequence ();