avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] Optimization - what is bad on this code ?


From: Carl Hamilton
Subject: Re: [avr-gcc-list] Optimization - what is bad on this code ?
Date: Sun, 4 Oct 2009 13:34:49 -0700

I can't say why the compiler has thrown out their bodies (I haven't looked at the code that closely), but the "while" loops in both functions will never exit. Since you have declared "icnt" as unsigned, "icnt + 1" will always be true. I'm surprised the the compiler didn't issue a warning along these lines. What warning level are you compiling with?

 - Carl

On Sun, Oct 4, 2009 at 12:33 PM, Vaclav Peroutka <address@hidden> wrote:
Hello all,

I am sorry, but maybe somebody has expierience why the following code is deleted during optimization. I have two functions for printing of numbers (uart_puts() just send string to UART) :
void uart_putux( unsigned int aInt)
{
 unsigned char buf[5];
 unsigned char icnt = 4;

 buf[icnt--] = 0x00;
 while(icnt+1) {
   buf[icnt] = (aInt&0x0f) + 0x30;
   if (buf[icnt] > 0x39) {
     buf[icnt] += 0x07;
   }
   aInt >>= 4;
   icnt--;
 }
 uart_puts( buf);
}

void uart_putlx( unsigned long aInt)
{
 unsigned char buf[9];
 unsigned char icnt = 8;

 buf[icnt--] = 0x00;
 while(icnt+1) {
   buf[icnt] = (aInt&0x0f) + 0x30;
   if (buf[icnt] > 0x39) {
     buf[icnt] += 0x07;
   }
   aInt >>= 4;
   icnt--;
 }
 uart_puts( buf);
}

After I compile and link the code, in .LST I see following:
void uart_putux( unsigned int aInt)
{
 35a:   ff cf           rjmp    .-2             ; 0x35a <uart_putux>

0000035c <uart_putlx>:
 }
 uart_puts( buf);
}

void uart_putlx( unsigned long aInt)
{
 35c:   ff cf           rjmp    .-2             ; 0x35c <uart_putlx>

For compilation I use following:
/opt/avr-gcc.4.3.4/bin/avr-gcc -g -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -I /opt/avr-gcc.4.3.4/bin/include -fno-inline-small-functions -fno-reorder-blocks -fno-reorder-blocks-and-partition -fno-reorder-functions -fno-toplevel-reorder -fno-move-loop-invariants   -c -o hal.o hal.c

If I remove "-Os", the code is there. But if I understand correctly, gcc sees the code unusable. What is bad inside ? The code worked in older avr-gcc...

Thank you for help,
Vaclav


_______________________________________________
AVR-GCC-list mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list


reply via email to

[Prev in Thread] Current Thread [Next in Thread]