From: Eric Botcazou Date: Wed, 6 Feb 2019 21:10:19 +0000 (+0000) Subject: i386.c (ix86_expand_prologue): Emit a memory blockage after restoring registers saved... X-Git-Tag: releases/gcc-7.5.0~609 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52dc62100ba2191c85aafcad493f414a6dcab1a0;p=thirdparty%2Fgcc.git i386.c (ix86_expand_prologue): Emit a memory blockage after restoring registers saved to allocate the frame on... * config/i386/i386.c (ix86_expand_prologue): Emit a memory blockage after restoring registers saved to allocate the frame on Windows. From-SVN: r268595 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c8da3e7ca11..88c11f281e57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-02-06 Eric Botcazou + + * config/i386/i386.c (ix86_expand_prologue): Emit a memory blockage + after restoring registers saved to allocate the frame on Windows. + 2019-02-05 Andreas Krebbel Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b3db897825cc..ea1c2e775fde 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -14499,8 +14499,9 @@ ix86_expand_prologue (void) } m->fs.sp_offset += allocate; - /* Use stack_pointer_rtx for relative addressing so that code - works for realigned stack, too. */ + /* Use stack_pointer_rtx for relative addressing so that code works for + realigned stack. But this means that we need a blockage to prevent + stores based on the frame pointer from being scheduled before. */ if (r10_live && eax_live) { t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); @@ -14509,6 +14510,7 @@ ix86_expand_prologue (void) t = plus_constant (Pmode, t, UNITS_PER_WORD); emit_move_insn (gen_rtx_REG (word_mode, AX_REG), gen_frame_mem (word_mode, t)); + emit_insn (gen_memory_blockage ()); } else if (eax_live || r10_live) { @@ -14516,6 +14518,7 @@ ix86_expand_prologue (void) emit_move_insn (gen_rtx_REG (word_mode, (eax_live ? AX_REG : R10_REG)), gen_frame_mem (word_mode, t)); + emit_insn (gen_memory_blockage ()); } } gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d4c29bc55dda..af6d055763df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-02-06 Eric Botcazou + + * gnat.dg/opt76.adb: New test. + 2019-02-05 Thomas Koenig PR fortran/67679 diff --git a/gcc/testsuite/gnat.dg/opt76.adb b/gcc/testsuite/gnat.dg/opt76.adb new file mode 100644 index 000000000000..50f3cee9ed95 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt76.adb @@ -0,0 +1,36 @@ +-- { dg-do run } +-- { dg-options "-O2 -gnatp -fno-omit-frame-pointer" } + +procedure Opt76 is + + type Integer_Access is access Integer; + type Registry_Array is array (Natural range <>) of Integer_Access; + + procedure Nested (Input, Parser : Integer; A, B : Boolean) is + + Index : Registry_Array (1 .. 1024); + Not_B : constant Boolean := not B; + + procedure Inner (Input : Integer) is + begin + if Input /= 1 then + raise Program_Error; + end if; + + if Parser = 128 and then A and then Not_B then + Inner (Input); + Index (Index'First) := null; + end if; + end; + + begin + Inner (Input); + end; + + Input : Integer := 1 with Volatile; + Parser : Integer := 2 with Volatile; + +begin + Nested (Input, Parser, False, True); + Nested (Input, Parser, True, False); +end;