• 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::concat6"
98//! PASS_BEFORE   "BranchElimination"
99//! INST_NOT      /Intrinsic.StdCoreStringConcat/
100//! INST_COUNT    /StringBuilder::<ctor>/,3
101//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
102//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
103//! PASS_AFTER    "ChecksElimination"
104//! INST_NOT      /StringBuilder::<ctor>/
105//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
106//! INST_NOT      /Intrinsic.StdCoreSbToString/
107//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
108//!
109//! METHOD        "ETSGLOBAL::concat7"
110//! PASS_BEFORE   "BranchElimination"
111//! INST_NOT      /Intrinsic.StdCoreStringConcat/
112//! INST_COUNT    /StringBuilder::<ctor>/,3
113//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
114//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
115//! PASS_AFTER    "ChecksElimination"
116//! INST_NOT      /StringBuilder::<ctor>/
117//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
118//! INST_NOT      /Intrinsic.StdCoreSbToString/
119//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
120//!
121//! METHOD        "ETSGLOBAL::concat8"
122//! PASS_BEFORE   "BranchElimination"
123//! INST_NOT      /Intrinsic.StdCoreStringConcat/
124//! INST          /StringBuilder::<ctor>/
125//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
126//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
127//! INST_NEXT     /Intrinsic.StdCoreSbToString/
128//! PASS_AFTER    "ChecksElimination"
129//! INST_NOT      /Intrinsic.StdCoreStringConcat/
130//! INST          /StringBuilder::<ctor>/
131//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
132//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
133//! INST_NEXT     /Intrinsic.StdCoreSbToString/
134//!
135//! METHOD        "ETSGLOBAL::concat9"
136//! PASS_BEFORE   "BranchElimination"
137//! INST_NOT      /Intrinsic.StdCoreStringConcat/
138//! INST          /StringBuilder::<ctor>/
139//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
140//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
141//! INST_NEXT     /Intrinsic.StdCoreSbToString/
142//! PASS_AFTER    "ChecksElimination"
143//! INST_NOT      /Intrinsic.StdCoreStringConcat/
144//! INST          /StringBuilder::<ctor>/
145//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
146//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
147//! INST_NEXT     /Intrinsic.StdCoreSbToString/
148//!
149//! METHOD        "ETSGLOBAL::concat10"
150//! PASS_BEFORE   "BranchElimination"
151//! INST_NOT      /Intrinsic.StdCoreStringConcat/
152//! INST          /StringBuilder::<ctor>/
153//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
154//! INST          /Intrinsic.StdCoreSbToString/
155//! PASS_AFTER    "ChecksElimination"
156//! INST_NOT      /Intrinsic.StdCoreStringConcat/
157//! INST          /StringBuilder::<ctor>/
158//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
159//! INST          /Intrinsic.StdCoreSbToString/
160//!
161//! METHOD        "ETSGLOBAL::concat11"
162//! PASS_BEFORE   "BranchElimination"
163//! INST_NOT      /Intrinsic.StdCoreStringConcat/
164//! INST          /StringBuilder::<ctor>/
165//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
166//! INST          /Intrinsic.StdCoreSbToString/
167//! PASS_AFTER    "ChecksElimination"
168//! INST_NOT      /Intrinsic.StdCoreStringConcat/
169//! INST          /StringBuilder::<ctor>/
170//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
171//! INST          /Intrinsic.StdCoreSbToString/
172//!
173//! METHOD        "ETSGLOBAL::concat12"
174//! PASS_BEFORE   "BranchElimination"
175//! INST_NOT      /Intrinsic.StdCoreStringConcat/
176//! INST_COUNT    /StringBuilder::<ctor>/,3
177//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
178//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
179//! PASS_AFTER    "ChecksElimination"
180//! INST_NOT      /StringBuilder::<ctor>/
181//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
182//! INST_NOT      /Intrinsic.StdCoreSbToString/
183//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
184//!
185//! METHOD        "ETSGLOBAL::concat13"
186//! PASS_BEFORE   "BranchElimination"
187//! INST_NOT      /Intrinsic.StdCoreStringConcat/
188//! INST          /StringBuilder::<ctor>/
189//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
190//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
191//! INST_NEXT     /Intrinsic.StdCoreSbToString/
192//! PASS_AFTER    "ChecksElimination"
193//! INST_NOT      /StringBuilder::<ctor>/
194//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
195//! INST_NOT      /Intrinsic.StdCoreSbToString/
196//! INST          /Intrinsic.StdCoreStringConcat2/
197//!
198//! METHOD        "ETSGLOBAL::concat14"
199//! PASS_BEFORE   "BranchElimination"
200//! INST_NOT      /Intrinsic.StdCoreStringConcat/
201//! INST          /StringBuilder::<ctor>/
202//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
203//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
204//! INST_NEXT     /Intrinsic.StdCoreSbToString/
205//! PASS_AFTER    "ChecksElimination"
206//! INST          /StringBuilder::<ctor>/
207//! INST_NOT      /Intrinsic.StdCoreStringConcat/
208//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
209//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
210//! INST_NEXT     /Intrinsic.StdCoreSbToString/
211
212//! CHECKER       JIT IR Builder, check String concatenation
213//! SKIP_IF       @architecture == "arm32"
214//! RUN           force_jit: true, options: "--compiler-regex='.*concat[0-9]+.*' --compiler-inlining=false", entry: "ETSGLOBAL::main"
215//!
216//! METHOD        "ETSGLOBAL::concat0"
217//! PASS_BEFORE   "BranchElimination"
218//! INST_NOT      /Intrinsic.StdCoreStringConcat/
219//! INST          /StringBuilder::<ctor>/
220//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
221//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
222//! INST_NEXT     /Intrinsic.StdCoreSbToString/
223//! PASS_AFTER    "ChecksElimination"
224//! INST_NOT      /StringBuilder::<ctor>/
225//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
226//! INST_NOT      /Intrinsic.StdCoreSbToString/
227//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
228//!
229//! METHOD        "ETSGLOBAL::concat1"
230//! PASS_BEFORE   "BranchElimination"
231//! INST_NOT      /Intrinsic.StdCoreStringConcat/
232//! INST          /StringBuilder::<ctor>/
233//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
234//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
235//! INST_NEXT     /Intrinsic.StdCoreSbToString/
236//! PASS_AFTER    "ChecksElimination"
237//! INST_NOT      /StringBuilder::<ctor>/
238//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
239//! INST_NOT      /Intrinsic.StdCoreSbToString/
240//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,1
241//!
242//! METHOD        "ETSGLOBAL::concat2"
243//! PASS_BEFORE   "BranchElimination"
244//! INST_NOT      /Intrinsic.StdCoreStringConcat/
245//! INST          /StringBuilder::<ctor>/
246//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
247//! INST_NEXT     /Intrinsic.StdCoreSbToString/
248//! PASS_AFTER    "ChecksElimination"
249//! INST_NOT      /Intrinsic.StdCoreStringConcat/
250//! INST          /StringBuilder::<ctor>/
251//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
252//! INST_NEXT     /Intrinsic.StdCoreSbToString/
253//!
254//! METHOD        "ETSGLOBAL::concat3"
255//! PASS_BEFORE   "BranchElimination"
256//! INST_NOT      /Intrinsic.StdCoreStringConcat/
257//! INST          /StringBuilder::<ctor>/
258//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
259//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
260//! INST_NEXT     /Intrinsic.StdCoreSbToString/
261//! PASS_AFTER    "ChecksElimination"
262//! INST_NOT      /Intrinsic.StdCoreStringConcat/
263//! INST          /StringBuilder::<ctor>/
264//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
265//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
266//! INST_NEXT     /Intrinsic.StdCoreSbToString/
267//!
268//! METHOD        "ETSGLOBAL::concat4"
269//! PASS_BEFORE   "BranchElimination"
270//! INST_NOT      /Intrinsic.StdCoreStringConcat/
271//! INST          /StringBuilder::<ctor>/
272//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,3
273//! INST          /Intrinsic.StdCoreSbToString/
274//! PASS_AFTER    "ChecksElimination"
275//! INST_NOT      /StringBuilder::<ctor>/
276//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
277//! INST_NOT      /Intrinsic.StdCoreSbToString/
278//! INST_COUNT    /Intrinsic.StdCoreStringConcat3/,1
279//!
280//! METHOD        "ETSGLOBAL::concat5"
281//! PASS_BEFORE   "BranchElimination"
282//! INST_NOT      /Intrinsic.StdCoreStringConcat/
283//! INST          /StringBuilder::<ctor>/
284//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,4
285//! INST          /Intrinsic.StdCoreSbToString/
286//! PASS_AFTER    "ChecksElimination"
287//! INST_NOT      /StringBuilder::<ctor>/
288//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
289//! INST_NOT      /Intrinsic.StdCoreSbToString/
290//! INST_COUNT    /Intrinsic.StdCoreStringConcat4/,1
291//!
292//! METHOD        "ETSGLOBAL::concat6"
293//! PASS_BEFORE   "BranchElimination"
294//! INST_NOT      /Intrinsic.StdCoreStringConcat/
295//! INST_COUNT    /StringBuilder::<ctor>/,3
296//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
297//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
298//! PASS_AFTER    "ChecksElimination"
299//! INST_NOT      /StringBuilder::<ctor>/
300//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
301//! INST_NOT      /Intrinsic.StdCoreSbToString/
302//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
303//!
304//! METHOD        "ETSGLOBAL::concat7"
305//! PASS_BEFORE   "BranchElimination"
306//! INST_NOT      /Intrinsic.StdCoreStringConcat/
307//! INST_COUNT    /StringBuilder::<ctor>/,3
308//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
309//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
310//! PASS_AFTER    "ChecksElimination"
311//! INST_NOT      /StringBuilder::<ctor>/
312//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
313//! INST_NOT      /Intrinsic.StdCoreSbToString/
314//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
315//!
316//! METHOD        "ETSGLOBAL::concat8"
317//! PASS_BEFORE   "BranchElimination"
318//! INST_NOT      /Intrinsic.StdCoreStringConcat/
319//! INST          /StringBuilder::<ctor>/
320//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
321//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
322//! INST_NEXT     /Intrinsic.StdCoreSbToString/
323//! PASS_AFTER    "ChecksElimination"
324//! INST_NOT      /Intrinsic.StdCoreStringConcat/
325//! INST          /StringBuilder::<ctor>/
326//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
327//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
328//! INST_NEXT     /Intrinsic.StdCoreSbToString/
329//!
330//! METHOD        "ETSGLOBAL::concat9"
331//! PASS_BEFORE   "BranchElimination"
332//! INST_NOT      /Intrinsic.StdCoreStringConcat/
333//! INST          /StringBuilder::<ctor>/
334//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
335//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
336//! INST_NEXT     /Intrinsic.StdCoreSbToString/
337//! PASS_AFTER    "ChecksElimination"
338//! INST_NOT      /Intrinsic.StdCoreStringConcat/
339//! INST          /StringBuilder::<ctor>/
340//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
341//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
342//! INST_NEXT     /Intrinsic.StdCoreSbToString/
343//!
344//! METHOD        "ETSGLOBAL::concat10"
345//! PASS_BEFORE   "BranchElimination"
346//! INST_NOT      /Intrinsic.StdCoreStringConcat/
347//! INST          /StringBuilder::<ctor>/
348//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
349//! INST          /Intrinsic.StdCoreSbToString/
350//! PASS_AFTER    "ChecksElimination"
351//! INST_NOT      /Intrinsic.StdCoreStringConcat/
352//! INST          /StringBuilder::<ctor>/
353//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,5
354//! INST          /Intrinsic.StdCoreSbToString/
355//!
356//! METHOD        "ETSGLOBAL::concat11"
357//! PASS_BEFORE   "BranchElimination"
358//! INST_NOT      /Intrinsic.StdCoreStringConcat/
359//! INST          /StringBuilder::<ctor>/
360//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
361//! INST          /Intrinsic.StdCoreSbToString/
362//! PASS_AFTER    "ChecksElimination"
363//! INST_NOT      /Intrinsic.StdCoreStringConcat/
364//! INST          /StringBuilder::<ctor>/
365//! INST_COUNT    /Intrinsic.StdCoreSbAppend/,3
366//! INST          /Intrinsic.StdCoreSbToString/
367//!
368//! METHOD        "ETSGLOBAL::concat12"
369//! PASS_BEFORE   "BranchElimination"
370//! INST_NOT      /Intrinsic.StdCoreStringConcat/
371//! INST_COUNT    /StringBuilder::<ctor>/,3
372//! INST_COUNT    /Intrinsic.StdCoreSbAppendString/,6
373//! INST_COUNT    /Intrinsic.StdCoreSbToString/,3
374//! PASS_AFTER    "ChecksElimination"
375//! INST_NOT      /StringBuilder::<ctor>/
376//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
377//! INST_NOT      /Intrinsic.StdCoreSbToString/
378//! INST_COUNT    /Intrinsic.StdCoreStringConcat2/,3
379//!
380//! METHOD        "ETSGLOBAL::concat13"
381//! PASS_BEFORE   "BranchElimination"
382//! INST_NOT      /Intrinsic.StdCoreStringConcat/
383//! INST          /StringBuilder::<ctor>/
384//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
385//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
386//! INST_NEXT     /Intrinsic.StdCoreSbToString/
387//! PASS_AFTER    "ChecksElimination"
388//! INST_NOT      /StringBuilder::<ctor>/
389//! INST_NOT      /Intrinsic.StdCoreSbAppendString/
390//! INST_NOT      /Intrinsic.StdCoreSbToString/
391//! INST          /Intrinsic.StdCoreStringConcat2/
392//!
393//! METHOD        "ETSGLOBAL::concat14"
394//! PASS_BEFORE   "BranchElimination"
395//! INST_NOT      /Intrinsic.StdCoreStringConcat/
396//! INST          /StringBuilder::<ctor>/
397//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
398//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
399//! INST_NEXT     /Intrinsic.StdCoreSbToString/
400//! PASS_AFTER    "ChecksElimination"
401//! INST          /StringBuilder::<ctor>/
402//! INST_NOT      /Intrinsic.StdCoreStringConcat/
403//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
404//! INST_NEXT     /Intrinsic.StdCoreSbAppendString/
405//! INST_NEXT     /Intrinsic.StdCoreSbToString/
406
407function concat0(a: String, b: String): String {
408    return a + b;                                   // applied
409}
410
411function concat1(a: String, b: String): String {
412    let sb = new StringBuilder();
413    sb.append(a);
414    sb.append(b);
415    return sb.toString();                           // applied, IR is equivalent to 'return a + b;'
416}
417
418function concat2(a: String, b: String): String {
419    let sb = new StringBuilder(a);
420    sb.append(b);
421    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
422}
423
424let sb: StringBuilder;
425
426function concat3(a: String, b: String): String {
427    sb = new StringBuilder();                       // the object is a global variable
428    sb.append(a);
429    sb.append(b);
430    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
431}
432
433function concat4(a: String, b: String, c: String): String {
434    return a + b + c;                               // applied
435}
436
437function concat5(a: String, b: String, c: String, d: String): String {
438    return a + b + c + d;                           // applied
439}
440
441function concat6(a: String, b: String, c: String, d: String): String {
442    let ab = a + b;                                 // applied
443    let cd = c + d;                                 // applied
444    return ab + cd;                                 // applied
445}
446
447function concat7(a: String, b: String, c: String, d: String): String {
448    let str = a + b;                                // applied
449    str += c;                                       // applied
450    str += d;                                       // applied
451    return str;
452}
453
454function concat8(a: String, b: String): String {
455    let sb = new StringBuilder();
456    sb.append(a);
457    if (b != "")
458        sb.append(b);
459    return sb.toString();                           // not applied, IR is not equivalent to 'return a + b;'
460}
461
462function concat9(a: String, b: String): String {
463    return new StringBuilder().append(a).append(b).toString();  // not applied, IR is not equivalent to 'return a + b;'
464}
465
466function concat10(a: String, b: String, c: String, d: String, e: String): String {
467    return a + b + c + d + e;                       // not applied, to many args
468}
469
470function concat11(a: String, b: String): String {
471    return a + b + 1;                               // not applied, concatenation with int
472}
473
474function concat12(a: String, b: String, c: String, d: String): String {
475    let abcd = a + b;                               // applied
476    abcd += c + d;                                  // applied
477    return abcd;
478}
479
480function concat13(): string
481{
482    let str = "" + StringBuilder.toString(1);       // applied
483    return str;
484}
485
486function concat14(src: string|null): string {
487  let dst: string = "" + src;                       // not applied due to instance used outside
488                                                    // basic block it was created
489  return dst;
490}
491
492function main() {
493    assert concat0("abc", "de") == "abcde": "Wrong result at concat0";
494    assert concat1("abc", "de") == "abcde": "Wrong result at concat1";
495    assert concat2("abc", "de") == "abcde": "Wrong result at concat2";
496    assert concat3("abc", "de") == "abcde": "Wrong result at concat3";
497    assert concat4("ab", "c", "de") == "abcde": "Wrong result at concat4";
498    assert concat5("ab", "c", "d", "e") == "abcde": "Wrong result at concat5";
499    console.log(concat6("ab", "c", "d", "e"))
500//    assert concat6("ab", "c", "d", "e") == "abcde": "Wrong result at concat6";
501    console.log(concat7("ab", "c", "d", "e"))
502    assert concat7("ab", "c", "d", "e") == "abcde": "Wrong result at concat7";
503    assert concat8("abc", "de") == "abcde": "Wrong result at concat8";
504    assert concat9("abc", "de") == "abcde": "Wrong result at concat9";
505    assert concat10("a", "b", "c", "d", "e") == "abcde": "Wrong result at concat10";
506    assert concat11("abc", "de") == "abcde1": "Wrong result at concat11";
507    console.log(concat12("ab", "c", "d", "e"))
508    assert concat12("ab", "c", "d", "e") == "abcde": "Wrong result at concat12";
509    assert concat13() == "1": "Wrong result at concat13";
510    assert concat14(null) == "null": "Wrong result at concat14";
511}
512