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

Pat Haugen <pthaugen at linux dot ibm.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pthaugen at linux dot ibm.com,
                   |                            |rguenth at gcc dot gnu.org

--- Comment #22 from Pat Haugen <pthaugen at linux dot ibm.com> ---
So the problem appears to be alias.c:true_dependence() telling
sched-deps.c:sched_analyze_2() that the following two instructions' memory
references don't alias.

Breakpoint 11, sched_analyze_2 (deps=0x7fffffffdbf8, x=0x7ffff59a1a40,
insn=0x7ffff57f16c0)
    at /home/pthaugen/src/gcc/temp/gcc/gcc/sched-deps.c:2671
2671                    if (true_dependence (pending_mem->element (), VOIDmode,
t)
(gdb) pr pending->insn()
(insn 37 36 38 4 (set (mem/f/c:DI (unspec:DI [
                    (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
                    (reg:DI 2 2)
                ] UNSPEC_TOCREL) [8 c_+0 S8 A64])
        (reg/f:DI 141)) "proc_ptr_51.f90":28:0 609 {*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 141)
        (nil)))

(gdb) pr insn
(insn 39 38 40 4 (set (reg/f:DI 143 [ c_ ])
        (mem/f/c:DI (reg/f:DI 142) [8 c_+0 S8 A64])) "proc_ptr_51.f90":37:0 609
{*movdi_internal64}
     (expr_list:REG_DEAD (reg/f:DI 142)
        (expr_list:REG_EQUAL (mem/f/c:DI (symbol_ref:DI ("__f_MOD_c_") [flags
0xc0] <var_decl 0x7ffff7f70990 c_>) [8 c_+0 S8 A64])
            (nil))))

Which then lets the scheduler move the load above the store. Since they really
are referring to the same location, we load up garbage (null) and branch to it.

Including some additional detail from a couple various spots in the debug
chain. Hoping someone with more alias.c knowledge can chime in.


Breakpoint 13, true_dependence_1 (mem=0x7ffff59a4878, mem_mode=E_VOIDmode,
mem_addr=0x0, x=0x7ffff59a8e08, 
    x_addr=0x0, mem_canonicalized=false) at
/home/pthaugen/src/gcc/temp/gcc/gcc/alias.c:2902
2902    {
(gdb) pr mem
(mem/f/c:DI (unspec:DI [
            (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
            (reg:DI 2 2)
        ] UNSPEC_TOCREL) [8 c_+0 S8 A64])
(gdb) pr x
(mem/f/c:DI (symbol_ref:DI ("__f_MOD_c_") [flags 0xc0] <var_decl 0x7ffff7f70990
c_>) [8 c_+0 S8 A64])

...

(gdb) pr x_addr
(symbol_ref:DI ("__f_MOD_c_") [flags 0xc0] <var_decl 0x7ffff7f70990 c_>)
(gdb) pr true_mem_addr
(unspec:DI [
        (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
        (reg:DI 2 2)
    ] UNSPEC_TOCREL)
(gdb) pr mem_base
(symbol_ref:DI ("*.LANCHOR1") [flags 0x182])

2958      if (! base_alias_check (x_addr, base, true_mem_addr, mem_base,
(gdb) p base_alias_check (x_addr, base, true_mem_addr, mem_base, GET_MODE (x),
mem_mode)
$18 = 0

(gdb) s
base_alias_check (x=0x7ffff5992990, x_base=0x7ffff5992990, y=0x7ffff59a4890,
y_base=0x7ffff5990ac8, 
    x_mode=E_DImode, y_mode=E_DImode) at
/home/pthaugen/src/gcc/temp/gcc/gcc/alias.c:2174
2174      if (x_base == 0)
(gdb) pr x
(symbol_ref:DI ("__f_MOD_c_") [flags 0xc0] <var_decl 0x7ffff7f70990 c_>)
(gdb) pr x_base
(symbol_ref:DI ("__f_MOD_c_") [flags 0xc0] <var_decl 0x7ffff7f70990 c_>)
(gdb) pr y
(unspec:DI [
        (symbol_ref:DI ("*.LANCHOR1") [flags 0x182])
        (reg:DI 2 2)
    ] UNSPEC_TOCREL)
(gdb) pr y_base
(symbol_ref:DI ("*.LANCHOR1") [flags 0x182])

2221        return compare_base_symbol_refs (x_base, y_base) != 0;
(gdb) p compare_base_symbol_refs (x_base, y_base)
$19 = 0

2136          if (!x_node->definition)
(gdb) n
2137            return 0;

Reply via email to