1/* 2 * Copyright (c) 2023-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 StringBuilder::toString replacement 17//! SKIP_IF @architecture == "arm32" 18//! RUN_PAOC options: "--compiler-regex='.*toString[0-9]+.*' --compiler-inlining=false" 19//! 20//! METHOD "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 /StringBuilder::<ctor>/ 72//! INST_NEXT /SaveState/ 73//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 74//! 75//! METHOD "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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: "ets_stringbuilder.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: "ets_stringbuilder.ETSGLOBAL::main" 166//! 167//! METHOD "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 /StringBuilder::<ctor>/ 219//! INST_NEXT /SaveState/ 220//! INST_NEXT_NOT /Intrinsic.StdCoreSbToString/ 221//! 222//! METHOD "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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 "ets_stringbuilder.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); // not removed, due to potential inlining of doSmth with potential deoptimize instructions 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: FixedArray<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 assertEQ(toString0("abcde"), "abcde", "Wrong at toString0") 436 assertEQ(toString1("abcde"), "abcde", "Wrong at toString1") 437 assertEQ(toString2("abcde"), "abcde1", "Wrong at toString2") 438 assertEQ(toString3("abcde"), "abcde", "Wrong at toString3") 439 assertEQ(toString4("abcde"), "abcde", "Wrong at toString4") 440 assertEQ(toString5("abcde"), "abcde", "Wrong at toString5") 441 assertEQ(toString6("abcde"), "abcde", "Wrong at toString6") 442 assertEQ(toString7("abcde"), "abcde", "Wrong at toString7") 443 assertEQ(toString8("abcde"), "abcde1", "Wrong at toString8") 444 assertEQ(toString9("abcde"), "abcde1", "Wrong at toString9") 445 assertEQ(toString10("abcde"), "abcde1", "Wrong at toString10") 446 assertEQ(toString11("abcde"), "abcde1", "Wrong at toString10") 447 return 0; 448} 449 450// Checker below based on plugins/ets/sdk/api/@ohos.url.ets 451// Expected successful compilation 452 453//! CHECKER AOT IR Builder, Bugfix 25869 454//! SKIP_IF @architecture == "arm32" 455//! RUN_PAOC options: "--compiler-regex='.*encodePercentEncoding.*' --compiler-inlining=false --compiler-check-final=false" 456 457const HASH_TABLE: Array<string> = new Array<string>(256); 458const NO_ESCAPE_TABLE = new Int8Array(256); 459 460function encodePercentEncoding(str: string) { 461 let outVal = ''; 462 463 const len = str.length; 464 let i = 0; 465 const UNICODE_0x80 = 0x80; 466 467 outer: 468 for (; i < len; i++) { 469 let c = str.charCodeAt(i as number); 470 471 while (c < UNICODE_0x80) { 472 if (NO_ESCAPE_TABLE[c] !== 1) { 473 outVal += HASH_TABLE[c]; 474 } 475 if (++i == len) 476 break outer; 477 } 478 } 479 return outVal; 480} 481