• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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