https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93565
--- Comment #13 from Segher Boessenkool <segher at gcc dot gnu.org> --- nonzero_bits is not reliable. We also cannot really do what you propose here, all of this is done for *every* combination. We currently generate (set (reg/v:SI 96 [ a ]) (and:SI (reg:SI 104) (const_int 14 [0xe]))) (set (reg:DI 99 [ a ]) (and:DI (subreg:DI (reg:SI 104) 0) (const_int 14 [0xe]))) If we can somehow see the first one is just the lowpart subreg of the second, we can handle it the same as the first case.