[Bug rtl-optimization/50078] [4.6/4.7 Regression] combine wrong code: volatile accesses optimized out
steven at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Sep 11 15:26:00 GMT 2011
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.
More information about the Gcc-bugs
mailing list