RFR: 8369296: Add fast class init checks in interpreter for resolving ConstantPool entries for static field [v2]

Ashutosh Mehra asmehra at openjdk.org
Tue Oct 7 19:05:10 UTC 2025


On Tue, 7 Oct 2025 16:37:24 GMT, Amit Kumar <amitkumar at openjdk.org> wrote:

>> @offamitkumar @Hamlin-Li  @RealFYang @TheRealMDoerr 
>> I need help in adding arch specific code for s390, risc-v and ppc for this PR. Would you be able to contribute the code for these platforms? Specifically, we need to add a call to `clinit_barrier` in `TemplateTable::resolve_cache_and_index_for_field`.
>> 
>> @vnkozlov  @adinn @iwanowww can you please review this patch.
>
> Hi @ashu-mehra,
> 
> This is fixing the test failure on s390: 
> 
> 
> diff --git a/src/hotspot/cpu/s390/templateTable_s390.cpp b/src/hotspot/cpu/s390/templateTable_s390.cpp
> index 2b39cc8318c..cf34bff7746 100644
> --- a/src/hotspot/cpu/s390/templateTable_s390.cpp
> +++ b/src/hotspot/cpu/s390/templateTable_s390.cpp
> @@ -2409,6 +2409,7 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
>    assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
>  
>    NearLabel resolved;
> +  Label L_clinit_barrier_slow;
>  
>    Bytecodes::Code code = bytecode();
>    switch (code) {
> @@ -2425,6 +2426,8 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
>    __ z_bre(resolved);
>  
>    // resolve first time through
> +  // Class initialization barrier slow path lands here as well.
> +  __ bind(L_clinit_barrier_slow);
>    address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
>    __ load_const_optimized(Z_ARG2, (int)code);
>    __ call_VM(noreg, entry, Z_ARG2);
> @@ -2434,6 +2437,15 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
>  
>    __ bind(resolved);
>  
> +  // Class initialization barrier for static fields
> +  if (VM_Version::supports_fast_class_init_checks() &&
> +      (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
> +    const Register field_holder = index;
> +
> +    __ load_sized_value(field_holder, Address(cache, ResolvedFieldEntry::field_holder_offset()), sizeof(void*), false);
> +    __ clinit_barrier(field_holder, Z_thread, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
> +  }
> +
>    BLOCK_COMMENT("} resolve_cache_and_index_for_field");
>  }

@offamitkumar thanks for the patch. I have added it.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/27676#issuecomment-3378302987


More information about the hotspot-dev mailing list