From: ebotcazou Date: Wed, 6 Feb 2019 21:03:03 +0000 (+0000) Subject: * config/i386/i386.c (ix86_expand_prologue): Emit a memory blockage X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2947ccc6135c8366605aacd22b859557fc5130f8;p=thirdparty%2Fgcc.git * config/i386/i386.c (ix86_expand_prologue): Emit a memory blockage after restoring registers saved to allocate the frame on Windows. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@268593 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 712e768a353d..21d1434ce6f9 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-06 Richard Biener PR tree-optimization/89182 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 789a53501ee5..579a3ee3037a 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -13579,8 +13579,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); @@ -13589,6 +13590,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) { @@ -13596,6 +13598,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 53f4cd3f75d4..ad12b335f581 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-06 Thomas Koenig PR fortran/71860 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;