From a4f73f96f182d9aff6ec63c3926a773a2a2c4075 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 6 Feb 2019 21:03:03 +0000 Subject: [PATCH] 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: r268593 --- gcc/ChangeLog | 5 +++++ gcc/config/i386/i386.c | 7 +++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/opt76.adb | 36 +++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/opt76.adb diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 712e768a353..21d1434ce6f 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 789a53501ee..579a3ee3037 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 53f4cd3f75d..ad12b335f58 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 00000000000..50f3cee9ed9 --- /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; -- 2.30.2