===================================================================
@@ -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);