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

Shaojin Wen duke at openjdk.org
Tue Jun 11 23:33:11 UTC 2024


On Tue, 11 Jun 2024 16:08:18 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

>> @eme64 TraceMergeStores are here,  but I can't understand these assembly codes
>> 
>> # JavaCode
>> 
>> class AbstractStringBuilder {
>>      private AbstractStringBuilder appendNull() {
>>         int count = this.count;
>>         ensureCapacityInternal(count + 4);
>>         byte[] val = this.value;
>>         if (isLatin1()) {
>>             val[count    ] = 'n';
>>             val[count + 1] = 'u';
>>             val[count + 2] = 'l';
>>             val[count + 3] = 'l';
>>         } else {
>>             StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
>>         }
>>         this.count = count + 4;
>>         return this;
>>     }
>> }
>> 
>> 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);
>>     }
>> }
>> 
>> 
>> # TraceMergeStores
>> 
>> [TraceMergeStores]: Replace
>>   78  StoreB  === 61 7 76 12  [[ 103 89 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: StringUTF16::putChar @ bci:43 (line 71)
>>  103  StoreB  === 88 78 101 80  [[ 18 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: StringUTF16::putChar @ bci:52 (line 72)
>> [TraceMergeStores]: with
>>   12  Parm  === 3  [[ 78 66 38 80 107 113 ]] Parm2: int !jvms: StringUTF16::putChar @ bci:-1 (line 69)
>>  113  StoreC  === 88 7 76 12  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5;
>
> @wenshao The output you have here is not at all the `TraceMergeStores`, but the assembly dump, probably from `PrintOptoAssembly`. In you entire log I never see a single occurance of `TraceMergeStores`, so presumably no such optimisation was done.
> 
> I suggest you play around with the examples from my PR https://github.com/openjdk/jdk/pull/16245, and the `TraceMergeStores` flag. That will give you some insight about how it works, and maybe give you a way into understanding why your examples are not optimized.

@eme64  Thank you for your patient reply. The multiple versions of TraceMergeStores are as follows

# 1 Current Version (Webrevs 3)

03: [Full](https://webrevs.openjdk.org/?repo=jdk&pr=19626&range=03) - [Incremental](https://webrevs.openjdk.org/?repo=jdk&pr=19626&range=02-03) ([27a3050a](https://git.openjdk.org/jdk/pull/19626/files/27a3050a73ec4a65edbdb23383237a08037e0462))

## 1.1 JavaCode

class AbstractStringBuilder {
     private AbstractStringBuilder appendNull() {
        int count = this.count;
        ensureCapacityInternal(count + 4);
        byte[] val = this.value;
        if (isLatin1()) {
            val[count    ] = 'n';
            val[count + 1] = 'u';
            val[count + 2] = 'l';
            val[count + 3] = 'l';
        } else {
            StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
        }
        this.count = count + 4;
        return this;
    }
}

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);
    }
}


## 1.2 TraceMergeStores

[TraceMergeStores]: Replace
  78  StoreB  === 61 7 76 12  [[ 103 89 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: StringUTF16::putChar @ bci:43 (line 71)
 103  StoreB  === 88 78 101 80  [[ 18 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: StringUTF16::putChar @ bci:52 (line 72)
[TraceMergeStores]: with
  12  Parm  === 3  [[ 78 66 38 80 107 113 ]] Parm2: int !jvms: StringUTF16::putChar @ bci:-1 (line 69)
 113  StoreC  === 88 7 76 12  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5;



# 2 Repleace StringUTF16.putChar (Webrevs 2)

02: [Full](https://webrevs.openjdk.org/?repo=jdk&pr=19626&range=02) - [Incremental](https://webrevs.openjdk.org/?repo=jdk&pr=19626&range=01-02) ([f96cde4e](https://git.openjdk.org/jdk/pull/19626/files/f96cde4e79e12e2ea46e6061f918a69f11d59985))

## 2.1 JavaCode

class AbstractStringBuilder {
     private AbstractStringBuilder appendNull() {
        int count = this.count;
        ensureCapacityInternal(count + 4);
        byte[] val = this.value;
        if (isLatin1()) {
            val[count    ] = 'n';
            val[count + 1] = 'u';
            val[count + 2] = 'l';
            val[count + 3] = 'l';
        } else {
            StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
        }
        this.count = count + 4;
        return this;
    }
}

class StringUTF16 {
    public static void putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) {
        // Don't use the putChar method, Its instrinsic will cause C2 unable to combining values into larger stores.
        i <<= 1;
        putChar0(value, i    , c1);
        putChar0(value, i + 2, c2);
        putChar0(value, i + 4, c3);
        putChar0(value, i + 6, c4);
    }

    private static void putChar0(byte[] value, int i, int c) {
        value[i    ] = (byte)(c >> HI_BYTE_SHIFT);
        value[i + 1] = (byte)(c >> LO_BYTE_SHIFT);
    }
}


## 2.2 TraceMergeStores

[TraceMergeStores]: Replace
  645  StoreB  === 629 509 643 583  [[ 671 657 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:7 (line 1569) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  671  StoreB  === 656 645 669 45  [[ 710 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:7 (line 1569) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  710  StoreB  === 656 671 708 584  [[ 735 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:15 (line 1570) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  735  StoreB  === 656 710 733 45  [[ 774 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:15 (line 1570) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  774  StoreB  === 656 735 772 585  [[ 800 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:24 (line 1571) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  800  StoreB  === 656 774 798 45  [[ 839 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:24 (line 1571) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  839  StoreB  === 656 800 837 585  [[ 865 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:34 (line 1572) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
  865  StoreB  === 656 839 863 45  [[ 885 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:34 (line 1572) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
[TraceMergeStores]: with
 1801  ConL  === 0  [[ 1802 ]]  #long:30399761348886638
 1802  StoreL  === 656 509 643 1801  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10;
[TraceMergeStores]: Replace
  635  StoreB  === 619 499 633 573  [[ 661 647 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:7 (line 1569) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  661  StoreB  === 646 635 659 35  [[ 700 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:7 (line 1569) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  700  StoreB  === 646 661 698 574  [[ 725 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:15 (line 1570) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  725  StoreB  === 646 700 723 35  [[ 764 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:15 (line 1570) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  764  StoreB  === 646 725 762 575  [[ 790 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:24 (line 1571) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  790  StoreB  === 646 764 788 35  [[ 829 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:24 (line 1571) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  829  StoreB  === 646 790 827 575  [[ 855 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:8 (line 1586) StringUTF16::putCharsAt @ bci:34 (line 1572) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
  855  StoreB  === 646 829 853 35  [[ 875 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: StringUTF16::putChar0 @ bci:19 (line 1587) StringUTF16::putCharsAt @ bci:34 (line 1572) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
[TraceMergeStores]: with
 1785  ConL  === 0  [[ 1786 ]]  #long:30399761348886638
 1786  StoreL  === 646 499 633 1785  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10;



# 3 Use SetLong
## 3.1 Java Code

class AbstractStringBuilder {
    static final long NULL_UTF16;
    static {
        byte[] bytes8 = new byte[8];
        StringUTF16.putCharsAt(bytes8, 0, 'n', 'u', 'l', 'l');
        NULL_UTF16 = getLong(bytes8, 0);
    }

    private static void setLong(byte[] array, int offset, long value) {
        array[offset]     = (byte) (value      );
        array[offset + 1] = (byte) (value >>  8);
        array[offset + 2] = (byte) (value >> 16);
        array[offset + 3] = (byte) (value >> 24);
        array[offset + 4] = (byte) (value >> 32);
        array[offset + 5] = (byte) (value >> 40);
        array[offset + 6] = (byte) (value >> 48);
        array[offset + 7] = (byte) (value >> 56);
    }

    private static long getLong(byte[] array, int offset) {
        return ((long) array[offset    ] & 0xff)
             | (((long) array[offset + 1] & 0xff) <<  8)
             | (((long) array[offset + 2] & 0xff) << 16)
             | (((long) array[offset + 3] & 0xff) << 24)
             | (((long) array[offset + 4] & 0xff) << 32)
             | (((long) array[offset + 5] & 0xff) << 40)
             | (((long) array[offset + 6] & 0xff) << 48)
             | (((long) array[offset + 7] & 0xff) << 56);
    }

    private AbstractStringBuilder appendNull() {
        int count = this.count;
        ensureCapacityInternal(count + 4);
        byte[] val = this.value;
        if (isLatin1()) {
            val[count    ] = 'n';
            val[count + 1] = 'u';
            val[count + 2] = 'l';
            val[count + 3] = 'l';
        } else {
            setLong(val, count << 1, NULL_UTF16);
        }
        this.count = count + 4;
        return this;
    }
}


## 3.2 TraceMergeStores

[TraceMergeStores]: Replace
  636  StoreB  === 620 509 634 601  [[ 665 651 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:5 (line 72) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  665  StoreB  === 650 636 663 45  [[ 695 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:16 (line 73) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  695  StoreB  === 650 665 693 674  [[ 723 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:27 (line 74) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  723  StoreB  === 650 695 721 45  [[ 754 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:38 (line 75) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  754  StoreB  === 650 723 752 733  [[ 784 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:49 (line 76) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  784  StoreB  === 650 754 782 45  [[ 813 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:60 (line 77) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  813  StoreB  === 650 784 811 733  [[ 841 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:72 (line 78) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
  841  StoreB  === 650 813 839 45  [[ 858 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:84 (line 79) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616) StringBuilder::append @ bci:2 (line 179)
[TraceMergeStores]: with
  585  ConL  === 0  [[ 654 625 1774 ]]  #long:30399761348886638
 1774  StoreL  === 650 509 634 585  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10;
[TraceMergeStores]: Replace
  626  StoreB  === 610 499 624 591  [[ 655 641 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:5 (line 72) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  655  StoreB  === 640 626 653 35  [[ 685 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:16 (line 73) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  685  StoreB  === 640 655 683 664  [[ 713 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:27 (line 74) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  713  StoreB  === 640 685 711 35  [[ 744 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:38 (line 75) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  744  StoreB  === 640 713 742 723  [[ 774 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:49 (line 76) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  774  StoreB  === 640 744 772 35  [[ 803 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:60 (line 77) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  803  StoreB  === 640 774 801 723  [[ 831 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:72 (line 78) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
  831  StoreB  === 640 803 829 35  [[ 848 ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=10;  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; !jvms: AbstractStringBuilder::setLong @ bci:84 (line 79) AbstractStringBuilder::appendNull @ bci:60 (line 676) AbstractStringBuilder::append @ bci:5 (line 616)
[TraceMergeStores]: with
  575  ConL  === 0  [[ 644 615 1758 ]]  #long:30399761348886638
 1758  StoreL  === 640 499 624 575  [[ ]]  @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10; mismatched  Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=10;

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

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


More information about the core-libs-dev mailing list