This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/39633] New: loop bug on AVR


In the code below, g_52 should end up being 5.  At -O1, avr-gcc-4.5.0 puts 1
into this variable.  Verified using AVR Studio.  4.3.3 also seems to have this
bug.

regehr@john-home:~/volatile/work0/014255$ avr-gcc -O1 small.c -mmcu=atmega128
-o small.elf
regehr@john-home:~/volatile/work0/014255$ avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../configure --prefix=/home/regehr/avrgcc440/install
--target=avr --enable-languages=c,c++ --disable-nls --disable-libssp :
(reconfigured) ../configure --prefix=/home/regehr/avrgcc440/install
--target=avr --enable-languages=c,c++ --disable-nls --disable-libssp :
(reconfigured) ../configure --prefix=/home/regehr/avrgcc440/install
--target=avr --enable-languages=c,c++ --disable-nls --disable-libssp
Thread model: single
gcc version 4.5.0 20090403 (experimental) (GCC) 
regehr@john-home:~/volatile/work0/014255$ cat small.c
#include <stdint.h>
#include <limits.h>

#define safe_add_macro_int8_t_s_s(si1,si2) \
                ((((((int8_t)(si1))>((int8_t)0)) &&
(((int8_t)(si2))>((int8_t)0)) && (((int8_t)(si1)) >
((INT8_MAX)-((int8_t)(si2))))) \
                  || ((((int8_t)(si1))<((int8_t)0)) &&
(((int8_t)(si2))<((int8_t)0)) && (((int8_t)(si1)) <
((INT8_MIN)-((int8_t)(si2)))))) \
                 ? ((int8_t)(si1)) \
                 : (((int8_t)(si1)) + ((int8_t)(si2))) \
                 ) 

static int8_t
safe_add_func_int8_t_s_s(int8_t _si1, int8_t _si2)
{
  return safe_add_macro_int8_t_s_s(_si1,_si2);
}

uint8_t g_52;

void func_1 (void);
void func_1 (void)
{
  uint64_t l_116;
  for (l_116 = 0; l_116 < 13; l_116 = safe_add_func_int8_t_s_s (l_116, 3))
    {
      g_52++;
    }
}

static inline void platform_main_end(uint32_t crc);
static inline void platform_main_end(uint32_t crc)
{
        uint16_t crc16 = crc ^ (crc >> 16);

        asm volatile("cli" "\n\t"
                                 "mov r30, %A0" "\n\t"
                                 "mov r31, %B0" "\n\t"
                                 "break"
                                 :
                                 : "r" (crc16)
                                 : "memory"
                                 );
}

int main (void)
{
  func_1 ();
  platform_main_end (g_52);
  return 0;
}


-- 
           Summary: loop bug on AVR
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: regehr at cs dot utah dot edu
 GCC build triplet: i486-linux-gnu
  GCC host triplet: i486-linux-gnu
GCC target triplet: avr


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39633


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]