The following code snippet fails to compile with -Os -O1 -O2 or -O3. It
compiles fine using -O0

I tested both the Win32 and linux versions of the compiler and they both fail
the same way.

The exact command line used was:
avr-gcc -c -mmcu=atmega168 -Os ee-fail.c

Removing the second call to fill_pwm_table also allows the code to compile.

The error message received from the compiler are as follows:
ee-fail.c: In function 'build_pwm_table':
/home/dhylands/avr-4.1.1/lib/gcc/avr/4.1.1/../../../../avr/include/avr/eeprom.h:208:
error: can't find a register in class 'BASE_POINTER_REGS' while reloading 'asm'
/home/dhylands/avr-4.1.1/lib/gcc/avr/4.1.1/../../../../avr/include/avr/eeprom.h:208:
error: can't find a register in class 'BASE_POINTER_REGS' while reloading 'asm'

avr-gcc -v on my linux box reports:
Using built-in specs.
Target: avr
Configured with: ../../source/gcc-4.1.1/configure -v --target=avr --disable-nls
--prefix=/home/dhylands/avr-4.1.1 --with-gnu-ld --with-gnu-as
--enable-languages=c,c++ --quiet --disable-libssp --with-dwarf2
Thread model: single
gcc version 4.1.1


#include <avr/eeprom.h>

uint8_t    pwm_tab_1 [126];

static uint16_t  ee_chan_1_min EEMEM = 140,
                ee_chan_1_cent EEMEM = 188,
                ee_chan_1_max EEMEM = 240,
                ee_chan_1_forw_min EEMEM = 20,
                ee_chan_1_forw_max EEMEM = 90,
                ee_chan_1_back_max EEMEM = 80;

void fill_pwm_table (int8_t chan_num, uint8_t pwm [], int16_t forward_max,
                    int16_t center, int16_t reverse_min, int16_t forward_high,
                    int16_t forward_low, int16_t reverse_high );

void build_pwm_table (void)
{
 int16_t   center_1,
           forward_max_1,
           reverse_min_1,
           forward_high_1,
           forward_low_1,
           reverse_high_1;

 center_1 = eeprom_read_word (&ee_chan_1_cent);

 forward_max_1 = eeprom_read_word (&ee_chan_1_max);
 reverse_min_1 = eeprom_read_word (&ee_chan_1_min);
 forward_high_1 = eeprom_read_word (&ee_chan_1_forw_max);
 forward_low_1 = eeprom_read_word (&ee_chan_1_forw_min);
 reverse_high_1 = eeprom_read_word (&ee_chan_1_back_max);

 fill_pwm_table (1, pwm_tab_1, forward_max_1, center_1, reverse_min_1,
                 forward_high_1, forward_low_1, reverse_high_1);

 fill_pwm_table (1, pwm_tab_1, forward_max_1, center_1, reverse_min_1,
                 forward_high_1, forward_low_1, reverse_high_1);
}


-- 
           Summary: Code snippet that fails to compile with optimization
                    enabled
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dhylands at gmail dot com
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: avr


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

Reply via email to