https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109907
--- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So there is another way of fixing this. take: Trying 6 -> 12: 6: r49:SI=r50:SI>>0x1f REG_DEAD r50:SI 12: r24:QI=r49:SI#0&0x1 REG_DEAD r49:SI Failed to match this instruction: (set (reg/i:QI 24 r24) (neg:QI (subreg:QI (ashiftrt:SI (reg:SI 50) (const_int 31 [0x1f])) 0))) It is correct but maybe the subreg should combine with the shift and change it just (lshiftrt:QI (subreg:QI (reg:SI 50)) (const_int 7)) . Once combine does that, then maybe that could match ... What is interesting is subreg1 does the splitting for HI mode . Maybe Roger could look improving that since he was touching it recently for avr IIRC.