RFR: 8257594: C2 compiled checkcast of non-null object triggers endless deoptimization/recompilation cycle
Tobias Hartmann
thartmann at openjdk.java.net
Wed Dec 2 15:27:04 UTC 2020
When C2 determines at compile time that there is no subtype relation between the objects involved in a checkcast, it inserts a null assert because the checkcast can only pass if the value is null. This will trigger deoptimization and recompilation if the object is non-null. However, we can do better here if we already know that the object is non-null (i.e. the check always fails) or if we hit `too_many_traps_or_recompiles` (which suggests that the object is often null) to avoid an endless deoptimization/recompilation cycle until we hit the `PerMethodRecompilationCutoff` and starve at lower tiers.
In the former case we can simply throw right away and in the latter case we should fall back to a full check in case there is an exception handler in compiled code that handles the failing (non-null) case. That way we avoid deoptimization.
I've spotted this with our test framework for inline types in project Valhalla, while investigating an intermittent failure where several test methods suddenly became non-compilable at tier 4.
Thanks,
Tobias
-------------
Commit messages:
- Handle non-constant, non-null value
- 8257594: C2 compiled checkcast of non-null object triggers endless deoptimization/recompilation cycle
Changes: https://git.openjdk.java.net/jdk/pull/1566/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=1566&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8257594
Stats: 133 lines in 4 files changed: 131 ins; 0 del; 2 mod
Patch: https://git.openjdk.java.net/jdk/pull/1566.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/1566/head:pull/1566
PR: https://git.openjdk.java.net/jdk/pull/1566
More information about the hotspot-compiler-dev
mailing list