http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50078

--- Comment #6 from Steven Bosscher <steven at gcc dot gnu.org> 2011-09-11 
15:22:36 UTC ---
int
set_noop_p (const_rtx set)
{
  rtx src = SET_SRC (set);
  rtx dst = SET_DEST (set);

  if (dst == pc_rtx && src == pc_rtx)
    return 1;

  if (MEM_P (dst) && MEM_P (src))
    return rtx_equal_p (dst, src) && !side_effects_p (dst);

Note there is no check on side_effects_p(src).

Breakpoint 8, set_noop_p (set=0x7ffff70a6d98) at ../../trunk/gcc/rtlanal.c:1094
1094      rtx src = SET_SRC (set);
(gdb) step
1095      rtx dst = SET_DEST (set);
(gdb) next
1097      if (dst == pc_rtx && src == pc_rtx)
(gdb) p debug_rtx(dst)
(mem/s:SI (plus:DI (mult:DI (reg:DI 61 [ arg ])
            (const_int 4 [0x4]))
        (symbol_ref:DI ("var") <var_decl 0x7ffff7eb0140 var>)) [2 var S4 A32])
$8 = void
(gdb) p debug_rtx(src)
(mem/s/v:SI (plus:DI (mult:DI (reg:DI 61 [ arg ])
            (const_int 4 [0x4]))
        (symbol_ref:DI ("var") <var_decl 0x7ffff7eb0140 var>)) [2 var S4 A32])
$9 = void
(gdb) step
1100      if (MEM_P (dst) && MEM_P (src))
(gdb) p side_effects_p(src)
$11 = 1
(gdb) step
1101        return rtx_equal_p (dst, src) && !side_effects_p (dst);
(gdb) p rtx_equal_p (dst, src)
$12 = 1
(gdb) p side_effects_p(dst)
$10 = 0
(gdb) 

Note that dst is not a volatile MEM for some reason.

Reply via email to