Takayuki, thank you for the quick fix! It seems works good now except only one degradation. Instead generating two instructions:
7 ptr += (i & 1); 0x40078564 <+12>: extui a9, a8, 0, 1 0x40078567 <+15>: addx2 a2, a9, a2 Now it generates three: 7 ptr += (i & 1); 0x40078564 <+12>: extui a9, a8, 0, 1 0x40078567 <+15>: addx2 a9, a9, a2 0x4007856a <+18>: mov.n a2, a9 Testcase to reproduce: #include <stdint.h> __attribute__((noinline)) void * func (short *ptr, uint8_t count) { for (unsigned i = 0; i < count; i++) { ptr += (i & 1); } return ptr; } int main(void) { short buf[16] = {}; func(buf, 16); }