diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2019-02-06 21:03:03 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2019-02-06 21:03:03 +0000 |
commit | a4f73f96f182d9aff6ec63c3926a773a2a2c4075 (patch) | |
tree | dfe40150450a0acc1279ff8091d5adbf57afa31f | |
parent | 2f2205e2ff78eb54a2aa2c8c2dc64aee7b1a8dbe (diff) | |
download | gcc-a4f73f96f182d9aff6ec63c3926a773a2a2c4075.zip gcc-a4f73f96f182d9aff6ec63c3926a773a2a2c4075.tar.gz gcc-a4f73f96f182d9aff6ec63c3926a773a2a2c4075.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt76.adb | 36 |
4 files changed, 50 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 712e768..21d1434 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-02-06 Eric Botcazou <ebotcazou@adacore.com> + + * 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 <rguenther@suse.de> PR tree-optimization/89182 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 789a535..579a3ee 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 53f4cd3..ad12b33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-02-06 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/opt76.adb: New test. + 2019-02-06 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/71860 diff --git a/gcc/testsuite/gnat.dg/opt76.adb b/gcc/testsuite/gnat.dg/opt76.adb new file mode 100644 index 0000000..50f3cee --- /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; |