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.

Reply via email to