RFR: 8333893: Optimization for StringBuilder append boolean & null [v4]
Shaojin Wen
duke at openjdk.org
Wed Jun 12 12:41:14 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
-XX:+TraceMergeStores -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_putCharStringU
[TraceMergeStores]: Replace
644 StoreB === 628 499 642 573 [[ 669 655 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
669 StoreB === 654 644 667 35 [[ 720 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
720 StoreB === 654 669 718 574 [[ 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: StringUTF16::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
744 StoreB === 654 720 742 35 [[ 796 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
796 StoreB === 654 744 794 575 [[ 820 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
820 StoreB === 654 796 818 35 [[ 872 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
872 StoreB === 654 820 870 575 [[ 896 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
896 StoreB === 654 872 894 35 [[ 916 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587)
[TraceMergeStores]: with
1826 ConL === 0 [[ 1827 ]] #long:30399761348886638
1827 StoreL === 654 499 642 1826 [[ ]] @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
654 StoreB === 638 509 652 583 [[ 679 665 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
679 StoreB === 664 654 677 45 [[ 730 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
730 StoreB === 664 679 728 584 [[ 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: StringUTF16::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
754 StoreB === 664 730 752 45 [[ 806 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
806 StoreB === 664 754 804 585 [[ 830 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
830 StoreB === 664 806 828 45 [[ 882 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
882 StoreB === 664 830 880 585 [[ 906 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
906 StoreB === 664 882 904 45 [[ 926 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647) AbstractStringBuilder::append @ bci:5 (line 587) StringBuilder::append @ bci:2 (line 179)
[TraceMergeStores]: with
1842 ConL === 0 [[ 1843 ]] #long:30399761348886638
1843 StoreL === 664 509 652 1842 [[ ]] @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
843 StoreB === 828 699 841 11 [[ 868 854 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821)
868 StoreB === 853 843 866 845 [[ 882 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821)
[TraceMergeStores]: with
11 Parm === 3 [[ 832 845 787 679 614 92 578 168 178 228 549 278 292 843 890 977 ]] Parm1: int !jvms: AbstractStringBuilder::append @ bci:-1 (line 814)
977 StoreC === 853 699 841 11 [[ ]] @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
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;
[TraceMergeStores]: Replace
617 StoreB === 601 472 615 546 [[ 642 628 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647)
642 StoreB === 627 617 640 23 [[ 693 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:3 (line 1552) AbstractStringBuilder::appendNull @ bci:63 (line 647)
693 StoreB === 627 642 691 547 [[ 717 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647)
717 StoreB === 627 693 715 23 [[ 769 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:11 (line 1553) AbstractStringBuilder::appendNull @ bci:63 (line 647)
769 StoreB === 627 717 767 548 [[ 793 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647)
793 StoreB === 627 769 791 23 [[ 845 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:20 (line 1554) AbstractStringBuilder::appendNull @ bci:63 (line 647)
845 StoreB === 627 793 843 548 [[ 869 ]] @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::putChar @ bci:43 (line 71) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647)
869 StoreB === 627 845 867 23 [[ 16 ]] @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::putChar @ bci:52 (line 72) StringUTF16::putCharsAt @ bci:29 (line 1555) AbstractStringBuilder::appendNull @ bci:63 (line 647)
[TraceMergeStores]: with
1006 ConL === 0 [[ 1007 ]] #long:30399761348886638
1007 StoreL === 627 472 615 1006 [[ ]] @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
1089 StoreB === 1074 938 1087 1068 [[ 1116 1102 ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=11; Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; !jvms: StringUTF16::putChar @ bci:43 (line 71) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821) StringBuilder::append @ bci:2 (line 246) SBTraceStoreTest::append @ bci:24 (line 14)
1116 StoreB === 1101 1089 1114 1092 [[ 1206 1159 ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=11; Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; !orig=[1197] !jvms: StringUTF16::putChar @ bci:52 (line 72) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821) StringBuilder::append @ bci:2 (line 246) SBTraceStoreTest::append @ bci:24 (line 14)
[TraceMergeStores]: with
298 ConI === 0 [[ 1078 1028 918 570 556 507 458 448 375 1464 ]] #int:20013
1464 StoreC === 1101 938 1087 298 [[ ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; mismatched Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11;
SBTraceStoreTest-appendNullUTF16 millis : 22
SBTraceStoreTest-appendNullUTF16 millis : 7
[TraceMergeStores]: Replace
1210 StoreB === 1195 1059 1208 1189 [[ 1237 1223 ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=11; Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; !jvms: StringUTF16::putChar @ bci:43 (line 71) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821) StringBuilder::append @ bci:2 (line 246) SBTraceStoreTest::append @ bci:24 (line 14) SBTraceStoreTest::appendTest @ bci:23 (line 31)
1237 StoreB === 1222 1210 1235 1213 [[ 1324 ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=11; Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; !orig=[1315] !jvms: StringUTF16::putChar @ bci:52 (line 72) StringUTF16::putCharSB @ bci:8 (line 1490) AbstractStringBuilder::append @ bci:72 (line 821) StringBuilder::append @ bci:2 (line 246) SBTraceStoreTest::append @ bci:24 (line 14) SBTraceStoreTest::appendTest @ bci:23 (line 31)
[TraceMergeStores]: with
423 ConI === 0 [[ 1199 1149 1039 693 679 630 582 572 500 2597 ]] #int:20013
2597 StoreC === 1222 1059 1208 423 [[ ]] @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11; mismatched Memory: @byte[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=11;
-------------
PR Comment: https://git.openjdk.org/jdk/pull/19626#issuecomment-2162905112
More information about the core-libs-dev
mailing list