Hi, All !
I have found that GCC does not make a simple, but useful
optimization:

Consider the following code:

void BlankMemoryCh(uint8_t ch)
{
   static const struct MemoryCell m={{-1,0,0,0,0},0,""};
   EEPROM_Write(&m,MEMORY_START+(ch)*sizeof(m),sizeof(m));
}

And here is GCC's output:

 704                     * Function `BlankMemoryCh'
 705                     ***********************/
 706                    BlankMemoryCh:
 128:EEPROM.c      ****
 129:EEPROM.c      **** void BlankMemoryCh(uint8_t ch)
 130:EEPROM.c      **** {
 707                            .stabn 68,0,130,.LM32-BlankMemoryCh
 708                    .LM32:
 709                    /* prologue: frame size = 0 */
 710                    .L__FrameSize_BlankMemoryCh=0x0
 711                    .L__FrameOffset_BlankMemoryCh=0x0
 712                    /* prologue end (size=0) */
 713                    .LBB8:
 131:EEPROM.c      ****    static const struct MemoryCell
m={{-1,0,0,0,0},0,"───────"};
 132:EEPROM.c      ****
EEPROM_Write(&m,MEMORY_START+(ch)*sizeof(m),sizeof(m));
 714                            .stabn 68,0,132,.LM33-BlankMemoryCh
 715                    .LM33:
 716 03a4 4E4F                  mov.b   r15, r14
 717 03a6 0E5E                  rla     r14
 718 03a8 0E5E                  rla     r14
 719 03aa 0E5E                  rla     r14
 720 03ac 0E5E                  rla     r14
 721 03ae 7FF3                  and.b   #-1,r15
 722 03b0 0F5F                  rla     r15
 723 03b2 0E5F                  add     r15, r14
 724 03b4 3E50 0002             add     #llo(512), r14
 725 03b8 3D40 1200             mov     #llo(18), r13
 726 03bc 3F40 0000             mov     #m.0, r15
 727 03c0 B012 0000             call    #EEPROM_Write
 728                    .LBE8:
 133:EEPROM.c      **** }
 729                            .stabn 68,0,133,.LM34-BlankMemoryCh
 730                    .LM34:
 731 03c4 3041                  ret
 732                    /* epilogue: not required */
 733                    /* function BlankMemoryCh size 17 (16) */


We can change

call #EEPROM_Write
ret

to

br #EEPROM_Write

This will save a bit of flash and RAM (stack). The later is aspecially
useful for msp430.
I think this is easy to implement (for example this might be a simple rule
for peephole optimizer, if
GCC have one).

What Dmitry thinks about it?

Bye,
Oleg.



Reply via email to