RFR: 8333893: Optimization for StringBuilder append boolean & null [v4]

Shaojin Wen duke at openjdk.org
Wed Jun 12 14:19:16 UTC 2024


On Tue, 11 Jun 2024 11:35:28 GMT, Shaojin Wen <duke at openjdk.org> wrote:

>> After PR https://github.com/openjdk/jdk/pull/16245, C2 optimizes stores into primitive arrays by combining values ​​into larger stores.
>> 
>> This PR rewrites the code of appendNull and append(boolean) methods so that these two methods can be optimized by C2.
>
> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
> 
>   revert

_putCharStringU will perform MergeStore but with bounds checking. Can the C2 optimizer perform MergeStore without bounds checking in this case?

StringUTF16.putChar does not have a bounds check, so there should be no bounds check after MergeStore?


class AbstractStringBuilder {
    private AbstractStringBuilder appendNull() {
        // ...
        StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
        // ...
    }
}

class StringUTF16 {
  	public static void putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) {
        putChar(value, i    , c1);
        putChar(value, i + 1, c2);
        putChar(value, i + 2, c3);
        putChar(value, i + 3, c4);
    }

 	@IntrinsicCandidate
    // intrinsic performs no bounds checks
    static void putChar(byte[] val, int index, int c) {
        assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
        index <<= 1;
        val[index++] = (byte)(c >> HI_BYTE_SHIFT);
        val[index]   = (byte)(c >> LO_BYTE_SHIFT);
    }
}

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

PR Comment: https://git.openjdk.org/jdk/pull/19626#issuecomment-2163132228


More information about the core-libs-dev mailing list