This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AW: g++keeps unused objects with virtual functions

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;
	return 0;

So what can I do?


-----Ursprüngliche Nachricht-----
Von: Jan Hubicka [] 
Gesendet: Mittwoch, 08. April 2015 11:00
An: Jan Hubicka
Cc: Richard Biener; Stefan Ehrlich; GCC Development;
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
        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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]