https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114111
--- Comment #3 from Georg-Johann Lay <gjl at gcc dot gnu.org> --- The avr backend has some combiner patterns to mitigate the bloated code, however since recently, some pass is popping up subregs like in: (insn 10 9 15 2 (set (reg:HI 48 [ _5 ]) (plus:HI (reg/v:HI 46 [ x ]) (subreg:HI (reg:SI 50) 0))) "foo.c":54:14 167 {*addhi3_split} (expr_list:REG_DEAD (reg:SI 50) (expr_list:REG_DEAD (reg/v:HI 46 [ x ]) (nil)))) that are frowned upon by combine: Failed to match this instruction: (set (reg:HI 48 [ _5 ]) (plus:HI (clobber:HI (const_int 0 [0])) (reg:HI 51 [ x ]))) etc. for int add_ge0_32 (int x, long c) { return x + (c >= 0); } int add_lt0_32 (int x, long c) { return x + (c < 0); }