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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

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

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So the reason we get so weird locations is we have:
(debug_insn 20 19 21 3 (var_location:DI D#6 (xor:DI (xor:DI (reg:DI 0 ax
[orig:95 l3.6_9 ] [95])
            (reg:DI 1 dx [103]))
        (const_int 1 [0x1]))) "pr80025.c":22 -1
     (nil))
$110 = void
(gdb) p debug_rtx (insn->u.fld[1].rt_rtx)
(insn:TI 21 20 22 3 (parallel [
            (set (reg:DI 0 ax [105])
                (xor:DI (reg:DI 0 ax [orig:95 l3.6_9 ] [95])
                    (const_int 1 [0x1])))
            (clobber (reg:CC 17 flags))
        ]) "pr80025.c":22 418 {*xordi_1}
     (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))

and register dx contains (const_int 1).  ax before insn 21 change is value
19:19,
value 21:8705 is whatever we've created for the whole debug_insn 20 expression,
with
(xor:DI (xor:DI (value/u:DI 19:19 @0x2920a70/0x2844900)
        (value/u:DI 13:4258 @0x29209e0/0x28447e0))
    (const_int 1 [0x1]))
loc, where value 13:4258 is that of dx with const_int 1 in it.
The new value of ax after insn 21 is 22:4362, which has
(xor:DI (value/u:DI 19:19 @0x2920a70/0x2844900)
    (const_int 1 [0x1]))
as its location.  Then as XOR is reversible, we try to create the reverse
mapping for that and for that attempt to permanently equate 19:19 to
(xor:DI (value:DI 22:4362 @0x2920ab8/0x2844990)
    (const_int 1 [0x1]))
But during cselib lookup of that expression we find that value 21:8705 has the
same value and thus equate 19:19 to the loc from 21:8705, which is the
self-reference.

Reply via email to