On Tue, Oct 18, 2005 at 07:10:52PM +0200, Jan Hubicka wrote: > > I modified the gcc i386 backend. Now my gcc optimizes function prologue > > > > movq %rbx, -16(%rsp) > > movq %rbp, -8(%rsp) > > subq $16, %rsp > > > > to > > movq %rbx, -16(%rsp) > > movq %rbp, -8(%rsp) > > pushq %rax > > pushq %rax > > > > The change was introduced by > > > > http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00263.html > > > > I have a question. It is OK to turn stack pointer addition into > > pop instructions with a scratch register. But I don't see how you can > > turn stack pointer substraction into push instructions with a > > scratch register since push will change the contents of the stack, > > in addition to stack pointer. > > Well, this change predated x86-64 and on x86 this is safe because data > bellow stack pointer are volatile and can be modified anytime from > signal handlers so the push instruction can't kill live data. > However with red zone on x86-64 this is no longer so clear. It > seems to me that it is safe too - for non-leaf functions we don't use > red zone and for leaf function we have single adjustment in prologue > and no live data in the area at that time... > > Do you see some misscompiations or something? >
I opened http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24419 We have 2 issues: 1. When prologue uses mov, memory shouldn't be clobbered. But ix86_expand_prologue calls pro_epilogue_adjust_stack which clobbers memory. 2. We convert stack pointer subtractions to push even when memory isn't clobbered with patterns like ;; Convert esp subtractions to push. (define_peephole2 [(match_scratch:SI 0 "r") (parallel [(set (reg:SI SP_REG) (plus:SI (reg:SI SP_REG) (const_int -4))) (clobber (reg:CC FLAGS_REG))])] "optimize_size || !TARGET_SUB_ESP_4" [(clobber (match_dup 0)) (set (mem:SI (pre_dec:SI (reg:SI SP_REG))) (match_dup 0))]) I don't think we can do that since push will clobber memory. H.J.