https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82666
--- Comment #13 from Andrew Pinski <pinskia at gcc dot gnu.org> --- I don't know if this could help here but combine does produce: Trying 37, 34 -> 38: 37: flags:CCGC=cmp(r82:SI,0x7f) REG_DEAD r82:SI 34: {r92:DI=r87:DI+r89:DI;clobber flags:CC;} REG_DEAD r89:DI REG_UNUSED flags:CC 38: r87:DI={(flags:CCGC>0)?r92:DI:r87:DI} REG_DEAD r92:DI REG_DEAD flags:CCGC Failed to match this instruction: (set (reg/v:DI 87 [ <retval> ]) (plus:DI (mult:DI (gt:DI (reg:SI 82 [ _4 ]) (const_int 127 [0x7f])) (reg:DI 89 [ _4 ])) (reg/v:DI 87 [ <retval> ]))) I don't know if we could catch this in the backend and split this into 3 instructions if that would do the right thing ...