https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97690
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- It seems to be target-independent. For aarch64, -O3 and -Os both give: f(bool): tst w0, 255 cset w0, ne lsl w0, w0, 1 ret g(bool): ubfiz w0, w0, 1, 8 ret And avr -Os is horrible: __zero_reg__ = 1 f(bool): cpse r24,__zero_reg__ rjmp .L3 ldi r25,0 ldi r24,0 ret .L3: ldi r24,lo8(2) ldi r25,0 ret g(bool): ldi r25,0 lsl r24 rol r25 ret