[Bug tree-optimization/84824] DCE fails to remove dead code of std::function constructor
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Mar 12 09:20:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84824
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |alias, missed-optimization
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-03-12
CC| |rguenth at gcc dot gnu.org
Component|c++ |tree-optimization
Ever confirmed|0 |1
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
The issue is that printf () clobbers global memory and thus the std::function
object:
<bb 2> [100.00%]:
MEM[(struct __lambda0 *)&D.30227] = 1;
D.30227._M_invoker = _M_invoke;
D.30227.D.29944._M_manager = _M_manager;
__builtin_printf ("%d", 3);
<bb 3> [100.00%]:
_5 = MEM[(struct _Function_base *)&D.30227]._M_manager;
if (_5 != 0B)
goto <bb 4>; [94.39%]
else
goto <bb 5>; [5.61%]
<bb 4> [94.39%]:
_5 (&MEM[(struct _Function_base *)&D.30227]._M_functor, &MEM[(struct
_Function_base *)&D.30227]._M_functor, 3);
..
we fail to CSE the load from ._M_manager across printf for this reason.
Note that D.30227 later escapes and given our "IPA mod-ref" analysis
is context insensitive this is enough to not optimize it.
I'm not sure if any std::function reorg could help with this issue. Better
escape analysis might.
More information about the Gcc-bugs
mailing list