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