Dear Richard, The optimization step for doing it does already exist --> it is used for stack variables/objects, but unfortunately not for the global ones. The same optimization should work for the global variables/objects, too. Or am I wrong?
Stefan -----Ursprüngliche Nachricht----- Von: Richard Biener [mailto:richard.guent...@gmail.com] Gesendet: Mittwoch, 08. April 2015 12:14 An: Stefan Ehrlich Cc: Jan Hubicka; GCC Development; zl...@acm.org Betreff: Re: g++keeps unused objects with virtual functions On Wed, Apr 8, 2015 at 11:59 AM, Stefan Ehrlich <stefan.ehrl...@ehrlich.eu> wrote: > 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? Nothing (well, improve GCC!). Richard. > Stefan > > -----Ursprüngliche Nachricht----- > Von: Jan Hubicka [mailto:hubi...@ucw.cz] > Gesendet: Mittwoch, 08. April 2015 11:00 > An: Jan Hubicka > Cc: Richard Biener; Stefan Ehrlich; GCC Development; zl...@acm.org > 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