http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34791
Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target|avr-*-* |avr Status|NEW |RESOLVED Resolution| |FIXED --- Comment #3 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2011-10-09 20:40:51 UTC --- Compiled the following code from commant #0 and commant #1 with avr-gcc 4.7 (SVN 179594) #define uint8_t unsigned char #define PORTC (*((uint8_t volatile*) 0x28)) extern uint8_t data[64]; uint8_t bar(uint8_t x, uint8_t y) { return data[y ^ (x & 0x0f)]; } uint8_t bar2(uint8_t x, uint8_t y) { return data[(y ^ x) & 0x0f]; } void foo(void) { static unsigned char count; if (++count & 0x3f) { PORTC &= ~0x01; } else { PORTC |= 0x01; } } With -Os -dp yields the following result: bar: andi r24,lo8(15) eor r24,r22 mov r30,r24 ldi r31,lo8(0) subi r30,lo8(-(data)) sbci r31,hi8(-(data)) ld r24,Z ret bar2: eor r22,r24 andi r22,lo8(15) mov r30,r22 ldi r31,lo8(0) subi r30,lo8(-(data)) sbci r31,hi8(-(data)) ld r24,Z ret foo: lds r24,count.1232 subi r24,lo8(-(1)) sts count.1232,r24 andi r24,lo8(63) breq .L4 cbi 40-0x20,0 ret .L4: sbi 40-0x20,0 ret Thus, closing this PR as FIXED because the code is optimal and nothing remains to be improved.