https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77353
Bug ID: 77353 Summary: [AVR] uint16_t instead uint8_t comparison Product: gcc Version: 6.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: bseifert at gmx dot at Target Milestone: --- Consider the following code: if (PINA < static_cast<uint8_t>(32)) { PORTB = 0; } It compiles to - as expected: 6dc: 80 b1 in r24, 0x00 ; 0 6de: 80 32 cpi r24, 0x20 ; 32 6e0: 08 f4 brcc .+2 ; 0x6e4 <main+0x8> 6e2: 15 b8 out 0x05, r1 ; 5 In GCC 6.2.0 a uint16_t instead of sufficient uint8_t comparison is performed - high byte set to 0: 6d8: 80 b1 in r24, 0x00 ; 0 6da: 90 e0 ldi r25, 0x00 ; 0 6dc: 80 97 sbiw r24, 0x20 ; 32 6de: 0c f4 brge .+2 ; 0x6e2 <main+0xa> 6e0: 15 b8 out 0x05, r1 ; 5 Once I also got the following compilation in GCC 6.2.0 with similar code snippet: 0: 28 2f mov r18, r24 2: 30 e0 ldi r19, 0x00 ; 0 4: 20 32 cpi r18, 0x20 ; 32 6: 31 05 cpc r19, r1 8: 04 f0 brlt .+0 ; 0xa <ADC::measure(unsigned char)+0xa> Here also a uint16_t instead of uint8_t comparison is performed and the even less performant cpi/cpc instructions are used instead of sbiw.