[13] RFR (M): 8223216: C2: Unify class initialization checks between new, getstatic, and putstatic

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed May 1 23:37:22 UTC 2019


(The patch has minor dependencies on 8223213 [1] I sent out for review 

C2 implements class initialization checks for new and 
getstatic/putstatic differently: while "new" supports fast class 
initialization checks, static field accesses rely on uncommon traps 
which may lead to deoptimization/recompilation storms during 
long-running class initialisation.

Proposed patch unifies implementation between them and uses the 
following barrier:
    if (holder->is_initialized()) {
      uncommon_trap(initialized, reinterpret);
    if (!holder->is_reentrant_initialization(current_thread)) {
      uncommon_trap(uninitialized, none);

It also enhances checks for not-yet-initialized classes 
(Compile::needs_clinit_barrier) and unifies the implementation between 
new, invokestatic, and getfield/putfield.

Testing: tier1-5, targeted microbenchmarks, new test from 8223213


Best regards,
Vladimir Ivanov

[1] http://cr.openjdk.java.net/~vlivanov/8223213/webrev.00/

More information about the hotspot-compiler-dev mailing list