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