Commit a4f73f96 by Eric Botcazou Committed by Eric Botcazou

i386.c (ix86_expand_prologue): Emit a memory blockage after restoring registers…

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
parent 2f2205e2
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
......
......@@ -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);
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
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment