[AVR] Fix target/34888

Richard Henderson rth@redhat.com
Thu Aug 4 15:29:00 GMT 2011


On 08/03/2011 11:09 PM, Denis Chertykov wrote:
> 2011/8/4 Richard Henderson <rth@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.



r~



More information about the Gcc-patches mailing list