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.