But without the virtual keyword the global object never read is completely
removed, so the statement "[...]but we don't have any pass removing stores to
globals never read[...]" is only true with virtual functions.
When I create the object on the stack, the optimization removes the object even
with virtual functions completely (resp. partially when only a part of the
object is used).
The SomeData is removed completely, when created on stack (regardless I call
the function virtFunction) - when the commented out object NotUsedObject is
getting back into the code, the vtable, the virtual function, and the 100 ints
are present in the executable.
class CObject
{
public: virtual void virtFunction() {}
public: int SomeData[100];
};
//CObject NotUsedObject;
int main()
{
CObject UsedObject;
UsedObject.virtFunction();
return 0;
}
So what can I do?
Stefan
-----Ursprüngliche Nachricht-----
Von: Jan Hubicka [mailto:[email protected]]
Gesendet: Mittwoch, 08. April 2015 11:00
An: Jan Hubicka
Cc: Richard Biener; Stefan Ehrlich; GCC Development; [email protected]
Betreff: Re: g++keeps unused objects with virtual functions
> > which shows how the global objects initialization keeps things live.
> > Early optimization turns it into
> >
> > (static initializers for t.C) ()
> > {
> > <bb 2>:
> > NotUsedObject._vptr.CObject = &MEM[(void *)&_ZTV7CObject + 16B];
> > return;
> >
> > }
> >
> > but we don't have any pass removing stores to globals never read.
> > IPA reference computes this in some way but doesn't get to export
> > this in a reasonable way - its transform stage could DSE those
> > though.
>
> We have write only variable detection but
> > NotUsedObject/4 (CObject NotUsedObject) @0x7f70d41fe580
> > Type: variable definition analyzed
> > Visibility: public
> > References:
> > Referring: _Z41__static_initialization_and_destruction_0ii/9 (addr)
> > Availability: not-ready
> > Varpool flags:
>
> it stops on fact believing that address of NotUsedObject is taken. Why
> it is not considered to be load?
Too early dump I guess. At mainline I get empty constructor:
.type _GLOBAL__sub_I_NotUsedObject, @function
_GLOBAL__sub_I_NotUsedObject:
.LFB6:
rep ret
not ideal, but still an improvement ;)
The problem is that write only var is removed only at late optimization and
then it is too late to remove the unreachable function.
Honza
>
> Honza