1/* 2 * Copyright (c) 2023-2024 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 StringBuilder::toString replacement 17//! SKIP_IF @architecture == "arm32" 18//! RUN_PAOC options: "--compiler-regex='.*toString[0-9]+.*' --compiler-inlining=false" 19//! 20//! METHOD "ETSGLOBAL::toString0" 21//! PASS_BEFORE "BranchElimination" 22//! INST /StringBuilder::<ctor>/ 23//! INST_NEXT /SaveState/ 24//! INST_NEXT /NullCheck/ 25//! INST_NEXT /Intrinsic.StdCoreSbToString/ 26//! PASS_AFTER "SimplifyStringBuilder" 27//! INST_NOT /StringBuilder::<ctor>/ 28//! INST_NOT /StringBuilder::toString/ 29//! 30//! METHOD "ETSGLOBAL::toString1" 31//! PASS_BEFORE "BranchElimination" 32//! INST /StringBuilder::<ctor>/ 33//! INST_NEXT /SaveState/ 34//! INST_NEXT /NullCheck/ 35//! INST_NEXT /Intrinsic.StdCoreSbToString/ 36//! PASS_AFTER "SimplifyStringBuilder" 37//! INST_NOT /StringBuilder::<ctor>/ 38//! INST_NOT /StringBuilder::toString/ 39//! 40//! METHOD "ETSGLOBAL::toString2" 41//! PASS_BEFORE "BranchElimination" 42//! INST /StringBuilder::<ctor>/ 43//! INST_NEXT /SaveState/ 44//! INST_NEXT /NullCheck/ 45//! INST_NEXT /Intrinsic.StdCoreSbToString/ 46//! INST_NEXT /SaveState/ 47//! INST_NEXT /NullCheck/ 48//! INST_NEXT /Intrinsic.StdCoreSbToString/ 49//! INST_NEXT /SaveState/ 50//! INST_NEXT /NullCheck/ 51//! INST_NEXT /Intrinsic.StdCoreSbToString/ 52//! PASS_AFTER "SimplifyStringBuilder" 53//! INST /StringBuilder::<ctor>/ 54//! INST_NEXT /SaveState/ 55//! INST_NEXT /NullCheck/ 56//! INST_NEXT /Intrinsic.StdCoreSbToString/ 57//! INST_NEXT_NOT /SaveState/ 58//! INST_NEXT_NOT /NullCheck/ 59//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 60//! 61//! METHOD "ETSGLOBAL::toString3" 62//! PASS_BEFORE "BranchElimination" 63//! INST /StringBuilder::<ctor>/ 64//! INST_NEXT /SaveState/ 65//! INST_NEXT /NullCheck/ 66//! INST_NEXT /Intrinsic.StdCoreSbToString/ 67//! INST_NEXT /SaveState/ 68//! INST_NEXT /NullCheck/ 69//! INST_NEXT /Intrinsic.StdCoreSbToString/ 70//! PASS_AFTER "SimplifyStringBuilder" 71//! INST_NOT /StringBuilder::<ctor>/ 72//! INST_NOT /NullCheck/ 73//! INST_NOT /Intrinsic.StdCoreSbToString/ 74//! 75//! METHOD "ETSGLOBAL::toString4" 76//! PASS_BEFORE "BranchElimination" 77//! INST /StringBuilder::<ctor>/ 78//! INST_NEXT /SaveState/ 79//! INST_NEXT /NullCheck/ 80//! INST_NEXT /Intrinsic.StdCoreSbToString/ 81//! INST_NEXT /SaveState/ 82//! INST_NEXT /NullCheck/ 83//! INST_NEXT /Intrinsic.StdCoreSbToString/ 84//! PASS_AFTER "SimplifyStringBuilder" 85//! INST /StringBuilder::<ctor>/ 86//! INST_NEXT /SaveState/ 87//! INST_NEXT /Intrinsic.StdCoreSbToString/ 88//! INST_NEXT_NOT /SaveState/ 89//! INST_NEXT_NOT /NullCheck/ 90//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 91//! 92//! METHOD "ETSGLOBAL::toString5" 93//! PASS_BEFORE "BranchElimination" 94//! INST /StringBuilder::<ctor>/ 95//! INST_NEXT /SaveState/ 96//! INST_NEXT /NullCheck/ 97//! INST_NEXT /Intrinsic.StdCoreSbToString/ 98//! INST_NEXT /SaveState/ 99//! INST_NEXT /NullCheck/ 100//! INST_NEXT /Intrinsic.StdCoreSbToString/ 101//! PASS_AFTER "SimplifyStringBuilder" 102//! INST /StringBuilder::<ctor>/ 103//! INST_NEXT /SaveState/ 104//! INST_NEXT /Intrinsic.StdCoreSbToString/ 105//! INST_NEXT_NOT /SaveState/ 106//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 107//! 108//! METHOD "ETSGLOBAL::toString6" 109//! PASS_BEFORE "BranchElimination" 110//! INST /StringBuilder::<ctor>/ 111//! INST_NEXT /SaveState/ 112//! INST_NEXT /NullCheck/ 113//! INST_NEXT /Intrinsic.StdCoreSbToString/ 114//! INST_NEXT /SaveState/ 115//! INST_NEXT /NullCheck/ 116//! INST_NEXT /Intrinsic.StdCoreSbToString/ 117//! PASS_AFTER "SimplifyStringBuilder" 118//! INST /StringBuilder::<ctor>/ 119//! INST_NEXT /SaveState/ 120//! INST_NEXT /Intrinsic.StdCoreSbToString/ 121//! INST_NEXT_NOT /SaveState/ 122//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 123//! 124//! METHOD "ETSGLOBAL::toString7" 125//! PASS_BEFORE "BranchElimination" 126//! INST /StringBuilder::<ctor>/ 127//! INST_NEXT /SaveState/ 128//! INST_NEXT /NullCheck/ 129//! INST_NEXT /Intrinsic.StdCoreSbToString/ 130//! INST_NEXT /SaveState/ 131//! INST_NEXT /NullCheck/ 132//! INST_NEXT /Intrinsic.StdCoreSbToString/ 133//! PASS_AFTER "SimplifyStringBuilder" 134//! INST /StringBuilder::<ctor>/ 135//! INST_NEXT /SaveState/ 136//! INST_NEXT /Intrinsic.StdCoreSbToString/ 137//! INST_NEXT /SaveState/ 138//! INST_NEXT /NullCheck/ 139//! INST_NEXT /Intrinsic.StdCoreSbToString/ 140//! 141//! METHOD "ETSGLOBAL::toString8" 142//! PASS_BEFORE "BranchElimination" 143//! INST /StringBuilder::<ctor>/ 144//! INST_NEXT /SaveState/ 145//! INST_NEXT /NullCheck/ 146//! INST_NEXT /Intrinsic.StdCoreSbToString/ 147//! PASS_AFTER "SimplifyStringBuilder" 148//! INST /StringBuilder::<ctor>/ 149//! INST_NEXT /SaveState/ 150//! INST_NEXT /Intrinsic.StdCoreSbAppendInt/ 151//! INST_NEXT /SaveState/ 152//! INST_NEXT /Intrinsic.StdCoreSbToString/ 153//! 154//! METHOD "ETSGLOBAL::toString10" 155//! PASS_BEFORE "BranchElimination" 156//! INST /StringBuilder::<ctor>/ 157//! INST_COUNT /Intrinsic.StdCoreSbToString/,3 158//! PASS_AFTER "SimplifyStringBuilder" 159//! INST /StringBuilder::<ctor>/ 160//! INST_COUNT /Intrinsic.StdCoreSbToString/,1 161//! 162//! RUN entry: "ETSGLOBAL::main" 163 164//! CHECKER JIT IR Builder, check StringBuilder::toString replacement 165//! RUN force_jit: true, options: "--compiler-regex='.*toString[0-9]+.*' --compiler-inlining=false", entry: "ETSGLOBAL::main" 166//! 167//! METHOD "ETSGLOBAL::toString0" 168//! PASS_BEFORE "BranchElimination" 169//! INST /StringBuilder::<ctor>/ 170//! INST_NEXT /SaveState/ 171//! INST_NEXT /NullCheck/ 172//! INST_NEXT /Intrinsic.StdCoreSbToString/ 173//! PASS_AFTER "SimplifyStringBuilder" 174//! INST_NOT /StringBuilder::<ctor>/ 175//! INST_NOT /StringBuilder::toString/ 176//! 177//! METHOD "ETSGLOBAL::toString1" 178//! PASS_BEFORE "BranchElimination" 179//! INST /StringBuilder::<ctor>/ 180//! INST_NEXT /SaveState/ 181//! INST_NEXT /NullCheck/ 182//! INST_NEXT /Intrinsic.StdCoreSbToString/ 183//! PASS_AFTER "SimplifyStringBuilder" 184//! INST_NOT /StringBuilder::<ctor>/ 185//! INST_NOT /StringBuilder::toString/ 186//! 187//! METHOD "ETSGLOBAL::toString2" 188//! PASS_BEFORE "BranchElimination" 189//! INST /StringBuilder::<ctor>/ 190//! INST_NEXT /SaveState/ 191//! INST_NEXT /NullCheck/ 192//! INST_NEXT /Intrinsic.StdCoreSbToString/ 193//! INST_NEXT /SaveState/ 194//! INST_NEXT /NullCheck/ 195//! INST_NEXT /Intrinsic.StdCoreSbToString/ 196//! INST_NEXT /SaveState/ 197//! INST_NEXT /NullCheck/ 198//! INST_NEXT /Intrinsic.StdCoreSbToString/ 199//! PASS_AFTER "SimplifyStringBuilder" 200//! INST /StringBuilder::<ctor>/ 201//! INST_NEXT /SaveState/ 202//! INST_NEXT /NullCheck/ 203//! INST_NEXT /Intrinsic.StdCoreSbToString/ 204//! INST_NEXT_NOT /SaveState/ 205//! INST_NEXT_NOT /NullCheck/ 206//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 207//! 208//! METHOD "ETSGLOBAL::toString3" 209//! PASS_BEFORE "BranchElimination" 210//! INST /StringBuilder::<ctor>/ 211//! INST_NEXT /SaveState/ 212//! INST_NEXT /NullCheck/ 213//! INST_NEXT /Intrinsic.StdCoreSbToString/ 214//! INST_NEXT /SaveState/ 215//! INST_NEXT /NullCheck/ 216//! INST_NEXT /Intrinsic.StdCoreSbToString/ 217//! PASS_AFTER "SimplifyStringBuilder" 218//! INST_NOT /StringBuilder::<ctor>/ 219//! INST_NOT /NullCheck/ 220//! INST_NOT /Intrinsic.StdCoreSbToString/ 221//! 222//! METHOD "ETSGLOBAL::toString4" 223//! PASS_BEFORE "BranchElimination" 224//! INST /StringBuilder::<ctor>/ 225//! INST_NEXT /SaveState/ 226//! INST_NEXT /NullCheck/ 227//! INST_NEXT /Intrinsic.StdCoreSbToString/ 228//! INST_NEXT /SaveState/ 229//! INST_NEXT /NullCheck/ 230//! INST_NEXT /Intrinsic.StdCoreSbToString/ 231//! PASS_AFTER "SimplifyStringBuilder" 232//! INST /StringBuilder::<ctor>/ 233//! INST_NEXT /SaveState/ 234//! INST_NEXT /Intrinsic.StdCoreSbToString/ 235//! INST_NEXT_NOT /SaveState/ 236//! INST_NEXT_NOT /NullCheck/ 237//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 238//! 239//! METHOD "ETSGLOBAL::toString5" 240//! PASS_BEFORE "BranchElimination" 241//! INST /StringBuilder::<ctor>/ 242//! INST_NEXT /SaveState/ 243//! INST_NEXT /NullCheck/ 244//! INST_NEXT /Intrinsic.StdCoreSbToString/ 245//! INST_NEXT /SaveState/ 246//! INST_NEXT /NullCheck/ 247//! INST_NEXT /Intrinsic.StdCoreSbToString/ 248//! PASS_AFTER "SimplifyStringBuilder" 249//! INST /StringBuilder::<ctor>/ 250//! INST_NEXT /SaveState/ 251//! INST_NEXT /Intrinsic.StdCoreSbToString/ 252//! INST_NEXT_NOT /SaveState/ 253//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 254//! 255//! METHOD "ETSGLOBAL::toString6" 256//! PASS_BEFORE "BranchElimination" 257//! INST /StringBuilder::<ctor>/ 258//! INST_NEXT /SaveState/ 259//! INST_NEXT /NullCheck/ 260//! INST_NEXT /Intrinsic.StdCoreSbToString/ 261//! INST_NEXT /SaveState/ 262//! INST_NEXT /NullCheck/ 263//! INST_NEXT /Intrinsic.StdCoreSbToString/ 264//! PASS_AFTER "SimplifyStringBuilder" 265//! INST /StringBuilder::<ctor>/ 266//! INST_NEXT /SaveState/ 267//! INST_NEXT /Intrinsic.StdCoreSbToString/ 268//! INST_NEXT_NOT /SaveState/ 269//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 270//! 271//! METHOD "ETSGLOBAL::toString7" 272//! PASS_BEFORE "BranchElimination" 273//! INST /StringBuilder::<ctor>/ 274//! INST_NEXT /SaveState/ 275//! INST_NEXT /NullCheck/ 276//! INST_NEXT /Intrinsic.StdCoreSbToString/ 277//! INST_NEXT /SaveState/ 278//! INST_NEXT /NullCheck/ 279//! INST_NEXT /Intrinsic.StdCoreSbToString/ 280//! PASS_AFTER "SimplifyStringBuilder" 281//! INST /StringBuilder::<ctor>/ 282//! INST_NEXT /SaveState/ 283//! INST_NEXT /Intrinsic.StdCoreSbToString/ 284//! INST_NEXT /SaveState/ 285//! INST_NEXT /NullCheck/ 286//! INST_NEXT /Intrinsic.StdCoreSbToString/ 287//! 288//! METHOD "ETSGLOBAL::toString8" 289//! PASS_BEFORE "BranchElimination" 290//! INST /StringBuilder::<ctor>/ 291//! INST_NEXT /SaveState/ 292//! INST_NEXT /NullCheck/ 293//! INST_NEXT /Intrinsic.StdCoreSbToString/ 294//! PASS_AFTER "SimplifyStringBuilder" 295//! INST /StringBuilder::<ctor>/ 296//! INST_NEXT /SaveState/ 297//! INST_NEXT /Intrinsic.StdCoreSbAppendInt/ 298//! INST_NEXT /SaveState/ 299//! INST_NEXT /Intrinsic.StdCoreSbToString/ 300//! 301//! METHOD "ETSGLOBAL::toString9" 302//! PASS_BEFORE "BranchElimination" 303//! INST_COUNT /StringBuilder::<ctor>/,2 304//! INST_COUNT /Intrinsic.StdCoreSbToString/,6 305//! PASS_AFTER "SimplifyStringBuilder" 306//! INST_COUNT /StringBuilder::<ctor>/,2 307//! INST_COUNT /Intrinsic.StdCoreSbToString/,2 308//! 309//! METHOD "ETSGLOBAL::toString10" 310//! PASS_BEFORE "BranchElimination" 311//! INST /StringBuilder::<ctor>/ 312//! INST_COUNT /Intrinsic.StdCoreSbToString/,3 313//! PASS_AFTER "SimplifyStringBuilder" 314//! INST /StringBuilder::<ctor>/ 315//! INST_COUNT /Intrinsic.StdCoreSbToString/,1 316//! 317//! METHOD "ETSGLOBAL::toString11" 318//! PASS_BEFORE "BranchElimination" 319//! INST /StringBuilder::<ctor>/ 320//! INST_COUNT /Intrinsic.StdCoreSbToString/,2 321//! PASS_AFTER "SimplifyStringBuilder" 322//! INST /StringBuilder::<ctor>/ 323//! INST_COUNT /Intrinsic.StdCoreSbToString/,1 324 325 326function toString0(str: String): String { 327 return new StringBuilder(str).toString(); // applied 328} 329 330function toString1(str: String): String { 331 let sb = new StringBuilder(str); 332 return sb.toString(); // applied 333} 334 335function toString2(str: String): String { 336 let sb = new StringBuilder(str); 337 sb.toString(); // applied 338 sb = sb; 339 sb.toString(); // applied 340 sb = sb.append(1); 341 return sb.toString(); // not applied, due to dominating append()-call 342} 343 344function doSmth() : void { 345} 346 347function doSmthWithSB(sb: StringBuilder) : void { 348} 349 350function toString3(str: String): String { 351 let sb = new StringBuilder(str); 352 sb.toString(); // applied 353 doSmth(); 354 return sb.toString(); // applied 355} 356 357function toString4(str: String): String { 358 let sb = new StringBuilder(str); 359 sb.toString(); // applied 360 doSmthWithSB(sb); 361 return sb.toString(); // not applied, due to dominating doSmthWithSB()-call 362} 363 364function toString5(str: String): String { 365 let sb = new StringBuilder(str); 366 sb.toString(); // applied 367 let sb2 = sb; 368 doSmthWithSB(sb2); 369 return sb.toString(); // not applied, due to dominating doSmthWithSB()-call 370} 371 372class A { 373 public sb: StringBuilder = new StringBuilder(); 374} 375 376function doSmthWithA(a: A) : void { 377} 378 379function toString6(str: String): String { 380 let sb = new StringBuilder(str); 381 sb.toString(); // applied 382 let a = new A; 383 a.sb = sb; 384 doSmthWithA(a); 385 return sb.toString(); // not applied, due to dominating StoreObject-instruction (a.sb = sb) 386} 387 388let sb: StringBuilder = new StringBuilder(); 389 390function toString7(str: String): String { 391 sb = new StringBuilder(str); // the object is a global variable 392 sb.toString(); // not applied, due to dominating StoreStatic-instruction 393 doSmth(); 394 return sb.toString(); // not applied, due to dominating StoreStatic-instruction 395} 396 397function toString8(str: String): String { 398 let sb = new StringBuilder(str); 399 sb.toString(); // applied 400 sb.append(1); 401 return sb.toString(); // not applied, due to dominating append()-call 402} 403 404function toString9(str: String): String { 405 let sb1 = new StringBuilder(str); 406 sb1.toString(); // applied 407 let sb2 = new StringBuilder(str); 408 sb1.toString(); // applied 409 sb2.toString(); // applied 410 sb1.append(1); 411 sb1.toString(); // not applied, due to dominating append()-call 412 sb2.toString(); // applied 413 sb2.append(1); 414 return sb2.toString(); // not applied, due to dominating append()-call 415} 416 417function toString10(str: String): String { 418 let sb = new StringBuilder(str); 419 sb.toString(); // applied 420 let strings: string[] = ["1"] // insert NegativeCheck, BoundsCheck, RefTypeCheck instructions 421 sb.toString(); // applied 422 sb.append(strings[0]); 423 return sb.toString(); // not applied, due to dominating append()-call 424} 425 426function toString11(str: String): String { 427 let sb = new StringBuilder(str); 428 sb.toString(); // applied 429 if (str.getLength() > 0) 430 sb.append(1); 431 return sb.toString(); // not applied, due to dominating append()-call 432} 433 434function main(): int { 435 assert toString0("abcde") == "abcde": "Wrong at toString0"; 436 assert toString1("abcde") == "abcde": "Wrong at toString1"; 437 assert toString2("abcde") == "abcde1": "Wrong at toString2"; 438 assert toString3("abcde") == "abcde": "Wrong at toString3"; 439 assert toString4("abcde") == "abcde": "Wrong at toString4"; 440 assert toString5("abcde") == "abcde": "Wrong at toString5"; 441 assert toString6("abcde") == "abcde": "Wrong at toString6"; 442 assert toString7("abcde") == "abcde": "Wrong at toString7"; 443 assert toString8("abcde") == "abcde1": "Wrong at toString8"; 444 assert toString9("abcde") == "abcde1": "Wrong at toString9"; 445 assert toString10("abcde") == "abcde1": "Wrong at toString10"; 446 assert toString11("abcde") == "abcde1": "Wrong at toString10"; 447 return 0; 448} 449