RFR: 8348853: Fold layout helper check for objects implementing non-array interfaces

Marc Chevalier mchevalier at openjdk.org
Fri Mar 28 09:41:11 UTC 2025


On Thu, 27 Mar 2025 15:33:31 GMT, Tobias Hartmann <thartmann at openjdk.org> wrote:

>> If `TypeInstKlassPtr` represents an array type, it has to be `java.lang.Object`. From contraposition, if it is not `java.lang.Object`, we can conclude it is not an array, and we can skip some array checks, for instance.
>> 
>> In this PR, we improve this deduction with an interface base reasoning: arrays implements only Cloneable and Serializable, so if a type implements anything else, it cannot be an array.
>> 
>> This change partially reverts the changes from [JDK-8348631](https://bugs.openjdk.org/browse/JDK-8348631) (#23331) (in `LibraryCallKit::generate_array_guard_common`) and the test still passes.
>> 
>> The way interfaces are check might be done differently. The current situation is a balance between visibility (not to leak too much things explicitly private), having not overly general methods for one use-case and avoiding too concrete (and brittle) interfaces.
>> 
>> Tested with tier1..3, hs-precheckin-comp and hs-comp-stress
>> 
>> Thanks,
>> Marc
>
> src/hotspot/share/opto/type.cpp line 3684:
> 
>> 3682: }
>> 3683: 
>> 3684: bool TypeInterfaces::has_non_array_interface() const {
> 
> What about using `TypeAryPtr::_array_interfaces->contains(_interfaces);` instead?

Almost!

return !TypeAryPtr::_array_interfaces->contains(this);

Contains is about TypeInterfaces, that is set of interfaces. So I just need to check that `this` is not a sub-set of array interfaces. That should do it.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24245#discussion_r2018248760


More information about the hotspot-compiler-dev mailing list