RFR: 8352075: Perf regression accessing fields [v3]
Coleen Phillimore
coleenp at openjdk.org
Fri May 2 11:26:51 UTC 2025
On Wed, 30 Apr 2025 20:15:36 GMT, Frederic Parain <fparain at openjdk.org> wrote:
>> src/hotspot/share/oops/fieldInfo.hpp line 290:
>>
>>> 288: static int compare_symbols(const Symbol *s1, const Symbol *s2);
>>> 289:
>>> 290: static Array<u1>* create_FieldInfoStream(ConstantPool* constants, GrowableArray<FieldInfo>* fields, int java_fields, int injected_fields,
>>
>> In the latest form the ConstantPool parameter is used only for assertion, though I think that it is rather important assertion.
>
> The ConstantPool parameter can be limited to debug builds (the ones with asserts) with the following patch:
>
>
> diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp
> index 48646c0fb83..19471bbf7ee 100644
> --- a/src/hotspot/share/classfile/classFileParser.cpp
> +++ b/src/hotspot/share/classfile/classFileParser.cpp
> @@ -5813,7 +5813,7 @@ void ClassFileParser::post_process_parsed_stream(const ClassFileStream* const st
>
> int injected_fields_count = _temp_field_info->length() - _java_fields_count;
> _fieldinfo_stream =
> - FieldInfoStream::create_FieldInfoStream(_cp, _temp_field_info, _java_fields_count,
> + FieldInfoStream::create_FieldInfoStream(DEBUG_ONLY(_cp COMMA) _temp_field_info, _java_fields_count,
> injected_fields_count, loader_data(), CHECK);
> _fields_status =
> MetadataFactory::new_array<FieldStatus>(_loader_data, _temp_field_info->length(),
> diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp
> index f3fdf28b96b..80ee179576c 100644
> --- a/src/hotspot/share/classfile/javaClasses.cpp
> +++ b/src/hotspot/share/classfile/javaClasses.cpp
> @@ -963,7 +963,7 @@ void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {
> }
> Array<u1>* old_stream = ik->fieldinfo_stream();
> assert(fields->length() == (java_fields + injected_fields), "Must be");
> - Array<u1>* new_fis = FieldInfoStream::create_FieldInfoStream(ik->constants(), fields, java_fields, injected_fields, k->class_loader_data(), CHECK);
> + Array<u1>* new_fis = FieldInfoStream::create_FieldInfoStream(DEBUG_ONLY(ik->constants() COMMA) fields, java_fields, injected_fields, k->class_loader_data(), CHECK);
> ik->set_fieldinfo_stream(new_fis);
> MetadataFactory::free_array<u1>(k->class_loader_data(), old_stream);
> }
> diff --git a/src/hotspot/share/oops/fieldInfo.cpp b/src/hotspot/share/oops/fieldInfo.cpp
> index dd1fa11042d..eb90e6bdae8 100644
> --- a/src/hotspot/share/oops/fieldInfo.cpp
> +++ b/src/hotspot/share/oops/fieldInfo.cpp
> @@ -66,7 +66,7 @@ int FieldInfoStream::compare_symbols(const Symbol *s1, const Symbol *s2) {
> }
> }
>
> -Array<u1>* FieldInfoStream::create_FieldInfoStream(ConstantPool* constants, GrowableArray<FieldInfo>* fields, int java_fields, int injected_fields,
> +Array<u1>* FieldInfoStream::create_FieldInfoStream(DEBUG_ONLY(ConstantPool* constants COMMA) GrowableArray<FieldInfo>* fields, int java_fields, int injected_f...
I don't think adding DEBUG_ONLY optimizes anything and kind of looks messy, I don't like this change unless the product compiler complains about an unused parameter.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/24847#discussion_r2071473593
More information about the serviceability-dev
mailing list