As the avr is an 8-bit processor, it is important to handle data as 8-bit when possible, even though the C standards force 8-bit data to be promoted to 16-bit ints in many situations. Common cases are when doing logic operations on chars - when legally valid (i.e., the results are the same as for 16-bit operations), the generated code should use 8-bit operations. In particular, logic operations using constants such as 0 and 0xff should be optimised.
Optimisation works well in many cases, but fails when the expressions get slightly more complex: 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]; } 40 bar: 41 /* prologue: frame size=0 */ 42 /* prologue end (size=0) */ 43 0000 E82F mov r30,r24 ; x, x 44 0002 F0E0 ldi r31,lo8(0) ; x, 45 0004 EF70 andi r30,lo8(15) ; x, 46 0006 F070 andi r31,hi8(15) ; x, 47 0008 70E0 ldi r23,lo8(0) ; y, 48 000a E627 eor r30,r22 ; x, y 49 000c F727 eor r31,r23 ; x, y 50 000e E050 subi r30,lo8(-(data)) ; x, 51 0010 F040 sbci r31,hi8(-(data)) ; x, 52 0012 8081 ld r24,Z ; tmp51, data 53 0014 90E0 ldi r25,lo8(0) ; <result>, 54 /* epilogue: frame size=0 */ 55 0016 0895 ret 56 /* epilogue end (size=1) */ 57 /* function bar size 12 (11) */ 61 bar2: 62 /* prologue: frame size=0 */ 63 /* prologue end (size=0) */ 64 0018 E62F mov r30,r22 ; y, y 65 001a E827 eor r30,r24 ; y, x 66 001c F0E0 ldi r31,lo8(0) ; , 67 001e EF70 andi r30,lo8(15) ; tmp46, 68 0020 F070 andi r31,hi8(15) ; tmp46, 69 0022 E050 subi r30,lo8(-(data)) ; tmp46, 70 0024 F040 sbci r31,hi8(-(data)) ; tmp46, 71 0026 8081 ld r24,Z ; tmp50, data 72 0028 90E0 ldi r25,lo8(0) ; <result>, 73 /* epilogue: frame size=0 */ 74 002a 0895 ret 75 /* epilogue end (size=1) */ 76 /* function bar2 size 10 (9) */ The first function "bar" has several clear improvements - it does all the logic operations as 16-bit. In the second case, the "eor" is nicely handled as 8-bit, but the "& 0x0f" is done as 16-bit - there is an unnecessary "andi r31, hi8(15)" instruction. -- Summary: Missed optimisation on avr - optimisation of 8-bit logic sometimes fails Product: gcc Version: 4.2.2 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: david at westcontrol dot com GCC target triplet: avrgcc http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34791