http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33970
Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |gjl at gcc dot gnu.org Resolution| |WORKSFORME Target Milestone|--- |4.7.0 Known to fail| | --- Comment #13 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2011-07-20 17:47:44 UTC --- Cloased as WORKS FOR ME. Using the following test case: volatile unsigned char bar; void foo(void) { unsigned char x; for(x=0;x<128; x++) { bar = x; } } int sub2 (unsigned char); void foo2 (void) { unsigned char x; for(x=0;x<128; x++) { sub2 (x); } } void foo21 (void) { unsigned char x; for(x=0;x<128; x++) { sub2 (x+1); } } And with avr-gcc 4.7 r176517 I get the following result (-Os -mmcu=atmega8). In no case there is a 16-bit loop variable used. foo: ldi r24,lo8(0) .L5: sts bar,r24 subi r24,lo8(-(1)) cpi r24,lo8(-128) brne .L5 ret foo2: push r28 ldi r28,lo8(0) .L8: mov r24,r28 rcall sub2 subi r28,lo8(-(1)) cpi r28,lo8(-128) brne .L8 pop r28 ret foo21: push r28 ldi r28,lo8(0) .L11: subi r28,lo8(-(1)) mov r24,r28 rcall sub2 cpi r28,lo8(-128) brne .L11 pop r28 ret .ident "GCC: (GNU) 4.7.0 20110720 (experimental)"