Withdrawn: 8261731: shallow copy the internal buffer of a scalar-replaced java.lang.String object

duke duke at openjdk.java.net
Wed May 19 15:14:00 UTC 2021


On Mon, 15 Feb 2021 09:22:00 GMT, Xin Liu <xliu at openjdk.org> wrote:

> 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.

This pull request has been closed without being integrated.

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

PR: https://git.openjdk.java.net/jdk/pull/2570


More information about the hotspot-compiler-dev mailing list