RFR: 8261731: shallow copy the internal buffer of a scalar-replaced java.lang.String object
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
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.
- fix regression for x86-32
- add a statistical counter for OptimizeTempArray.
- [SIM-JVM-450] support deoptimization v2
- add a unit test for deoptimization
- [SIM-JVM-450] support deoptimization part2
- enable OptimizeTempArray by default
- Merge branch 'master' into optimize_substring
- Revert "8260198: TypeInstPtr::dump2() emits multiple lines if Verbose is set"
- Revert "add a new bucket afterea_late_inlines"
- [SIM-JVM-450] support deoptimization
- ... and 25 more: https://git.openjdk.java.net/jdk/compare/4619f372...fd9ca4b8