aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2019-02-06 21:03:03 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2019-02-06 21:03:03 +0000
commita4f73f96f182d9aff6ec63c3926a773a2a2c4075 (patch)
treedfe40150450a0acc1279ff8091d5adbf57afa31f
parent2f2205e2ff78eb54a2aa2c8c2dc64aee7b1a8dbe (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/opt76.adb36
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;