RFR: 8261731: shallow copy the internal buffer of a scalar-replaced java.lang.String object [v5]
Xin Liu
xliu at openjdk.java.net
Sat Mar 6 20:30:22 UTC 2021
> There are 3 nodes involving in the construction of a java.lang.String object.
> 1. Allocate of itself, aka. alloc
> 2. AllocateArray of a byte array, which is value:byte[], aka. aa
> 3. ArrayCopyNode which copys in the contents of value, aka. ac
>
> Lemma
> When a String object `alloc` is scalar replaced, C2 can eliminate `aa` and `ac`.
>
> Because `alloc` is scalar replaced, it must be non-escaped. The field value:byte[] of j.l.String cannot be seen by external world, therefore it must not be global escaped. Because the buffer is marked as stable, it is safe to assume its contents are whatever ac copies in. Because all public java.lang.String constructors clone the incoming array, the source of `ac` is stable as well.
>
> It is possible to rewire `aa` to the source of ac with the correct offset. That is to say, we can replace both `aa` and `ac` with a “shallow copy” of the source of `ac`. It’s safe if C2 keeps a reference of the source oop for all safepoints.
Xin Liu has updated the pull request incrementally with one additional commit since the last revision:
[SIM-JVM-526] fix a crash in scalar replacement
Even though field_val is the value field of j.l.String, the code shape has be changed
by StringOpt for the more efficient string concatenantion. The array is generated from
jdk.internal.misc.Unsafe::allocateUninitializedArray instead of AllocateArray node.
This patch checks stricter before genenerating the special SafePointScalarObjectNode node.
This bug is triggered in the following 2 tests with '-ea -esa -XX:CompileThreshold=100':
compiler/codecache/stress/RandomAllocationTest.java
compiler/codecache/stress/UnexpectedDeoptimizationTest.java
-------------
Changes:
- all: https://git.openjdk.java.net/jdk/pull/2570/files
- new: https://git.openjdk.java.net/jdk/pull/2570/files/672bf3c1..6bd99e8a
Webrevs:
- full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2570&range=04
- incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2570&range=03-04
Stats: 2 lines in 1 file changed: 1 ins; 0 del; 1 mod
Patch: https://git.openjdk.java.net/jdk/pull/2570.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/2570/head:pull/2570
PR: https://git.openjdk.java.net/jdk/pull/2570
More information about the hotspot-compiler-dev
mailing list