RFR: 8374582: [REDO] Move input validation checks to Java for java.lang.StringCoding intrinsics [v6]

Damon Fenacci dfenacci at openjdk.org
Thu Jan 29 07:32:12 UTC 2026


> ## Issue
> 
> This is a redo of [JDK-8361842](https://bugs.openjdk.org/browse/JDK-8361842) which was backed out by [JDK-8374210](https://bugs.openjdk.org/browse/JDK-8374210) due to C2-related regressions. The original change moved input validation checks for java.lang.StringCoding from the intrinsic to Java code (leaving the intrinsic check only with the `VerifyIntrinsicChecks` flag). Refer to the [original PR](https://github.com/openjdk/jdk/pull/25998) for details.
> 
> This additional issue happens because, in some cases, for instance when the Java checking code is not inlined and we give an out-of-range constant as input, we fold the data path but not the control path and we crash in the backend.
> 
> ## Causes
> 
> The cause of this is that the out-of-range constant (e.g. -1) floats into the intrinsic and there (assuming the input is valid) we add a constraint to its type to positive integers (e.g. to compute the array address) which makes it top.
> 
> ## Fix
> 
> A possible fix is to introduce an opaque node (OpaqueGuardNode) similar to what we do in `must_be_not_null` for values that we know cannot be null:
> https://github.com/openjdk/jdk/blob/ce721665cd61d9a319c667d50d9917c359d6c104/src/hotspot/share/opto/graphKit.cpp#L1484
> This will temporarily add the range check to ensure that C2 figures that out-of-range values cannot reach the intrinsic. Then, during macro expansion, we replace the opaque node with the corresponding constant (true/false) in product builds such that the actually unneeded guards are folded and do not end up in the emitted code.
> 
> # Testing
> 
> * Tier 1-3+
> * 2 JTReg tests added
>   * `TestRangeCheck.java` as regression test for the reported issue
>   * `TestOpaqueGuardNodes.java` to check that opaque guard nodes are added when parsing and removed at macro expansion

Damon Fenacci 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 31 additional commits since the last revision:

 - JDK-8374582: merge and update copyright year
 - Merge branch 'master' into JDK-8374582
 - Merge branch 'master' into JDK-8374582
 - JDK-8374582: fix comment layout
 - JDK-8374582: fix constructor argument name
 - JDK-8374582: fix indent
 - JDK-8374582: constant
 - JDK-8374582: add size_of
 - JDK-8374852: OpaqueCheck -> OpaqueConstantBool
 - JDK-8374852: fix number of OpaqueCheck nodes in test
 - ... and 21 more: https://git.openjdk.org/jdk/compare/7e545381...a587a269

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/29164/files
  - new: https://git.openjdk.org/jdk/pull/29164/files/bddec5b5..a587a269

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=29164&range=05
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=29164&range=04-05

  Stats: 61562 lines in 1281 files changed: 34520 ins; 12116 del; 14926 mod
  Patch: https://git.openjdk.org/jdk/pull/29164.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29164/head:pull/29164

PR: https://git.openjdk.org/jdk/pull/29164


More information about the core-libs-dev mailing list