https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100056
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So, the change is that previously there was just one significant combination, Trying 7 -> 8: 7: r96:SI=r94:SI<<0xb 8: r95:SI=r96:SI|r94:SI REG_DEAD r96:SI REG_DEAD r94:SI Successfully matched this instruction: (set (reg:SI 95) (ior:SI (ashift:SI (reg/v:SI 94 [ i ]) (const_int 11 [0xb])) (reg/v:SI 94 [ i ]))) With the addition of 2 to 2 combination, Trying 2 -> 7: 2: r94:SI=zero_extend(x0:QI) REG_DEAD x0:QI 7: r96:SI=r94:SI<<0xb is replaced with: (set (reg/v:SI 94 [ i ]) (zero_extend:SI (reg:QI 0 x0 [ i ]))) and (set (reg:SI 96) (and:SI (ashift:SI (reg:SI 0 x0 [ i ]) (const_int 11 [0xb])) (const_int 522240 [0x7f800]))) and therefore the combination that was successful earlier no longer triggers. So, I think it would be helpful to have a combiner splitter that would split Trying 7, 2 -> 8: 7: r96:SI=x0:SI<<0xb&0x7f800 REG_DEAD x0:QI 2: r94:SI=zero_extend(x0:QI) 8: r95:SI=r96:SI|r94:SI the zero_extend and (set (reg:SI 95) (ior:SI (ashift:SI (reg/v:SI 94 [ i ]) (const_int 11 [0xb])) (reg/v:SI 94 [ i ])))