https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94026
--- Comment #10 from Segher Boessenkool <segher at gcc dot gnu.org> --- So on Arm we get Trying 6 -> 8: 6: r119:SI=r123:SI>>0x8 REG_DEAD r123:SI 8: {cc:CC_NZ=cmp(r119:SI&0x6,0);clobber scratch;} REG_DEAD r119:SI Failed to match this instruction: (parallel [ (set (reg:CC_NZ 100 cc) (compare:CC_NZ (and:SI (lshiftrt:SI (reg:SI 123) (const_int 8 [0x8])) (const_int 6 [0x6])) (const_int 0 [0]))) (clobber (scratch:SI)) ]) Failed to match this instruction: (set (reg:CC_NZ 100 cc) (compare:CC_NZ (and:SI (lshiftrt:SI (reg:SI 123) (const_int 8 [0x8])) (const_int 6 [0x6])) (const_int 0 [0]))) instead of something like (set (reg:CC_NZ 100 cc) (compare:CC_NZ (and:SI (reg:SI 123) (const_int 1536)) (const_int 0))) which is correct for every CC mode even, not just NZ?