RFR: 8372634: C2: Materialize type information from instanceof checks [v2]

Dean Long dlong at openjdk.org
Wed Dec 3 02:22:40 UTC 2025


On Mon, 1 Dec 2025 19:30:22 GMT, Vladimir Ivanov <vlivanov at openjdk.org> wrote:

>> Even though `instanceof` check (and reflective `Class.isInstance` call) narrows operand's type, sharpened type information is not explicitly materialized in the IR.
>> 
>> There's a `SubTypeCheck` node present, but it is not a substitute for a `CheckCastPP` node with a proper type.
>> 
>> The difference can be illustrated with the following simple cases:
>> 
>>    class A { void m() {} }
>>    class B extends A { void m() {} }
>> 
>>     void testInstanceOf(A obj) {
>>         if (obj instanceof B) {
>>             obj.m();
>>         }
>>     }
>> 
>> InstanceOf::testInstanceOf (12 bytes)
>>   @ 8 InstanceOf$A::m (0 bytes) failed to inline: virtual call
>> 
>> vs
>> 
>>     void testInstanceOfCast(A obj) {
>>         if (obj instanceof B) {
>>             B b = (B)obj;
>>             b.m();
>>         }
>>     }
>> 
>> InstanceOf::testInstanceOfCast (17 bytes)
>>   @ 13 InstanceOf$B::m (1 bytes) inline (hot)
>> 
>> 
>> Proposed fix annotates operands of subtype checks with proper type information which reflects the effects of subtype check. Not-yet-canonicalized IR shape poses some challenges, but I decided to match it early so information is available right away, rather than waiting for IGVN pass and delay inlining to post-parse phase.
>> 
>> FTR it is not a complete fix. It works for trivial cases, but for more complex conditions the IR shape becomes too complex during parsing (as illustrated by some test cases). I experimented with annotating subtype checks after initial parsing pass is over, but the crucial simplification step happens as part of split-if transformation which happens when no more inlining is possible. So, the only possible benefit (without forcing split-if optimization earlier) is virtual-to-direct call strength reduction. I plan to explore it separately.
>> 
>> Testing: hs-tier1 - hs-tier5
>
> Vladimir Ivanov has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Test fix

Looks reasonable, but I'm not an expert in this area.

src/hotspot/share/opto/parse2.cpp line 1737:

> 1735:     (*cast_type) = tcon->isa_klassptr()->as_instance_type();
> 1736:     return true; // found
> 1737:   }

The old code checked klass_is_exact() for this case, but the new code does not, so was it redundant, given we have a constant?

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

Marked as reviewed by dlong (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/28517#pullrequestreview-3532891901
PR Review Comment: https://git.openjdk.org/jdk/pull/28517#discussion_r2583402219


More information about the hotspot-compiler-dev mailing list