RFR: 8372634: C2: Materialize type information from instanceof checks [v4]
Vladimir Ivanov
vlivanov at openjdk.org
Wed Dec 3 21:58:24 UTC 2025
> 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 with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:
- Merge branch 'master' into c2.instanceof
- Unify Compile::should_delay_inlining
- Test fix
- bugid
- C2: Materialize type information from instanceof checks
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/28517/files
- new: https://git.openjdk.org/jdk/pull/28517/files/c58c63cc..58a7d521
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=28517&range=03
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=28517&range=02-03
Stats: 98149 lines in 1639 files changed: 63706 ins; 23937 del; 10506 mod
Patch: https://git.openjdk.org/jdk/pull/28517.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/28517/head:pull/28517
PR: https://git.openjdk.org/jdk/pull/28517
More information about the hotspot-compiler-dev
mailing list