On Mon, 27 Nov 2023 19:09:40 GMT, Roger Riggs <[email protected]> wrote:
>> Strings, after construction, are immutable but may be constructed from
>> mutable arrays of bytes, characters, or integers.
>> The string constructors should guard against the effects of mutating the
>> arrays during construction that might invalidate internal invariants for the
>> correct behavior of operations on the resulting strings. In particular, a
>> number of operations have optimizations for operations on pairs of latin1
>> strings and pairs of non-latin1 strings, while operations between latin1 and
>> non-latin1 strings use a more general implementation.
>>
>> The changes include:
>>
>> - Adding a warning to each constructor with an array as an argument to
>> indicate that the results are indeterminate
>> if the input array is modified before the constructor returns.
>> The resulting string may contain any combination of characters sampled
>> from the input array.
>>
>> - Ensure that strings that are represented as non-latin1 contain at least
>> one non-latin1 character.
>> For latin1 inputs, whether the arrays contain ASCII, ISO-8859-1, UTF8, or
>> another encoding decoded to latin1 the scanning and compression is unchanged.
>> If a non-latin1 character is found, the string is represented as
>> non-latin1 with the added verification that a non-latin1 character is
>> present at the same index.
>> If that character is found to be latin1, then the input array has been
>> modified and the result of the scan may be incorrect.
>> Though a ConcurrentModificationException could be thrown, the risk to an
>> existing application of an unexpected exception should be avoided.
>> Instead, the non-latin1 copy of the input is re-scanned and compressed;
>> that scan determines whether the latin1 or the non-latin1 representation is
>> returned.
>>
>> - The methods that scan for non-latin1 characters and their intrinsic
>> implementations are updated to return the index of the non-latin1 character.
>>
>> - String construction from StringBuilder and CharSequence must also be
>> guarded as their contents may be modified during construction.
>
> Roger Riggs has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Use byte off branches in char_array_compress
> Verified by manual tests with "-XX:AVX3Threshold=0"
> And test in the PR
> test/hotspot/jtreg/compiler/intrinsics/string/TestStringConstructionIntrinsics.java
src/hotspot/cpu/x86/macroAssembler_x86.cpp line 8547:
> 8545: // bail out when there is nothing to be done
> 8546: testl(tmp5, 0xFFFFFFFF);
> 8547: jcc(Assembler::zero, post_alignment);
@RogerRiggs I think you changed the wrong line 😉
Suggestion:
jccb(Assembler::zero, post_alignment);
src/hotspot/cpu/x86/macroAssembler_x86.cpp line 8559:
> 8557: evpcmpw(mask1, mask2, tmp1Reg, tmp2Reg, Assembler::le, /*signed*/
> false, Assembler::AVX_512bit);
> 8558: ktestd(mask1, mask2);
> 8559: jccb(Assembler::carryClear, copy_tail);
Suggestion:
jcc(Assembler::carryClear, copy_tail);
(in this case the jump can potentially be long)
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/16425#discussion_r1410283240
PR Review Comment: https://git.openjdk.org/jdk/pull/16425#discussion_r1410284158