https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87763
--- Comment #42 from Segher Boessenkool <segher at gcc dot gnu.org> --- The "movk" failures... This is from insv_1.c: Trying 7, 6 -> 8: 7: r95:DI=0x1d6b00000000 6: r93:DI=r97:DI&0xffff0000ffffffff REG_DEAD r97:DI 8: r94:DI=r93:DI|r95:DI REG_DEAD r95:DI REG_DEAD r93:DI REG_EQUAL r93:DI|0x1d6b00000000 Failed to match this instruction: (set (reg:DI 94) (ior:DI (and:DI (reg:DI 97) (const_int -281470681743361 [0xffff0000ffffffff])) (const_int 32345398706176 [0x1d6b00000000]))) Successfully matched this instruction: (set (reg:DI 95) (and:DI (reg:DI 97) (const_int -281470681743361 [0xffff0000ffffffff]))) Failed to match this instruction: (set (reg:DI 94) (ior:DI (reg:DI 95) (const_int 32345398706176 [0x1d6b00000000]))) It should have matched what it originally cam up with, afaics? This is exactly what movk does? (Don't rely on the input and output regs to agree, like with insv; that only happens by chance. Instead, use separate operands, with "0" constraint, etc.)