Code:

#include <avr/io.h>

register uint8_t test asm("r2");

int main(void)
{
    test = TCNT0;
}

Compiled with -Os results in the following instruction sequence:

00000092 <main>:
  92:   82 b7           in      r24, 0x32       ; 50
  94:   28 2e           mov     r2, r24
  96:   08 95           ret

This is particularly nasty for naked interrupts, where one would expect the
compiler to generate just a single instruction:

  in  r2, 0x32

Apparently the compiler behaves correctly when opposite transfer is requested,
generating single OUT opcode.


-- 
           Summary: [avr] missed optimisation with IO read and register
                    variables
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: k dot kosciuszkiewicz+gcc at gmail dot com


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

Reply via email to