On Thu, Aug 07, 2014 at 09:53:13AM +0200, Richard Biener wrote:
> On Wed, 6 Aug 2014, Mike Stump wrote:
> 
> > On Aug 6, 2014, at 12:56 AM, Richard Biener <rguent...@suse.de> wrote:
> > >> My concern is the code we're removing discusses the need to simplify when
> > >> these expressions are in static initializers.  What's going to ensure 
> > >> that
> > >> we're still simplifying instances which appear in static initializers?  I
> > >> don't see anything which tests that.   And does it still work for targets
> > >> which utilize PSImode?
> > > 
> > > You mean stuff like
> > > 
> > > int i[4];
> > > const int p = i - (i + 2);
> > 
> > No.
> > 
> >   long p = i - (i + 2);
> > 
> > in C++.  It is valid and so it has to work.  Further, there is a well known 
> > problem that if you get all the constants correct, you get to statically 
> > initialize this and have no constructors.  Though the above is trivial, in 
> > large C++ source bases, there is an important set of things that one must 
> > do to hit expected quality.  Fold, fold, fold is the name of the game, and 
> > if you do it well, you get app startup time that is short, and if you don’t 
> > do it well, you get app startup time that sucks.  Some folks care about 
> > startup time.  So for example, there are well known pdf viewers that use 
> > gcc to compile and whose startup time would be a order of magnitude or more 
> > worse if gcc didn’t optimize it as well as it does.  There are large OS 
> > vendors that had:
> 
> It always works - you eventually get a runtime constructor though.
> 
> >       -Wglobal-constructors
> >           Warn about namespace scope data that requires construction or 
> > destruction, or functions that use the constructor
> >           attribute or the destructor attribute.  Additionally warn if the 
> > Objective-C GNU runtime is used to initialize
> >           various metadata.
> > 
> > and used it to ensure (-Werror) that no constructors would sneak in 
> > anyplace, as the corporate guide was no, you don’t get to do that.  
> > Exceptions are made and really, the main thing that hurt the most were 
> > libraries that users might use, but you get the idea.
> > 
> > The right way to think of the cost was page faults proportional to the size 
> > of the app, or, 0.  Pages faults turn out to be rather expensive as the 
> > core speed of the processor is rather fast.  I know sounds overly 
> > expensive, but that is my experience with Ado.., oops, I mean, with one 
> > critical customer.
> > 
> > Now, what do you have to do to get it right, evaluate all constant things 
> > including constructors and destructors and be able to do this for a class 
> > hierarchy.  We didn’t do if and while, but it would have been nice to do 
> > those.  Things like:
> > 
> > class B {
> >   int k;
> >   B(int i) {
> >     k = i;
> > }
> > 
> > class A :public B {
> >   int i;
> >   int j;
> >   A () :i (1) b(5) {
> >     j = 5;
> >   }
> > } a;
> > 
> > not that demanding…  Note, I tried the code at the top, and gcc generate 
> > runtime code for it.  :-(  Ouch.  clang does this:
> > 
> > _p:
> >     .quad   -2                      ## 0xfffffffffffffffe
> > 
> > Ah.  I’d like to think that used to work at one point.
> 
> Probably not ;)
> 
> But seriously it's a matter of a) keeping constructors for each
> variable separate and optimize them in GIMPLE, b) recognize
> resulting code that can be expressed with a initializer
> 
> a) can be done with delaying inlining to IPA time and hoping
> that early opts do enough to perform the necessary simplification,
> b) needs a new pass (but I guess it shouldn't be _that_ hard...)

I'm not sure totally skipping inlining in C++ is that great an idea
since most C++ ctors will end up calling things.  Isn't it enough to not
inline the initializer for a variable into the file level function that
calls all the initializers, which you could do by internally apply
attribute noinline I guess.

> I think we already have constructor functions marked specially,
> hopefully with a link to the initialized variable.

I'd expect that's what DECL_STATIC_CONSTRUCTOR does, but I'm not sure
there's a link or where we could put one if there isn't.

Trev

> 
> Richard.

Reply via email to