------- Comment #16 from rask at gcc dot gnu dot org 2007-09-16 13:38 ------- Created an attachment (id=14211) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=14211&action=view) quick and dirty patch to reduce code size
A fundamental problem with the AVR back end is that it sabotages the RTL optimizer's attempts to optimize away redundant move insns. With this patch, I get better code (-O2): foo: push r29 ; 73 *pushhi/1 [length = 2] push r28 rcall . ; 79 *addhi3_sp_R_pc2 [length = 3] rcall . rcall . in r28,__SP_L__ ; 90 *movqi/6 [length = 1] in r29,__SP_H__ ; 91 *movqi/6 [length = 1] /* prologue: function */ /* frame size = 6 */ ldi r24,lo8(2) ; 68 *movqi/2 [length = 1] std Y+5,r24 ; 70 *movqi/3 [length = 1] std Y+6,__zero_reg__ ; 71 *movqi/3 [length = 1] ldi r22,lo8(2) ; 21 *movqi/2 [length = 1] ldi r23,lo8(0) ; 23 *movqi/2 [length = 1] ldi r18,lo8(1) ; 42 *movqi/2 [length = 1] ldi r19,lo8(0) ; 43 *movqi/2 [length = 1] ldi r20,lo8(0) ; 44 *movqi/2 [length = 1] ldi r21,lo8(0) ; 45 *movqi/2 [length = 1] ldi r24,lo8(0) ; 48 *movqi/2 [length = 1] ldi r25,lo8(0) ; 49 *movqi/2 [length = 1] /* epilogue start */ adiw r28,6 ; 85 *addhi3/2 [length = 1] out __SP_L__,r28 ; 92 *movqi/5 [length = 1] out __SP_H__,r29 ; 93 *movqi/5 [length = 1] pop r28 ; 87 pophi [length = 2] pop r29 ret ; 88 return_from_epilogue [length = 1] .size foo, .-foo /* File "/home/rask/pr11180.c": code 0 = 0x0000 ( 0), prologues 0, epilogues 0 */ Perhaps a peephole optimization could replace insns 48 and 49 with "movw r25:r24, r21:r20". The only big further improvement I see would be to get rid of the stack var. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11180