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

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

[avr-gcc-list] An old but unfixed bug


From: Alexander Popov
Subject: [avr-gcc-list] An old but unfixed bug
Date: Wed, 22 Aug 2001 00:31:57 +0300

        Hello,
        Here I send a warning for an old bug which is still not fixed. It is a 
general 
GCC bug, not AVR specific.
        When we have :

        unsigned char *p;
        p=(unsigned char*)SOME_ADDR;
        do {
        // do something
        } while(p++<(unsigned char *)0xffff);

        The while loop is totaly skipped and the body is executed only once!

        This is even more annoying than optimizing an idle loop by decrementing 
by 625 instead of 1.

        Best regards,
        Alexander Popov    

Attachment: bug.c
Description: Binary data

**** int main(void) {
                .stabn 68,0,8,.LM1-main
        .LM1:
        /* prologue: frame size=3 */
                ldi r28,lo8(__stack - 3)
                ldi r29,hi8(__stack - 3)
                out __SP_H__,r29
                out __SP_L__,r28
        /* prologue end (size=4) */
        .LBB2:
 ****    volatile unsigned char *p;
 ****    volatile unsigned char i;
 **** 
 ****   i=0;
                .stabn 68,0,13,.LM2-main
        .LM2:
                std Y+3,__zero_reg__
 ****    p=(unsigned char *)(RAMEND+1); 
                .stabn 68,0,14,.LM3-main
        .LM3:
                ldi r24,lo8(608)
                ldi r25,hi8(608)
                std Y+1,r24
                std Y+2,r25
        .L15:
 ****    do {
 ****           i++;
                .stabn 68,0,16,.LM4-main
        .LM4:
                ldd r24,Y+3
                subi r24,lo8(-(1))
                std Y+3,r24
 ****   } while(p++<(unsigned char *)0xffff);
                .stabn 68,0,18,.LM5-main
        .LM5:
                ldd r24,Y+1
                ldd r25,Y+2
                adiw r24,1
                std Y+1,r24
                std Y+2,r25
                sbiw r24,0
                brlo .L15
                nop
 ****    
 ****    while(42) {
                .stabn 68,0,20,.LM6-main
        .LM6:
        .L19:
                rjmp .L19
 ****    }
  
**** int main(void) {
                .stabn 68,0,8,.LM1-main
        .LM1:
        /* prologue: frame size=1 */
                ldi r28,lo8(__stack - 1)
                ldi r29,hi8(__stack - 1)
                out __SP_H__,r29
                out __SP_L__,r28
        /* prologue end (size=4) */
 ****    volatile unsigned char *p;
 ****    volatile unsigned char i;
 **** 
 ****   i=0;
                .stabn 68,0,13,.LM2-main
        .LM2:
        .LBB2:
                std Y+1,__zero_reg__
 ****    p=(unsigned char *)(RAMEND+1); 
 ****    do {
 ****           i++;
                .stabn 68,0,16,.LM3-main
        .LM3:
                ldd r18,Y+1
                subi r18,lo8(-(1))
                std Y+1,r18
 ****   } while(p++<(unsigned char *)0xffff);
 ****    
 ****    while(42) {
                .stabn 68,0,20,.LM4-main
        .LM4:
        .L21:
                rjmp .L21


reply via email to

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