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.)