https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91006
Jan Hubicka <hubicka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |mjambor at suse dot cz
--- Comment #1 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
Hello,
I looked at the flifetime-dse testcase. It is missed optimization because C++
FE does not place clobbers after explicit dtor calls and IPA-SRA thinks it is
good idea to kill them (which I think would be if C++ FE placed the clobbers
into callers).
Jason, is there chance to update C++ FE here?
It is a missed optimization. What happens is that with Darwin we decide to
apply SRA on:
;; Function A::A (_ZN1AC1Ev, funcdef_no=3, decl_uid=2333, cgraph_uid=4,
symbol_order=3)
A::A (struct A * const this)
{
<bb 2> :
*this_2(D) ={v} {CLOBBER};
return;
}
;; Function A::~A (_ZN1AD1Ev, funcdef_no=6, decl_uid=2337, cgraph_uid=7,
symbol_order=6)
A::~A (struct A * const this)
{
<bb 2> :
*this_2(D) ={v} {CLOBBER};
return;
}
which leads to
A::_ZN1AC1Ev.isra.0 ()
{
struct A * const this;
<bb 3> :
<bb 2> :
return;
}
A::_ZN1AD1Ev.isra.0 ()
{
struct A * const this;
<bb 3> :
<bb 2> :
return;
}
and after inlining we no longer see the clobber. I wonder why this does not
happen everwhere?
I also would have expected C++ FE to produce clobber after the constructor call
so we can DSE even w/o inlining the constructor, but this is not the case as
seen in the early SRA dump:
main ()
{
struct A * ap;
int ar[1];
int _1;
int _2;
void * _6;
int _12;
<bb 2> :
ar[0] = 42;
_6 = operator new (4, &ar);
A::A (_6);
ap_8 = _6;
_1 = ap_8->i;
if (_1 == 42)
goto <bb 3>; [INV]
else
goto <bb 4>; [INV]
<bb 3> :
__builtin_abort ();
<bb 4> :
ap_8->i = 42;
A::~A (ap_8);
_2 = ar[0];
if (_2 == 42)
goto <bb 5>; [INV]
else
goto <bb 6>; [INV]
<bb 5> :
__builtin_abort ();
<bb 6> :
ar ={v} {CLOBBER};
_12 = 0;
return _12;
}
The clobber is placed at the end of scope block. Perhaps it is because
destructor is called explicitly? Can still C++ FE place clobbers in this case?
Honza