1/* 2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16//! CHECKER AOT IR Builder, check String Builders merging 17//! SKIP_IF @architecture == "arm32" 18//! RUN entry: "ets_string_builder_merge.ETSGLOBAL::main" 19//! RUN_PAOC options: "--compiler-regex='.*chain_concat[0-9]*' --compiler-inlining=false" 20//! 21//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat0" 22//! PASS_BEFORE "BranchElimination" 23//! INST_COUNT "StringBuilder::<ctor>",5 24//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",10 25//! INST_COUNT "Intrinsic.StdCoreSbToString",5 26//! PASS_AFTER "SimplifyStringBuilder" 27//! INST_COUNT "StringBuilder::<ctor>",1 28//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 29//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",4 30//! PASS_AFTER "Codegen" 31//! INST_COUNT "Intrinsic.StdCoreSbToString",1 32//! 33//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat1" 34//! PASS_BEFORE "BranchElimination" 35//! INST_COUNT "StringBuilder::<ctor>",7 36//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",14 37//! INST_COUNT "Intrinsic.StdCoreSbToString",7 38//! PASS_AFTER "SimplifyStringBuilder" 39//! INST_COUNT "StringBuilder::<ctor>",1 40//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 41//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",6 42//! PASS_AFTER "Codegen" 43//! INST_COUNT "Intrinsic.StdCoreSbToString",1 44//! 45//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat2" 46//! PASS_BEFORE "BranchElimination" 47//! INST_COUNT "StringBuilder::<ctor>",9 48//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",18 49//! INST_COUNT "Intrinsic.StdCoreSbToString",9 50//! PASS_AFTER "SimplifyStringBuilder" 51//! INST_COUNT "StringBuilder::<ctor>",1 52//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 53//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",8 54//! PASS_AFTER "Codegen" 55//! INST_COUNT "Intrinsic.StdCoreSbToString",1 56//! 57//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat3" 58//! PASS_BEFORE "BranchElimination" 59//! INST_COUNT "StringBuilder::<ctor>",14 60//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",28 61//! INST_COUNT "Intrinsic.StdCoreSbToString",14 62//! PASS_AFTER "SimplifyStringBuilder" 63//! INST_COUNT "StringBuilder::<ctor>",2 64//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",2 65//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",12 66//! PASS_AFTER "Codegen" 67//! INST_COUNT "Intrinsic.StdCoreSbToString",2 68//! 69//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat5" 70//! PASS_BEFORE "BranchElimination" 71//! INST_COUNT "StringBuilder::<ctor>",2 72//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",4 73//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 74//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 75//! INST_COUNT "Intrinsic.StdCoreSbToString",2 76//! PASS_AFTER "SimplifyStringBuilder" 77//! INST_COUNT "StringBuilder::<ctor>",1 78//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",3 79//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 80//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 81//! PASS_AFTER "Codegen" 82//! INST_COUNT "Intrinsic.StdCoreSbToString",1 83//! 84//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat6" 85//! PASS_BEFORE "BranchElimination" 86//! INST_COUNT "StringBuilder::<ctor>",2 87//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",37 88//! INST_COUNT "Intrinsic.StdCoreSbAppendBool",4 89//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 90//! INST_COUNT "Intrinsic.StdCoreSbAppendByte",4 91//! INST_COUNT "Intrinsic.StdCoreSbAppendShort",2 92//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 93//! INST_COUNT "Intrinsic.StdCoreSbAppendLong",2 94//! INST_COUNT "std.core.StringBuilder::append",8 95//! INST_COUNT "Intrinsic.StdCoreSbToString",2 96//! PASS_AFTER "SimplifyStringBuilder" 97//! INST_COUNT "StringBuilder::<ctor>",1 98//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",22 99//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",0 100//! INST_COUNT "Intrinsic.StdCoreSbAppendString3",2 101//! INST_COUNT "Intrinsic.StdCoreSbAppendString4",2 102//! PASS_AFTER "Codegen" 103//! INST_COUNT "Intrinsic.StdCoreSbToString",1 104//! 105//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_append_chain_concat7" 106//! PASS_BEFORE "BranchElimination" 107//! INST_COUNT "StringBuilder::<ctor>",2 108//! PASS_AFTER "SimplifyStringBuilder" 109//! INST_COUNT "StringBuilder::<ctor>",2 110//! 111//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_constructor_chain_concat8" 112//! PASS_BEFORE "BranchElimination" 113//! INST_COUNT "StringBuilder::<ctor>",2 114//! PASS_AFTER "SimplifyStringBuilder" 115//! INST_COUNT "StringBuilder::<ctor>",2 116//! 117//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat9" 118//! PASS_BEFORE "BranchElimination" 119//! INST_COUNT "StringBuilder::<ctor>",2 120//! PASS_AFTER "SimplifyStringBuilder" 121//! INST_COUNT "StringBuilder::<ctor>",2 122//! 123//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat10" 124//! PASS_BEFORE "BranchElimination" 125//! INST_COUNT "StringBuilder::<ctor>",2 126//! PASS_AFTER "SimplifyStringBuilder" 127//! INST_COUNT "StringBuilder::<ctor>",2 128//! 129//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat11" 130//! PASS_BEFORE "BranchElimination" 131//! INST_COUNT "StringBuilder::<ctor>",3 132//! PASS_AFTER "SimplifyStringBuilder" 133//! INST_COUNT "StringBuilder::<ctor>",3 134//! 135//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat12" 136//! PASS_BEFORE "BranchElimination" 137//! INST_COUNT "StringBuilder::<ctor>",2 138//! PASS_AFTER "SimplifyStringBuilder" 139//! INST_COUNT "StringBuilder::<ctor>",2 140//! 141//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat13" 142//! PASS_BEFORE "BranchElimination" 143//! INST_COUNT "StringBuilder::<ctor>",1 144//! PASS_AFTER "SimplifyStringBuilder" 145//! INST_COUNT "StringBuilder::<ctor>",1 146//! 147//! METHOD "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat14" 148//! PASS_BEFORE "BranchElimination" 149//! INST_COUNT "StringBuilder::<ctor>",3 150//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 151//! INST_COUNT "Intrinsic.StdCoreSbToString",3 152//! PASS_AFTER "SimplifyStringBuilder" 153//! INST_COUNT "StringBuilder::<ctor>",1 154//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 155//! INST_COUNT "Intrinsic.StdCoreStringConcat2",1 156//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",1 157//! PASS_AFTER "Codegen" 158//! INST_COUNT "Intrinsic.StdCoreSbToString",1 159//! 160//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat15" 161//! PASS_BEFORE "BranchElimination" 162//! INST_COUNT "StringBuilder::<ctor>",3 163//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 164//! INST_COUNT "Intrinsic.StdCoreSbToString",3 165//! PASS_AFTER "SimplifyStringBuilder" 166//! INST_COUNT "StringBuilder::<ctor>",1 167//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 168//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 169//! PASS_AFTER "Codegen" 170//! INST_COUNT "Intrinsic.StdCoreSbToString",1 171//! 172//! METHOD "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat16" 173//! PASS_BEFORE "BranchElimination" 174//! INST_COUNT "StringBuilder::<ctor>",3 175//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 176//! INST_COUNT "Intrinsic.StdCoreSbToString",3 177//! PASS_AFTER "SimplifyStringBuilder" 178//! INST_COUNT "StringBuilder::<ctor>",1 179//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 180//! INST_COUNT "Intrinsic.StdCoreStringConcat2",1 181//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",1 182//! PASS_AFTER "Codegen" 183//! INST_COUNT "Intrinsic.StdCoreSbToString",1 184//! 185//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat17" 186//! PASS_BEFORE "BranchElimination" 187//! INST_COUNT "StringBuilder::<ctor>",1 188//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 189//! INST_COUNT "Intrinsic.StdCoreSbToString",1 190//! PASS_AFTER "SimplifyStringBuilder" 191//! INST_COUNT "StringBuilder::<ctor>",1 192//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 193//! INST_COUNT "Intrinsic.StdCoreSbToString",1 194//! 195//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat18" 196//! PASS_BEFORE "BranchElimination" 197//! INST_COUNT "StringBuilder::<ctor>",1 198//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 199//! INST_COUNT "Intrinsic.StdCoreSbToString",1 200//! PASS_AFTER "SimplifyStringBuilder" 201//! INST_COUNT "StringBuilder::<ctor>",1 202//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 203//! INST_COUNT "Intrinsic.StdCoreSbToString",1 204 205//! CHECKER JIT IR Builder, check String Builders merging 206//! SKIP_IF @architecture == "arm32" 207//! RUN force_jit: true, options: "--compiler-regex='.*chain_concat[0-9]+.*' --compiler-inlining=false", entry: "ets_string_builder_merge.ETSGLOBAL::main" 208//! 209//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat0" 210//! PASS_BEFORE "BranchElimination" 211//! INST_COUNT "StringBuilder::<ctor>",5 212//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",10 213//! INST_COUNT "Intrinsic.StdCoreSbToString",5 214//! PASS_AFTER "SimplifyStringBuilder" 215//! INST_COUNT "StringBuilder::<ctor>",1 216//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 217//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",4 218//! PASS_AFTER "Codegen" 219//! INST_COUNT "Intrinsic.StdCoreSbToString",1 220//! 221//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat1" 222//! PASS_BEFORE "BranchElimination" 223//! INST_COUNT "StringBuilder::<ctor>",7 224//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",14 225//! INST_COUNT "Intrinsic.StdCoreSbToString",7 226//! PASS_AFTER "SimplifyStringBuilder" 227//! INST_COUNT "StringBuilder::<ctor>",1 228//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 229//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",6 230//! PASS_AFTER "Codegen" 231//! INST_COUNT "Intrinsic.StdCoreSbToString",1 232//! 233//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat2" 234//! PASS_BEFORE "BranchElimination" 235//! INST_COUNT "StringBuilder::<ctor>",9 236//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",18 237//! INST_COUNT "Intrinsic.StdCoreSbToString",9 238//! PASS_AFTER "SimplifyStringBuilder" 239//! INST_COUNT "StringBuilder::<ctor>",1 240//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 241//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",8 242//! PASS_AFTER "Codegen" 243//! INST_COUNT "Intrinsic.StdCoreSbToString",1 244//! 245//! METHOD "ets_string_builder_merge.ETSGLOBAL::chain_concat3" 246//! PASS_BEFORE "BranchElimination" 247//! INST_COUNT "StringBuilder::<ctor>",14 248//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",28 249//! INST_COUNT "Intrinsic.StdCoreSbToString",14 250//! PASS_AFTER "SimplifyStringBuilder" 251//! INST_COUNT "StringBuilder::<ctor>",2 252//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",2 253//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",12 254//! PASS_AFTER "Codegen" 255//! INST_COUNT "Intrinsic.StdCoreSbToString",2 256//! 257//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat5" 258//! PASS_BEFORE "BranchElimination" 259//! INST_COUNT "StringBuilder::<ctor>",2 260//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",4 261//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 262//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 263//! INST_COUNT "Intrinsic.StdCoreSbToString",2 264//! PASS_AFTER "SimplifyStringBuilder" 265//! INST_COUNT "StringBuilder::<ctor>",1 266//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",3 267//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 268//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 269//! PASS_AFTER "Codegen" 270//! INST_COUNT "Intrinsic.StdCoreSbToString",1 271//! 272//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat6" 273//! PASS_BEFORE "BranchElimination" 274//! INST_COUNT "StringBuilder::<ctor>",2 275//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",37 276//! INST_COUNT "Intrinsic.StdCoreSbAppendBool",4 277//! INST_COUNT "Intrinsic.StdCoreSbAppendChar",2 278//! INST_COUNT "Intrinsic.StdCoreSbAppendByte",4 279//! INST_COUNT "Intrinsic.StdCoreSbAppendShort",2 280//! INST_COUNT "Intrinsic.StdCoreSbAppendInt",2 281//! INST_COUNT "Intrinsic.StdCoreSbAppendLong",2 282//! INST_COUNT "std.core.StringBuilder::append",8 283//! INST_COUNT "Intrinsic.StdCoreSbToString",2 284//! PASS_AFTER "SimplifyStringBuilder" 285//! INST_COUNT "StringBuilder::<ctor>",1 286//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",22 287//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",0 288//! INST_COUNT "Intrinsic.StdCoreSbAppendString3",2 289//! INST_COUNT "Intrinsic.StdCoreSbAppendString4",2 290//! PASS_AFTER "Codegen" 291//! INST_COUNT "Intrinsic.StdCoreSbToString",1 292//! 293//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_append_chain_concat7" 294//! PASS_BEFORE "BranchElimination" 295//! INST_COUNT "StringBuilder::<ctor>",2 296//! PASS_AFTER "SimplifyStringBuilder" 297//! INST_COUNT "StringBuilder::<ctor>",2 298//! 299//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_constructor_chain_concat8" 300//! PASS_BEFORE "BranchElimination" 301//! INST_COUNT "StringBuilder::<ctor>",2 302//! PASS_AFTER "SimplifyStringBuilder" 303//! INST_COUNT "StringBuilder::<ctor>",2 304//! 305//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat9" 306//! PASS_BEFORE "BranchElimination" 307//! INST_COUNT "StringBuilder::<ctor>",2 308//! PASS_AFTER "SimplifyStringBuilder" 309//! INST_COUNT "StringBuilder::<ctor>",2 310//! 311//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat10" 312//! PASS_BEFORE "BranchElimination" 313//! INST_COUNT "StringBuilder::<ctor>",2 314//! PASS_AFTER "SimplifyStringBuilder" 315//! INST_COUNT "StringBuilder::<ctor>",2 316//! 317//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat11" 318//! PASS_BEFORE "BranchElimination" 319//! INST_COUNT "StringBuilder::<ctor>",3 320//! PASS_AFTER "SimplifyStringBuilder" 321//! INST_COUNT "StringBuilder::<ctor>",3 322//! 323//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat12" 324//! PASS_BEFORE "BranchElimination" 325//! INST_COUNT "StringBuilder::<ctor>",2 326//! PASS_AFTER "SimplifyStringBuilder" 327//! INST_COUNT "StringBuilder::<ctor>",2 328//! 329//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat13" 330//! PASS_BEFORE "BranchElimination" 331//! INST_COUNT "StringBuilder::<ctor>",1 332//! PASS_AFTER "SimplifyStringBuilder" 333//! INST_COUNT "StringBuilder::<ctor>",1 334//! 335//! METHOD "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat14" 336//! PASS_BEFORE "BranchElimination" 337//! INST_COUNT "StringBuilder::<ctor>",3 338//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 339//! INST_COUNT "Intrinsic.StdCoreSbToString",3 340//! PASS_AFTER "SimplifyStringBuilder" 341//! INST_COUNT "StringBuilder::<ctor>",1 342//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 343//! INST_COUNT "Intrinsic.StdCoreStringConcat2",1 344//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",1 345//! PASS_AFTER "Codegen" 346//! INST_COUNT "Intrinsic.StdCoreSbToString",1 347//! 348//! METHOD "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat15" 349//! PASS_BEFORE "BranchElimination" 350//! INST_COUNT "StringBuilder::<ctor>",3 351//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 352//! INST_COUNT "Intrinsic.StdCoreSbToString",3 353//! PASS_AFTER "SimplifyStringBuilder" 354//! INST_COUNT "StringBuilder::<ctor>",1 355//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 356//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 357//! PASS_AFTER "Codegen" 358//! INST_COUNT "Intrinsic.StdCoreSbToString",1 359//! 360//! METHOD "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat16" 361//! PASS_BEFORE "BranchElimination" 362//! INST_COUNT "StringBuilder::<ctor>",3 363//! INST_COUNT "Intrinsic.StdCoreSbAppendString",6 364//! INST_COUNT "Intrinsic.StdCoreSbToString",3 365//! PASS_AFTER "SimplifyStringBuilder" 366//! INST_COUNT "StringBuilder::<ctor>",1 367//! INST_COUNT "Intrinsic.StdCoreSbAppendString2",1 368//! INST_COUNT "Intrinsic.StdCoreStringConcat2",1 369//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",1 370//! PASS_AFTER "Codegen" 371//! INST_COUNT "Intrinsic.StdCoreSbToString",1 372//! 373//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat17" 374//! PASS_BEFORE "BranchElimination" 375//! INST_COUNT "StringBuilder::<ctor>",1 376//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 377//! INST_COUNT "Intrinsic.StdCoreSbToString",1 378//! PASS_AFTER "SimplifyStringBuilder" 379//! INST_COUNT "StringBuilder::<ctor>",1 380//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 381//! INST_COUNT "Intrinsic.StdCoreSbToString",1 382//! 383//! METHOD "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat18" 384//! PASS_BEFORE "BranchElimination" 385//! INST_COUNT "StringBuilder::<ctor>",1 386//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 387//! INST_COUNT "Intrinsic.StdCoreSbToString",1 388//! INST_COUNT "String::concat",1 389//! PASS_AFTER "SimplifyStringBuilder" 390//! INST_COUNT "StringBuilder::<ctor>",1 391//! INST_COUNT "Intrinsic.StdCoreSbAppendString ",2 392//! INST_COUNT "Intrinsic.StdCoreSbToString",1 393 394// Each '+=' operation on strings in tests below is translated into StringBuilder + 2 append calls by frontend 395 396function chain_concat0(a: String, n: int, b: String, m: int): String { 397 let str: String = ""; 398 str += "_"; 399 for (let i = 0; i < n; ++i) 400 str += a; 401 str += "_"; 402 for (let i = 0; i < m; ++i) 403 str += b; 404 str += "_"; 405 return str; // applied, 5 SBs merged into 1 406} 407 408function chain_concat1(a: String, n: int, b: String, m: int, c: String, l: int): String { 409 let str: String = ""; 410 str += "_"; 411 for (let i = 0; i < n; ++i) 412 str += a; 413 str += "_"; 414 for (let i = 0; i < m; ++i) 415 str += b; 416 str += "_"; 417 for (let i = 0; i < l; ++i) 418 str += c; 419 str += "_"; 420 return str; // applied, 7 SBs merged into 1 421} 422 423function chain_concat2(a: String, n: int, b: String, m: int, c: String, l: int, d: String, k: int): String { 424 let str: String = ""; 425 str += "_"; 426 for (let i = 0; i < n; ++i) 427 str += a; 428 str += "_"; 429 for (let i = 0; i < m; ++i) 430 str += b; 431 str += "_"; 432 for (let i = 0; i < l; ++i) 433 str += c; 434 str += "_"; 435 for (let i = 0; i < k; ++i) 436 str += d; 437 str += "_"; 438 return str; // applied, 9 SBs merged into 1 439} 440 441function chain_concat3(a: String, n: int, b: String, m: int, c: String, l: int, d: String, k: int): String { 442 let str0: String = ""; // two SBs chains '0' and '1' 443 let str1: String = ""; // for each string accumulator variable 444 str0 += "_"; // 0 445 str1 += "_"; // | 1 446 for (let i = 0; i < n; ++i) { // | | 447 str0 += a; // 0 | 448 str1 += a; // | 1 449 } // | | 450 str0 += "_"; // 0 | 451 str1 += "_"; // | 1 452 for (let i = 0; i < m; ++i) { // | / 453 str0 += b; // 0 / 454 str1 += b; // | 1 455 } // | / 456 // |/ 457 str0 += str1; // 0 <- 'chain 1' connects to 'chain 0' here 458 str0 += "_"; // 0 459 // | 460 for (let i = 0; i < l; ++i) // | 461 str0 += c; // 0 462 str0 += "_"; // 0 463 for (let i = 0; i < k; ++i) // | 464 str0 += d; // 0 465 str0 += "_"; // 0 466 return str0; // applied, 14 SBs (10 from 'chain 0', and 4 from 'chain 1') merged into 2 SBs 467} 468 469// Set of SB based tests 470 471const empty = ""; 472const space = " "; 473 474function supported_chain_concat5(): String { 475 let sb0 = new StringBuilder(); 476 sb0.append(0) 477 .append("1") 478 .append(c'2'); 479 480 let sb1 = new StringBuilder(); 481 sb1.append(sb0.toString()) 482 .append(space) 483 .append(0) 484 .append("1") 485 .append(c'2'); 486 487 return sb1.toString(); // applied 488} 489 490function supported_chain_concat6(): String { 491 let sb0 = new StringBuilder(); 492 sb0.append(space) 493 .append("abcΣΨΩ0123456789") 494 .append(space) 495 .append(true) 496 .append(space) 497 .append(false) 498 .append(space) 499 .append(c'A' as char) 500 .append(space) 501 .append(57 as byte) 502 .append(space) 503 .append(127 as byte) 504 .append(space) 505 .append(32767 as short) 506 .append(space) 507 .append(128934675 as int) 508 .append(space) 509 .append(701234987654321 as long) 510 .append(space) 511 .append(empty) 512 .append("string") 513 .append(space) 514 .append(new Object()) 515 .append(space) 516 .append(1.0 as Float) 517 .append(space) 518 .append(1.0 as Double) 519 .append(space) 520 .append(1.0 as Number) 521 .append(space); 522 523 let sb1 = new StringBuilder(); 524 sb1.append(sb0.toString()) 525 .append(space) 526 .append("abcΣΨΩ0123456789") 527 .append(space) 528 .append(true) 529 .append(space) 530 .append(false) 531 .append(space) 532 .append(c'A' as char) 533 .append(space) 534 .append(57 as byte) 535 .append(space) 536 .append(127 as byte) 537 .append(space) 538 .append(32767 as short) 539 .append(space) 540 .append(128934675 as int) 541 .append(space) 542 .append(701234987654321 as long) 543 .append(space) 544 .append(empty) 545 .append("string") 546 .append(space) 547 .append(new Object()) 548 .append(space) 549 .append(1.0 as Float) 550 .append(space) 551 .append(1.0 as Double) 552 .append(space) 553 .append(1.0 as Number) 554 .append(space); 555 556 return sb1.toString(); // applied 557} 558 559function unsupported_append_chain_concat7(): String { 560 let sb0 = new StringBuilder(); 561 sb0.append(0); 562 563 let sb1 = new StringBuilder(); 564 sb1.append(0) 565 .append(space) 566 .append(sb0.toString()); 567 568 return sb1.toString(); // not applied, sb0.toString() must be appended first 569} 570 571function unsupported_constructor_chain_concat8(): String { 572 let sb0 = new StringBuilder(); 573 sb0.append(0); 574 575 let sb1 = new StringBuilder("0"); 576 sb1.append(sb0.toString()); 577 578 return sb1.toString(); // not applied, sb1 must be constructed via default constructor 579} 580 581function unsupported_usage_chain_concat9(): String { 582 let sb0 = new StringBuilder(); 583 sb0.append(0); 584 585 let sb1 = new StringBuilder(); 586 sb1.append(sb0.toString()); 587 588 sb0.append(space); 589 590 return sb1.toString(); // not applied, sb0 must not be used after sb0.toString() appended 591} 592 593function unsupported_chain_concat10(cond: boolean): String { 594 let sb0 = new StringBuilder(); 595 sb0.append(0) 596 .append("1") 597 .append(c'2'); 598 599 let sb1 = new StringBuilder(); 600 if (cond) 601 sb1.append(sb0.toString()); 602 else 603 sb1.append("210"); 604 605 sb1.append(space) 606 .append(0) 607 .append("1") 608 .append(c'2'); 609 610 return sb1.toString(); // not applied, sb1 constructor and sb1.append(sb0.toString()) are not in the same BB 611} 612 613function unsupported_chain_concat11(cond: boolean): String { 614 let sb0 = new StringBuilder("0"); 615 let sb1 = new StringBuilder("1"); 616 617 let sb = cond ? sb1 : sb0; 618 619 let sb2 = new StringBuilder(); 620 sb2.append(sb.toString()) 621 .append(space) 622 .append(2); 623 624 return sb2.toString(); // not applied, sb is Phi instruction 625} 626 627function __noinline__consume(obj: Object): void {} 628 629function unsupported_chain_concat12(cond: boolean): String { 630 let sb0 = new StringBuilder("0"); 631 let sb1 = new StringBuilder(); 632 let sb = cond ? sb1 : sb0; 633 634 sb1.append(sb0.toString()) 635 .append(space) 636 .append(1); 637 638 __noinline__consume(sb); 639 640 return sb1.toString(); // not applied, sb0 must not be used after sb0.toString() appended 641} 642 643let sb0_global = new StringBuilder("0"); 644function unsupported_chain_concat13(): String { 645 let sb1 = new StringBuilder(); 646 sb1.append(sb0_global.toString()) 647 .append(space) 648 .append(1); 649 650 return sb1.toString(); // not applied, sb0 must be local instance 651} 652 653function partially_supported_chain_concat14(a: String, b: String, c: String, d: String): String { 654 let ab = a + b; 655 let cd = c + d; // not applied, due to 'cd' appended to result is not the first append 656 return ab + cd; // applied, 3 SBs merged into 1 SB + concat2 657} 658 659function supported_chain_concat15(a: String, b: String, c: String, d: String): String { 660 let str = a + b; 661 str += c; 662 str += d; // applied, 3 SBs merged into 1 SB 663 return str; 664} 665 666function partially_supported_chain_concat16(a: String, b: String, c: String, d: String): String { 667 let abcd = a + b; 668 abcd += c + d; // not applied, due to 'c+d' appended to result is not the first append 669 return abcd; // applied, 3 SBs merged into 1 SB + concat2 670} 671 672function unsupported_usage_chain_concat17(a: String): String { 673 let sb = new StringBuilder(); 674 sb.append(a); 675 let result = sb.toString(); 676 sb.append(a); 677 return result; // not applied, sb must not be used after sb.toString() appended 678} 679 680function unsupported_usage_chain_concat18(a: String): String { 681 let sb = new StringBuilder(); 682 sb.append(a); 683 let result = sb.toString(); 684 sb.append(a); 685 return result.concat(); // not applied, sb must not be used after sb.toString() appended 686} 687 688//! CHECKER AOT IR Builder, check String Builders merging (chain_concat19 only, with --compiler-inlining=true) 689//! SKIP_IF @architecture == "arm32" 690//! RUN_PAOC options: "--compiler-regex='.*chain_concat19' --compiler-inlining=true" 691 692function chain_concat19(): void { 693 const _ = "_"; 694 const a = "a"; 695 const b = "b"; 696 const c = "c"; 697 698 let sb_a = new StringBuilder(); 699 sb_a.append(_) 700 sb_a.append(a) 701 let _a = sb_a.toString() 702 703 let sb_ab = new StringBuilder(); 704 sb_ab.append(_a) 705 sb_ab.append(b) 706 let _ab = sb_ab.toString() 707 708 let sb_abc = new StringBuilder(); 709 sb_abc.append(_ab) 710 sb_abc.append(c) 711 let _abc = sb_abc.toString() 712 713 assertEQ(_a, "_a"); 714 assertEQ(_ab, "_ab"); 715 assertEQ(_abc, "_abc"); 716} 717 718function main() { 719 assertEQ(chain_concat0("a", 4, "b", 3), "_aaaa_bbb_", "Wrong result at chain_concat0"); 720 assertEQ(chain_concat1("a", 4, "b", 3, "c", 5), "_aaaa_bbb_ccccc_", "Wrong result at chain_concat1"); 721 assertEQ(chain_concat2("a", 4, "b", 3, "c", 5, "d", 2), "_aaaa_bbb_ccccc_dd_", "Wrong result at chain_concat2"); 722 assertEQ(chain_concat3("a", 4, "b", 3, "c", 5, "d", 2), "_aaaa_bbb_aaaa_bbb_ccccc_dd_", "Wrong result at chain_concat3"); 723 724 assertEQ(supported_chain_concat5(), "012 012", "Wrong result at supported_chain_concat5"); 725 assertEQ(supported_chain_concat6(), " abcΣΨΩ0123456789 true false A 57 127 32767 128934675 701234987654321 string [object Object] 1 1 1 abcΣΨΩ0123456789 true false A 57 127 32767 128934675 701234987654321 string [object Object] 1 1 1 ", "Wrong result at supported_chain_concat6"); 726 727 assertEQ(unsupported_append_chain_concat7(), "0 0", "Wrong result at unsupported_append_chain_concat7"); 728 assertEQ(unsupported_constructor_chain_concat8(), "00", "Wrong result at unsupported_constructor_chain_concat8"); 729 assertEQ(unsupported_usage_chain_concat9(), "0", "Wrong result at unsupported_usage_chain_concat9"); 730 731 assertEQ(unsupported_chain_concat10(false), "210 012", "Wrong result at unsupported_chain_concat10(false)"); 732 assertEQ(unsupported_chain_concat10(true), "012 012", "Wrong result at unsupported_chain_concat10(true)"); 733 734 assertEQ(unsupported_chain_concat11(false), "0 2", "Wrong result at unsupported_chain_concat11(false)"); 735 assertEQ(unsupported_chain_concat11(true), "1 2", "Wrong result at unsupported_chain_concat11(true)"); 736 737 assertEQ(unsupported_chain_concat12(false), "0 1", "Wrong result at unsupported_chain_concat12(false)"); 738 assertEQ(unsupported_chain_concat12(true), "0 1", "Wrong result at unsupported_chain_concat12(true)"); 739 740 assertEQ(unsupported_chain_concat13(), "0 1", "Wrong result at unsupported_chain_concat13()"); 741 742 assertEQ(partially_supported_chain_concat14("ab", "c", "d", "e"), "abcde", "Wrong result at partially_supported_chain_concat14"); 743 assertEQ(supported_chain_concat15("ab", "c", "d", "e"), "abcde", "Wrong result at supported_chain_concat15"); 744 assertEQ(partially_supported_chain_concat16("ab", "c", "d", "e"), "abcde", "Wrong result at partially_supported_chain_concat16"); 745 assertEQ(unsupported_usage_chain_concat17("abc"), "abc", "Wrong result at unsupported_usage_chain_concat17"); 746 assertEQ(unsupported_usage_chain_concat18("abc"), "abc", "Wrong result at unsupported_usage_chain_concat18"); 747 748 chain_concat19(); 749} 750 751//! CHECKER Unsupported concat pattern AOT (IBLDF4/22718) 752//! SKIP_IF @architecture == "arm32" 753//! RUN_PAOC options: "--compiler-regex='.*bugfix_chain_concat20' --compiler-inlining=true" 754 755//! CHECKER Unsupported concat pattern JIT (IBLDF4/22718) 756//! SKIP_IF @architecture == "arm32" 757//! RUN force_jit: true, entry: "ets_string_builder_merge.ETSGLOBAL::bugfix_chain_concat20" 758 759function bugfix_chain_concat20(): void 760{ 761 let a = "a"; 762 let b = "b"; 763 let abc = a + b + "c"; 764 let abcd = abc + "d"; 765 let abce = abc + "e"; 766 767 assertEQ(abc, "abc"); 768 assertEQ(abcd, "abcd"); 769 assertEQ(abce, "abce"); 770} 771