Perhaps I should throw an ExceptionInInitializerError w a CompileTheWorld 
message?

    --mm


On May 16, 2013, at 6:02 PM, John Rose <john.r.r...@oracle.com> wrote:

> On May 15, 2013, at 4:00 PM, Phil Race <philip.r...@oracle.com> wrote:
> 
>> It *initialises* all those classes ? Meaning their static initialisers
>> might run, call native methods in a library which expect things to have
>> been done in a different order ? Maybe the library isn't even loaded yet?
>> I presume this must be happening else we wouldn't be in this code.
>> That's a somewhat fragile test.
> 
> Yes, it is.  And it requires a certain amount of ad hoc maintenance over the 
> years.
> 
>> I guess it doesn't have to be involve either.
>> Its good to know that "all classes compile" but I'm not sure I
>> can be easily convinced that its worth trying the wac-a-mole game
>> needed to ensure that this doesn't collide with the semantics
>> of the runtime, particularly in the client area which has lots of
>> native code and state.
> 
> Since the design of our stack has become more entangled (between JVM and 
> JDK), it may be that this test is becoming harder to maintain.  But to date 
> it has been very profitable, even with the maintenance costs like the present 
> bug.
> 
>> ...Can't compilation be done in some special fashion that bypasses
>> class initialisation ?
> 
> It's a fair question.  The short answer is "no", but the history is 
> interesting, so I did some software archeology...
> 
> The CTW (CompileTheWorld) test mode dates back to August 1998, in the first 
> days of the HotSpot implementation.  Since then it has continuously been a 
> fruitful source of compiler bugs.  We use it every day for stress-testing 
> compiler changes.
> 
> In the first few months of its implementation (through March 1999) we 
> discovered that if you did not attempt to run class initializers on the 
> classes, the resulting loaded code was so cold that compiling it was useless 
> as a stress test.  For example, if a basic block has never been run, the 
> compiler is sometimes lazy about compiling it, preferring to emit a deopt. 
> path instead.  This means that anything that would have been inlined inside 
> that basic block never gets looked at.  It's good for hot-spot-oriented 
> compilation but bad for stress tests.
> 
> We found that preloading classes (CompileTheWorldPreloadClasses) and running 
> class initializers (no special flag) caused the code to warm up enough that 
> the compiler had something to work on that was more representative of typical 
> inputs.  This greatly increased the value of the CTW stress test.
> 
> Native methods have always been a problem, of course.  I suppose we could do 
> something to CTW mode to make it fail out of native method linkage in some 
> packages.  That might also fix this problem, in a way that would not require 
> hardening native code against the edge cases.
> 
>> anyone looking at changes to
>> accomodate this out of the context of the changes might be
>> puzzled as to why this is needed
> 
> In the end, native code hardening is surely a Good Thing, but I understand 
> that puzzling changes like this can contribute to software rot.  Perhaps a 
> simple comment like this would help:
> 
>  // CompileTheWorld gets here
> 
> — John

Reply via email to