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.