https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91860

Jim Wilson <wilson at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |wilson at gcc dot gnu.org

--- Comment #1 from Jim Wilson <wilson at gcc dot gnu.org> ---
Combine is doing a 3 instruction split into 2 which appears ok

Trying 12, 14 -> 18:
   12: r84:SI=0xa000
   14: r76:DI=sign_extend(r84:SI+0x466)
      REG_DEAD r84:SI
      REG_EQUAL 0xa466
   18: r87:DI=~r76:DI
      REG_DEAD r76:DI
Failed to match this instruction:
(set (reg:DI 87)
    (const_int -42087 [0xffffffffffff5b99]))
Splitting with gen_split_11 (riscv.md:1280)
Successfully matched this instruction:
(set (reg:DI 76 [ _7 ])
    (const_int -40960 [0xffffffffffff6000]))
Successfully matched this instruction:
(set (reg:DI 87)
    (plus:DI (reg:DI 76 [ _7 ])
        (const_int -1127 [0xfffffffffffffb99])))
allowing combination of insns 12, 14 and 18
original costs 4 + 8 + 4 = 16
replacement costs 4 + 4 = 8

however a side effect of this is that when i1 is substituted into newpat, i2src
becomes invalid RTL

gdb) print i2src
$74 = (rtx) 0x7ffff6262b90
(gdb) pr
warning: Expression is not an assignment (and might have no effect)
(sign_extend:DI (const_int 42086 [0xa466]))

This wouldn't be a problem normally, except that i2src is later used to
generate a debug instruction via propagate_for_debug.  This calls
simplify_replace_fn_rtx which crashes on the invalid rtl.

Looks like we need to copy i2src sooner than we currently do.

Reply via email to