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

Reply via email to