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: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