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