+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
}
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);
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)
{
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
--- /dev/null
+-- { 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;