• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 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 String concatenation
17//! SKIP_IF       @architecture == "arm32"
18//! RUN           entry: "ETSGLOBAL::main"
19//! RUN_PAOC      options: "--compiler-regex='.*concat[0-9]+' --compiler-inlining=false"
20//!
21//! METHOD        "ETSGLOBAL::concat0"
22//! PASS_BEFORE   "BranchElimination"
23//! INST_NOT      /Intrinsic.StdCoreStringConcat/
24//! INST          /StringBuilder::<ctor>/
25//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
26//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
27//! INST_NEXT     /Intrinsic.StdCoreSbToString/
28//! PASS_AFTER    "ChecksElimination"
29//! INST_NOT      /StringBuilder::<ctor>/
30//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
31//! INST_NOT      /Intrinsic.StdCoreSbToString/
32//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
33//!
34//! METHOD        "ETSGLOBAL::concat1"
35//! PASS_BEFORE   "BranchElimination"
36//! INST_NOT      /Intrinsic.StdCoreStringConcat/
37//! INST          /StringBuilder::<ctor>/
38//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
39//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
40//! INST_NEXT     /Intrinsic.StdCoreSbToString/
41//! PASS_AFTER    "ChecksElimination"
42//! INST_NOT      /StringBuilder::<ctor>/
43//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
44//! INST_NOT      /Intrinsic.StdCoreSbToString/
45//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
46//!
47//! METHOD        "ETSGLOBAL::concat2"
48//! PASS_BEFORE   "BranchElimination"
49//! INST_NOT      /Intrinsic.StdCoreStringConcat/
50//! INST          /StringBuilder::<ctor>/
51//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
52//! INST_NEXT     /Intrinsic.StdCoreSbToString/
53//! PASS_AFTER    "ChecksElimination"
54//! INST_NOT      /Intrinsic.StdCoreStringConcat/
55//! INST          /StringBuilder::<ctor>/
56//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
57//! INST_NEXT     /Intrinsic.StdCoreSbToString/
58//!
59//! METHOD        "ETSGLOBAL::concat3"
60//! PASS_BEFORE   "BranchElimination"
61//! INST_NOT      /Intrinsic.StdCoreStringConcat/
62//! INST          /StringBuilder::<ctor>/
63//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
64//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
65//! INST_NEXT     /Intrinsic.StdCoreSbToString/
66//! PASS_AFTER    "ChecksElimination"
67//! INST_NOT      /Intrinsic.StdCoreStringConcat/
68//! INST          /StringBuilder::<ctor>/
69//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
70//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
71//! INST_NEXT     /Intrinsic.StdCoreSbToString/
72//!
73//! METHOD        "ETSGLOBAL::concat4"
74//! PASS_BEFORE   "BranchElimination"
75//! INST_NOT      /Intrinsic.StdCoreStringConcat/
76//! INST          /StringBuilder::<ctor>/
77//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,3
78//! INST          /Intrinsic.StdCoreSbToString/
79//! PASS_AFTER    "ChecksElimination"
80//! INST_NOT      /StringBuilder::<ctor>/
81//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
82//! INST_NOT      /Intrinsic.StdCoreSbToString/
83//! INST_COUNT    /Intrinsic.StdCoreStringConcat3/,1
84//!
85//! METHOD        "ETSGLOBAL::concat5"
86//! PASS_BEFORE   "BranchElimination"
87//! INST_NOT      /Intrinsic.StdCoreStringConcat/
88//! INST          /StringBuilder::<ctor>/
89//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,4
90//! INST          /Intrinsic.StdCoreSbToString/
91//! PASS_AFTER    "ChecksElimination"
92//! INST_NOT      /StringBuilder::<ctor>/
93//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
94//! INST_NOT      /Intrinsic.StdCoreSbToString/
95//! INST_COUNT    /Intrinsic.StdCoreStringConcat4/,1
96//!
97//! METHOD        "ETSGLOBAL::concat8"
98//! PASS_BEFORE   "BranchElimination"
99//! INST_NOT      /Intrinsic.StdCoreStringConcat/
100//! INST          /StringBuilder::<ctor>/
101//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
102//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
103//! INST_NEXT     /Intrinsic.StdCoreSbToString/
104//! PASS_AFTER    "ChecksElimination"
105//! INST_NOT      /Intrinsic.StdCoreStringConcat/
106//! INST          /StringBuilder::<ctor>/
107//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
108//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
109//! INST_NEXT     /Intrinsic.StdCoreSbToString/
110//!
111//! METHOD        "ETSGLOBAL::concat10"
112//! PASS_BEFORE   "BranchElimination"
113//! INST_NOT      /Intrinsic.StdCoreStringConcat/
114//! INST          /StringBuilder::<ctor>/
115//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
116//! INST          /Intrinsic.StdCoreSbToString/
117//! PASS_AFTER    "ChecksElimination"
118//! INST_NOT      /Intrinsic.StdCoreStringConcat/
119//! INST          /StringBuilder::<ctor>/
120//! INST_COUNT    "Intrinsic.StdCoreSbAppendString4",1
121//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
122//! INST          /Intrinsic.StdCoreSbToString/
123//!
124//! METHOD        "ETSGLOBAL::concat11"
125//! PASS_BEFORE   "BranchElimination"
126//! INST_NOT      /Intrinsic.StdCoreStringConcat/
127//! INST          /StringBuilder::<ctor>/
128//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
129//! INST          /Intrinsic.StdCoreSbToString/
130//! PASS_AFTER    "ChecksElimination"
131//! INST_NOT      /Intrinsic.StdCoreStringConcat/
132//! INST          /StringBuilder::<ctor>/
133//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
134//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",1
135//! INST          /Intrinsic.StdCoreSbToString/
136//!
137//! METHOD        "ETSGLOBAL::concat13"
138//! PASS_BEFORE   "BranchElimination"
139//! INST_NOT      /Intrinsic.StdCoreStringConcat/
140//! INST          /StringBuilder::<ctor>/
141//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
142//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
143//! INST_NEXT     /Intrinsic.StdCoreSbToString/
144//! PASS_AFTER    "ChecksElimination"
145//! INST_NOT      /StringBuilder::<ctor>/
146//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
147//! INST_NOT      /Intrinsic.StdCoreSbToString/
148//! INST          /Intrinsic.StdCoreStringConcat2/
149//!
150//! METHOD        "ETSGLOBAL::concat14"
151//! PASS_BEFORE   "BranchElimination"
152//! INST_NOT      /Intrinsic.StdCoreStringConcat/
153//! INST          /StringBuilder::<ctor>/
154//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
155//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
156//! INST_NEXT     /Intrinsic.StdCoreSbToString/
157//! PASS_AFTER    "ChecksElimination"
158//! INST          /StringBuilder::<ctor>/
159//! INST_NOT      /Intrinsic.StdCoreStringConcat/
160//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
161//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
162//! INST_NEXT     /Intrinsic.StdCoreSbToString/
163
164//! CHECKER       JIT IR Builder, check String concatenation
165//! SKIP_IF       @architecture == "arm32"
166//! RUN           force_jit: true, options: "--compiler-regex='.*concat[0-9]+.*' --compiler-inlining=false", entry: "ETSGLOBAL::main"
167//!
168//! METHOD        "ETSGLOBAL::concat0"
169//! PASS_BEFORE   "BranchElimination"
170//! INST_NOT      /Intrinsic.StdCoreStringConcat/
171//! INST          /StringBuilder::<ctor>/
172//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
173//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
174//! INST_NEXT     /Intrinsic.StdCoreSbToString/
175//! PASS_AFTER    "ChecksElimination"
176//! INST_NOT      /StringBuilder::<ctor>/
177//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
178//! INST_NOT      /Intrinsic.StdCoreSbToString/
179//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
180//!
181//! METHOD        "ETSGLOBAL::concat1"
182//! PASS_BEFORE   "BranchElimination"
183//! INST_NOT      /Intrinsic.StdCoreStringConcat/
184//! INST          /StringBuilder::<ctor>/
185//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
186//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
187//! INST_NEXT     /Intrinsic.StdCoreSbToString/
188//! PASS_AFTER    "ChecksElimination"
189//! INST_NOT      /StringBuilder::<ctor>/
190//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
191//! INST_NOT      /Intrinsic.StdCoreSbToString/
192//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
193//!
194//! METHOD        "ETSGLOBAL::concat2"
195//! PASS_BEFORE   "BranchElimination"
196//! INST_NOT      /Intrinsic.StdCoreStringConcat/
197//! INST          /StringBuilder::<ctor>/
198//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
199//! INST_NEXT     /Intrinsic.StdCoreSbToString/
200//! PASS_AFTER    "ChecksElimination"
201//! INST_NOT      /Intrinsic.StdCoreStringConcat/
202//! INST          /StringBuilder::<ctor>/
203//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
204//! INST_NEXT     /Intrinsic.StdCoreSbToString/
205//!
206//! METHOD        "ETSGLOBAL::concat3"
207//! PASS_BEFORE   "BranchElimination"
208//! INST_NOT      /Intrinsic.StdCoreStringConcat/
209//! INST          /StringBuilder::<ctor>/
210//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
211//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
212//! INST_NEXT     /Intrinsic.StdCoreSbToString/
213//! PASS_AFTER    "ChecksElimination"
214//! INST_NOT      /Intrinsic.StdCoreStringConcat/
215//! INST          /StringBuilder::<ctor>/
216//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
217//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
218//! INST_NEXT     /Intrinsic.StdCoreSbToString/
219//!
220//! METHOD        "ETSGLOBAL::concat4"
221//! PASS_BEFORE   "BranchElimination"
222//! INST_NOT      /Intrinsic.StdCoreStringConcat/
223//! INST          /StringBuilder::<ctor>/
224//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,3
225//! INST          /Intrinsic.StdCoreSbToString/
226//! PASS_AFTER    "ChecksElimination"
227//! INST_NOT      /StringBuilder::<ctor>/
228//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
229//! INST_NOT      /Intrinsic.StdCoreSbToString/
230//! INST_COUNT    /Intrinsic.StdCoreStringConcat3/,1
231//!
232//! METHOD        "ETSGLOBAL::concat5"
233//! PASS_BEFORE   "BranchElimination"
234//! INST_NOT      /Intrinsic.StdCoreStringConcat/
235//! INST          /StringBuilder::<ctor>/
236//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,4
237//! INST          /Intrinsic.StdCoreSbToString/
238//! PASS_AFTER    "ChecksElimination"
239//! INST_NOT      /StringBuilder::<ctor>/
240//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
241//! INST_NOT      /Intrinsic.StdCoreSbToString/
242//! INST_COUNT    /Intrinsic.StdCoreStringConcat4/,1
243//!
244//! METHOD        "ETSGLOBAL::concat8"
245//! PASS_BEFORE   "BranchElimination"
246//! INST_NOT      /Intrinsic.StdCoreStringConcat/
247//! INST          /StringBuilder::<ctor>/
248//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
249//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
250//! INST_NEXT     /Intrinsic.StdCoreSbToString/
251//! PASS_AFTER    "ChecksElimination"
252//! INST_NOT      /Intrinsic.StdCoreStringConcat/
253//! INST          /StringBuilder::<ctor>/
254//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
255//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
256//! INST_NEXT     /Intrinsic.StdCoreSbToString/
257//!
258//! METHOD        "ETSGLOBAL::concat10"
259//! PASS_BEFORE   "BranchElimination"
260//! INST_NOT      /Intrinsic.StdCoreStringConcat/
261//! INST          /StringBuilder::<ctor>/
262//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
263//! INST          /Intrinsic.StdCoreSbToString/
264//! PASS_AFTER    "ChecksElimination"
265//! INST_NOT      /Intrinsic.StdCoreStringConcat/
266//! INST          /StringBuilder::<ctor>/
267//! INST_COUNT    "Intrinsic.StdCoreSbAppendString4",1
268//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
269//! INST          /Intrinsic.StdCoreSbToString/
270//!
271//! METHOD        "ETSGLOBAL::concat11"
272//! PASS_BEFORE   "BranchElimination"
273//! INST_NOT      /Intrinsic.StdCoreStringConcat/
274//! INST          /StringBuilder::<ctor>/
275//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
276//! INST          /Intrinsic.StdCoreSbToString/
277//! PASS_AFTER    "ChecksElimination"
278//! INST_NOT      /Intrinsic.StdCoreStringConcat/
279//! INST          /StringBuilder::<ctor>/
280//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
281//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",1
282//! INST          /Intrinsic.StdCoreSbToString/
283//!
284//! METHOD        "ETSGLOBAL::concat13"
285//! PASS_BEFORE   "BranchElimination"
286//! INST_NOT      /Intrinsic.StdCoreStringConcat/
287//! INST          /StringBuilder::<ctor>/
288//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
289//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
290//! INST_NEXT     /Intrinsic.StdCoreSbToString/
291//! PASS_AFTER    "ChecksElimination"
292//! INST_NOT      /StringBuilder::<ctor>/
293//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
294//! INST_NOT      /Intrinsic.StdCoreSbToString/
295//! INST          /Intrinsic.StdCoreStringConcat2/
296//!
297//! METHOD        "ETSGLOBAL::concat14"
298//! PASS_BEFORE   "BranchElimination"
299//! INST_NOT      /Intrinsic.StdCoreStringConcat/
300//! INST          /StringBuilder::<ctor>/
301//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
302//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
303//! INST_NEXT     /Intrinsic.StdCoreSbToString/
304//! PASS_AFTER    "ChecksElimination"
305//! INST          /StringBuilder::<ctor>/
306//! INST_NOT      /Intrinsic.StdCoreStringConcat/
307//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
308//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
309//! INST_NEXT     /Intrinsic.StdCoreSbToString/
310
311function concat0(a: String, b: String): String {
312    return a + b;                                   // applied
313}
314
315function concat1(a: String, b: String): String {
316    let sb = new StringBuilder();
317    sb.append(a);
318    sb.append(b);
319    return sb.toString();                           // applied, IR is equivalent to 'return a + b;'
320}
321
322function concat2(a: String, b: String): String {
323    let sb = new StringBuilder(a);
324    sb.append(b);
325    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
326}
327
328let sb: StringBuilder;
329
330function concat3(a: String, b: String): String {
331    sb = new StringBuilder();                       // the object is a global variable
332    sb.append(a);
333    sb.append(b);
334    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
335}
336
337function concat4(a: String, b: String, c: String): String {
338    return a + b + c;                               // applied
339}
340
341function concat5(a: String, b: String, c: String, d: String): String {
342    return a + b + c + d;                           // applied
343}
344
345function concat8(a: String, b: String): String {
346    let sb = new StringBuilder();
347    sb.append(a);
348    if (b != "")
349        sb.append(b);
350    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
351}
352
353function concat10(a: String, b: String, c: String, d: String, e: String): String {
354    return a + b + c + d + e;                       // not applied, to many args
355}
356
357function concat11(a: String, b: String): String {
358    return a + b + 1;                               // not applied, concatenation with int
359}
360
361function concat13(): string
362{
363    let str = "" + StringBuilder.toString(1);       // applied
364    return str;
365}
366
367function concat14(src: string|null): string {
368  let dst: string = "" + src;                       // not applied due to instance used outside
369                                                    // basic block it was created
370  return dst;
371}
372
373function main() {
374    assert concat0("abc", "de") == "abcde": "Wrong result at concat0";
375    assert concat1("abc", "de") == "abcde": "Wrong result at concat1";
376    assert concat2("abc", "de") == "abcde": "Wrong result at concat2";
377    assert concat3("abc", "de") == "abcde": "Wrong result at concat3";
378    assert concat4("ab", "c", "de") == "abcde": "Wrong result at concat4";
379    assert concat5("ab", "c", "d", "e") == "abcde": "Wrong result at concat5";
380    assert concat8("abc", "de") == "abcde": "Wrong result at concat8";
381    assert concat10("a", "b", "c", "d", "e") == "abcde": "Wrong result at concat10";
382    assert concat11("abc", "de") == "abcde1": "Wrong result at concat11";
383    assert concat13() == "1": "Wrong result at concat13";
384    assert concat14(null) == "null": "Wrong result at concat14";
385}
386