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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Just to explain more why the strcpy.c testcase breaks.

During postreload cse, we have:
(insn 63 61 70 5 (set (mem/c:QI (plus:SI (reg:SI 5 di [87])
                (const:SI (plus:SI (unspec:SI [
                                (symbol_ref:SI ("p") [flags 0x2]  <var_decl
0x7f4bb4427990 p>)
                            ] UNSPEC_GOTOFF)
                        (const_int 1 [0x1])))) [0 MEM[(void *)&p + 1B]+0 S1
A8])
        (const_int 0 [0]))
/usr/src/gcc/gcc/testsuite/gcc.c-torture/execute/builtins/strcpy.c:22 93
{*movqi_internal}
     (nil))
...
(insn 111 109 113 7 (set (mem/c:SI (plus:SI (reg:SI 5 di [87])
                (const:SI (unspec:SI [
                            (symbol_ref:SI ("p") [flags 0x2]  <var_decl
0x7f4bb4427990 p>)
                        ] UNSPEC_GOTOFF))) [0 MEM[(void *)&p]+0 S4 A8])
        (const_int 1145258561 [0x44434241]))
/usr/src/gcc/gcc/testsuite/gcc.c-torture/execute/builtins/strcpy.c:26 90
{*movsi_internal}
     (nil))

and when trying to invalidate memories because of the insn 111 store, we call
find_base_term on:

(plus:SI (value:SI 23:23 @0x2068db0/0x205e3f0)
    (const:SI (plus:SI (unspec:SI [
                    (symbol_ref:SI ("p") [flags 0x2] <var_decl 0x7ffff1865990
p>)
                ] UNSPEC_GOTOFF)
            (const_int 1 [0x1]))))

(from the 63 instruction, stored in cselib stuff), and
ix86_delegitimize_address returns

(plus:SI (minus:SI (value:SI 23:23 @0x2068db0/0x205e3f0)
        (symbol_ref:SI ("_GLOBAL_OFFSET_TABLE_")))
    (const:SI (plus:SI (symbol_ref:SI ("p") [flags 0x2] <var_decl
0x7ffff1865990 p>)
            (const_int 1 [0x1]))))

and finally find_base_term returns
(symbol_ref "_GLOBAL_OFFSET_TABLE_") (incorrectly), and then call
find_base_term on:
(plus:SI (reg:SI 5 di [87])
    (const:SI (unspec:SI [
                (symbol_ref:SI ("p") [flags 0x2] <var_decl 0x7ffff1865990 p>)
            ] UNSPEC_GOTOFF)))
(directly from the insn, so no VALUEs yet), and as ORIGINAL_REGNO of di is 87 -
the pic reg pseudo, we delegitimize that to
(symbol_ref:SI ("p") [flags 0x2] <var_decl 0x7ffff1865990 p>)
and find_base_term on that is that symbol, and thus we think those two memory
stores don't overlap.

Reply via email to