RFR: 8261954: Dependencies: Improve iteration over class hierarchy under context class
Vladimir Ivanov
vlivanov at openjdk.java.net
Fri Feb 19 12:10:43 UTC 2021
On Thu, 18 Feb 2021 22:40:03 GMT, Coleen Phillimore <coleenp at openjdk.org> wrote:
>> Simplify `ClassHierarchyWalker::find_witness_anywhere()` which iterates over class hierarchy under context class searching for witnesses.
>>
>> Current implementation traverses the hierarchy in a breadth-first manner and keeps a stack-allocated array to keep a worklist.
>> But all the subclasses are already part of a singly linked list formed by `Klass::subklass()`/`next_sibling()`/`superklass()`.
>>
>> Proposed refactoring gets rid of the explicit worklist and switches to the traversal over the linked list (encapsulated into `ClassHierarchyIterator`). It performs depth-first pre-order hierarchy traversal.
>>
>> (There are some other minor refactorings applied in `ClassHierarchyWalker` along the way.)
>>
>> Testing:
>> - [x] hs-tier1 - hs-tier8
>> - [x] additional verification that CHA decisions aren't affected
>
> src/hotspot/share/code/dependencies.cpp line 1345:
>
>> 1343: } else if (nof_impls == 1) { // unique implementor
>> 1344: assert(context_type != context_type->implementor(), "not unique");
>> 1345: context_type = InstanceKlass::cast(context_type->implementor());
>
> There's no reason that implementor() should return Klass* rather than InstanceKlass* ? We can clean that up also later to reduce casts. (I thought I already tried to do this once).
Yes, I don't see a compelling reason for `implementor()` to return `Klass*` instead of `InstanceKlass*`. Would be nice to clean it up. Do you want me to file an RFE?
-------------
PR: https://git.openjdk.java.net/jdk/pull/2630
More information about the hotspot-compiler-dev
mailing list