2011/8/4 Richard Henderson <r...@redhat.com>: > On 08/03/2011 11:09 PM, Denis Chertykov wrote: >> 2011/8/4 Richard Henderson <r...@redhat.com>: >>> When a frame pointer is in use, we can optimize popping all >>> queued parameters via a simple move from the frame pointer >>> instead of an addition to the stack pointer. >>> >>> The new sequence is 4 insns, the old sequence was 9 insns. >>> >>> Committed. >> >> It seems strange for me: >> +;; Notice a special-case when adding N to SP where N results in a >> +;; zero REG_ARGS_SIZE. This is equivalent to a move from FP. >> +(define_split >> + [(set (reg:HI REG_SP) (match_operand:HI 0 "register_operand" ""))] >> + "reload_completed >> + && frame_pointer_needed >> + && !cfun->calls_alloca >> + && find_reg_note (insn, REG_ARGS_SIZE, const0_rtx)" >> + [(set (reg:HI REG_SP) (reg:HI REG_Y))] >> + "") >> >> What is it ? ... It's a transition from SP = general-register to >> SP = REG_Y with set of conditions. >> Generally, it's seems wrong (SP = REG) isn't equal to (SP = REG_Y). > > The old sequence is > > (set tmp SP) > (set tmp (plus tmp const_int)) > (set SP tmp) > > Because of the REG_ARGS_SIZE note being 0, we know that > this is popping all arguments off the stack. > > The other conditions, frame pointer existing, and no > calls to alloca, mean that we know exactly what the > result of the addition is -- the contents of FP. > > So we transform to > > (set tmp SP) > (set tmp (plus tmp const_int)) > (set SP FP) > > and let the first two insns be deleted as dead code.
Thank you for explanation. I have a very clean understanding of whole picture. May be better to use define_peephole2 with 3 insns as input and 1 as output for easy understanding. Denis.