On 10/12/2011 12:07 AM, Kai Tietz wrote: > Hello, > > by recent changes gcc begun to move code into the prologue region. > This is for x64 SEH an issue, as here the table-information for > prologue is limited to 255 bytes size. So we need to avoid moving > additional code into prologue. To achieve this we mark all standard > and xmm registers as prologue-used at the end of prologue. Also we > need to emit a memory blockage. > > ChangeLog > > 2011-10-12 Kai Tietz <kti...@redhat.com> > > * config/i386/i386.c (ix86_expand_prologue): Mark > for TARGET_SEH all sse/integer registers as prologue-used. > > Tested for x86_64-w64-mingw32. Ok for apply? > > Regards, > Kai > > Index: i386.c > =================================================================== > --- i386.c (revision 179824) > +++ i386.c (working copy) > @@ -10356,7 +10356,24 @@ > Further, prevent alloca modifications to the stack pointer from being > combined with prologue modifications. */ > if (TARGET_SEH) > - emit_insn (gen_prologue_use (stack_pointer_rtx)); > + { > + int i; > + > + /* Due limited size of prologue-code size of 255 bytes, > + we need to prevent scheduler to sink instructions into > + prologue code. Therefore we mark all standard, sse, fpu, > + and the pc registers as prologue-used to prevent this. > + Also an memory-blockage is necessary. */ > + emit_insn (gen_memory_blockage ()); > + > + for (i = 0; i <= 7; i++) > + { > + emit_insn (gen_prologue_use (gen_rtx_REG (Pmode, AX_REG + i))); > + emit_insn (gen_prologue_use (gen_rtx_REG (Pmode, R8_REG + i))); > + emit_insn (gen_prologue_use (gen_rtx_REG (TImode, XMM0_REG + i))); > + emit_insn (gen_prologue_use (gen_rtx_REG (TImode, XMM8_REG + i))); > + } > + }
This is overkill. We simply need to disable shrink-wrapping for SEH. The easiest way to do that is to add !TARGET_SEH (and a comment) to the simple_return pattern predicate. r~