• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2024-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 String Builders merging
17//! SKIP_IF       @architecture == "arm32"
18//! RUN           entry: "ets_string_builder_merge.ETSGLOBAL::main"
19//! RUN_PAOC      options: "--compiler-regex='.*chain_concat[0-9]*' --compiler-inlining=false"
20//!
21//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat0"
22//! PASS_BEFORE   "BranchElimination"
23//! INST_COUNT    "StringBuilder::<ctor>",5
24//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",10
25//! INST_COUNT    "Intrinsic.StdCoreSbToString",5
26//! PASS_AFTER    "SimplifyStringBuilder"
27//! INST_COUNT    "StringBuilder::<ctor>",1
28//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
29//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",4
30//! PASS_AFTER    "Codegen"
31//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
32//!
33//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat1"
34//! PASS_BEFORE   "BranchElimination"
35//! INST_COUNT    "StringBuilder::<ctor>",7
36//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",14
37//! INST_COUNT    "Intrinsic.StdCoreSbToString",7
38//! PASS_AFTER    "SimplifyStringBuilder"
39//! INST_COUNT    "StringBuilder::<ctor>",1
40//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
41//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",6
42//! PASS_AFTER    "Codegen"
43//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
44//!
45//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat2"
46//! PASS_BEFORE   "BranchElimination"
47//! INST_COUNT    "StringBuilder::<ctor>",9
48//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",18
49//! INST_COUNT    "Intrinsic.StdCoreSbToString",9
50//! PASS_AFTER    "SimplifyStringBuilder"
51//! INST_COUNT    "StringBuilder::<ctor>",1
52//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
53//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",8
54//! PASS_AFTER    "Codegen"
55//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
56//!
57//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat3"
58//! PASS_BEFORE   "BranchElimination"
59//! INST_COUNT    "StringBuilder::<ctor>",14
60//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",28
61//! INST_COUNT    "Intrinsic.StdCoreSbToString",14
62//! PASS_AFTER    "SimplifyStringBuilder"
63//! INST_COUNT    "StringBuilder::<ctor>",2
64//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",2
65//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",12
66//! PASS_AFTER    "Codegen"
67//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
68//!
69//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat5"
70//! PASS_BEFORE   "BranchElimination"
71//! INST_COUNT    "StringBuilder::<ctor>",2
72//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",4
73//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
74//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
75//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
76//! PASS_AFTER    "SimplifyStringBuilder"
77//! INST_COUNT    "StringBuilder::<ctor>",1
78//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",3
79//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
80//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
81//! PASS_AFTER    "Codegen"
82//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
83//!
84//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat6"
85//! PASS_BEFORE   "BranchElimination"
86//! INST_COUNT    "StringBuilder::<ctor>",2
87//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",37
88//! INST_COUNT    "Intrinsic.StdCoreSbAppendBool",4
89//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
90//! INST_COUNT    "Intrinsic.StdCoreSbAppendByte",4
91//! INST_COUNT    "Intrinsic.StdCoreSbAppendShort",2
92//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
93//! INST_COUNT    "Intrinsic.StdCoreSbAppendLong",2
94//! INST_COUNT    "std.core.StringBuilder::append",8
95//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
96//! PASS_AFTER    "SimplifyStringBuilder"
97//! INST_COUNT    "StringBuilder::<ctor>",1
98//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",22
99//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",0
100//! INST_COUNT    "Intrinsic.StdCoreSbAppendString3",2
101//! INST_COUNT    "Intrinsic.StdCoreSbAppendString4",2
102//! PASS_AFTER    "Codegen"
103//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
104//!
105//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_append_chain_concat7"
106//! PASS_BEFORE   "BranchElimination"
107//! INST_COUNT    "StringBuilder::<ctor>",2
108//! PASS_AFTER    "SimplifyStringBuilder"
109//! INST_COUNT    "StringBuilder::<ctor>",2
110//!
111//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_constructor_chain_concat8"
112//! PASS_BEFORE   "BranchElimination"
113//! INST_COUNT    "StringBuilder::<ctor>",2
114//! PASS_AFTER    "SimplifyStringBuilder"
115//! INST_COUNT    "StringBuilder::<ctor>",2
116//!
117//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat9"
118//! PASS_BEFORE   "BranchElimination"
119//! INST_COUNT    "StringBuilder::<ctor>",2
120//! PASS_AFTER    "SimplifyStringBuilder"
121//! INST_COUNT    "StringBuilder::<ctor>",2
122//!
123//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat10"
124//! PASS_BEFORE   "BranchElimination"
125//! INST_COUNT    "StringBuilder::<ctor>",2
126//! PASS_AFTER    "SimplifyStringBuilder"
127//! INST_COUNT    "StringBuilder::<ctor>",2
128//!
129//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat11"
130//! PASS_BEFORE   "BranchElimination"
131//! INST_COUNT    "StringBuilder::<ctor>",3
132//! PASS_AFTER    "SimplifyStringBuilder"
133//! INST_COUNT    "StringBuilder::<ctor>",3
134//!
135//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat12"
136//! PASS_BEFORE   "BranchElimination"
137//! INST_COUNT    "StringBuilder::<ctor>",2
138//! PASS_AFTER    "SimplifyStringBuilder"
139//! INST_COUNT    "StringBuilder::<ctor>",2
140//!
141//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat13"
142//! PASS_BEFORE   "BranchElimination"
143//! INST_COUNT    "StringBuilder::<ctor>",1
144//! PASS_AFTER    "SimplifyStringBuilder"
145//! INST_COUNT    "StringBuilder::<ctor>",1
146//!
147//! METHOD        "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat14"
148//! PASS_BEFORE   "BranchElimination"
149//! INST_COUNT    "StringBuilder::<ctor>",3
150//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
151//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
152//! PASS_AFTER    "SimplifyStringBuilder"
153//! INST_COUNT    "StringBuilder::<ctor>",1
154//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
155//! INST_COUNT    "Intrinsic.StdCoreStringConcat2",1
156//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
157//! PASS_AFTER    "Codegen"
158//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
159//!
160//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat15"
161//! PASS_BEFORE   "BranchElimination"
162//! INST_COUNT    "StringBuilder::<ctor>",3
163//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
164//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
165//! PASS_AFTER    "SimplifyStringBuilder"
166//! INST_COUNT    "StringBuilder::<ctor>",1
167//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
168//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
169//! PASS_AFTER    "Codegen"
170//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
171//!
172//! METHOD        "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat16"
173//! PASS_BEFORE   "BranchElimination"
174//! INST_COUNT    "StringBuilder::<ctor>",3
175//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
176//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
177//! PASS_AFTER    "SimplifyStringBuilder"
178//! INST_COUNT    "StringBuilder::<ctor>",1
179//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
180//! INST_COUNT    "Intrinsic.StdCoreStringConcat2",1
181//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
182//! PASS_AFTER    "Codegen"
183//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
184//!
185//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat17"
186//! PASS_BEFORE   "BranchElimination"
187//! INST_COUNT    "StringBuilder::<ctor>",1
188//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
189//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
190//! PASS_AFTER    "SimplifyStringBuilder"
191//! INST_COUNT    "StringBuilder::<ctor>",1
192//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
193//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
194//!
195//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat18"
196//! PASS_BEFORE   "BranchElimination"
197//! INST_COUNT    "StringBuilder::<ctor>",1
198//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
199//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
200//! PASS_AFTER    "SimplifyStringBuilder"
201//! INST_COUNT    "StringBuilder::<ctor>",1
202//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
203//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
204
205//! CHECKER       JIT IR Builder, check String Builders merging
206//! SKIP_IF       @architecture == "arm32"
207//! RUN           force_jit: true, options: "--compiler-regex='.*chain_concat[0-9]+.*' --compiler-inlining=false", entry: "ets_string_builder_merge.ETSGLOBAL::main"
208//!
209//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat0"
210//! PASS_BEFORE   "BranchElimination"
211//! INST_COUNT    "StringBuilder::<ctor>",5
212//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",10
213//! INST_COUNT    "Intrinsic.StdCoreSbToString",5
214//! PASS_AFTER    "SimplifyStringBuilder"
215//! INST_COUNT    "StringBuilder::<ctor>",1
216//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
217//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",4
218//! PASS_AFTER    "Codegen"
219//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
220//!
221//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat1"
222//! PASS_BEFORE   "BranchElimination"
223//! INST_COUNT    "StringBuilder::<ctor>",7
224//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",14
225//! INST_COUNT    "Intrinsic.StdCoreSbToString",7
226//! PASS_AFTER    "SimplifyStringBuilder"
227//! INST_COUNT    "StringBuilder::<ctor>",1
228//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
229//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",6
230//! PASS_AFTER    "Codegen"
231//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
232//!
233//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat2"
234//! PASS_BEFORE   "BranchElimination"
235//! INST_COUNT    "StringBuilder::<ctor>",9
236//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",18
237//! INST_COUNT    "Intrinsic.StdCoreSbToString",9
238//! PASS_AFTER    "SimplifyStringBuilder"
239//! INST_COUNT    "StringBuilder::<ctor>",1
240//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
241//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",8
242//! PASS_AFTER    "Codegen"
243//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
244//!
245//! METHOD        "ets_string_builder_merge.ETSGLOBAL::chain_concat3"
246//! PASS_BEFORE   "BranchElimination"
247//! INST_COUNT    "StringBuilder::<ctor>",14
248//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",28
249//! INST_COUNT    "Intrinsic.StdCoreSbToString",14
250//! PASS_AFTER    "SimplifyStringBuilder"
251//! INST_COUNT    "StringBuilder::<ctor>",2
252//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",2
253//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",12
254//! PASS_AFTER    "Codegen"
255//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
256//!
257//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat5"
258//! PASS_BEFORE   "BranchElimination"
259//! INST_COUNT    "StringBuilder::<ctor>",2
260//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",4
261//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
262//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
263//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
264//! PASS_AFTER    "SimplifyStringBuilder"
265//! INST_COUNT    "StringBuilder::<ctor>",1
266//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",3
267//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
268//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
269//! PASS_AFTER    "Codegen"
270//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
271//!
272//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat6"
273//! PASS_BEFORE   "BranchElimination"
274//! INST_COUNT    "StringBuilder::<ctor>",2
275//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",37
276//! INST_COUNT    "Intrinsic.StdCoreSbAppendBool",4
277//! INST_COUNT    "Intrinsic.StdCoreSbAppendChar",2
278//! INST_COUNT    "Intrinsic.StdCoreSbAppendByte",4
279//! INST_COUNT    "Intrinsic.StdCoreSbAppendShort",2
280//! INST_COUNT    "Intrinsic.StdCoreSbAppendInt",2
281//! INST_COUNT    "Intrinsic.StdCoreSbAppendLong",2
282//! INST_COUNT    "std.core.StringBuilder::append",8
283//! INST_COUNT    "Intrinsic.StdCoreSbToString",2
284//! PASS_AFTER    "SimplifyStringBuilder"
285//! INST_COUNT    "StringBuilder::<ctor>",1
286//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",22
287//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",0
288//! INST_COUNT    "Intrinsic.StdCoreSbAppendString3",2
289//! INST_COUNT    "Intrinsic.StdCoreSbAppendString4",2
290//! PASS_AFTER    "Codegen"
291//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
292//!
293//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_append_chain_concat7"
294//! PASS_BEFORE   "BranchElimination"
295//! INST_COUNT    "StringBuilder::<ctor>",2
296//! PASS_AFTER    "SimplifyStringBuilder"
297//! INST_COUNT    "StringBuilder::<ctor>",2
298//!
299//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_constructor_chain_concat8"
300//! PASS_BEFORE   "BranchElimination"
301//! INST_COUNT    "StringBuilder::<ctor>",2
302//! PASS_AFTER    "SimplifyStringBuilder"
303//! INST_COUNT    "StringBuilder::<ctor>",2
304//!
305//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat9"
306//! PASS_BEFORE   "BranchElimination"
307//! INST_COUNT    "StringBuilder::<ctor>",2
308//! PASS_AFTER    "SimplifyStringBuilder"
309//! INST_COUNT    "StringBuilder::<ctor>",2
310//!
311//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat10"
312//! PASS_BEFORE   "BranchElimination"
313//! INST_COUNT    "StringBuilder::<ctor>",2
314//! PASS_AFTER    "SimplifyStringBuilder"
315//! INST_COUNT    "StringBuilder::<ctor>",2
316//!
317//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat11"
318//! PASS_BEFORE   "BranchElimination"
319//! INST_COUNT    "StringBuilder::<ctor>",3
320//! PASS_AFTER    "SimplifyStringBuilder"
321//! INST_COUNT    "StringBuilder::<ctor>",3
322//!
323//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat12"
324//! PASS_BEFORE   "BranchElimination"
325//! INST_COUNT    "StringBuilder::<ctor>",2
326//! PASS_AFTER    "SimplifyStringBuilder"
327//! INST_COUNT    "StringBuilder::<ctor>",2
328//!
329//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_chain_concat13"
330//! PASS_BEFORE   "BranchElimination"
331//! INST_COUNT    "StringBuilder::<ctor>",1
332//! PASS_AFTER    "SimplifyStringBuilder"
333//! INST_COUNT    "StringBuilder::<ctor>",1
334//!
335//! METHOD        "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat14"
336//! PASS_BEFORE   "BranchElimination"
337//! INST_COUNT    "StringBuilder::<ctor>",3
338//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
339//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
340//! PASS_AFTER    "SimplifyStringBuilder"
341//! INST_COUNT    "StringBuilder::<ctor>",1
342//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
343//! INST_COUNT    "Intrinsic.StdCoreStringConcat2",1
344//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
345//! PASS_AFTER    "Codegen"
346//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
347//!
348//! METHOD        "ets_string_builder_merge.ETSGLOBAL::supported_chain_concat15"
349//! PASS_BEFORE   "BranchElimination"
350//! INST_COUNT    "StringBuilder::<ctor>",3
351//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
352//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
353//! PASS_AFTER    "SimplifyStringBuilder"
354//! INST_COUNT    "StringBuilder::<ctor>",1
355//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
356//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
357//! PASS_AFTER    "Codegen"
358//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
359//!
360//! METHOD        "ets_string_builder_merge.ETSGLOBAL::partially_supported_chain_concat16"
361//! PASS_BEFORE   "BranchElimination"
362//! INST_COUNT    "StringBuilder::<ctor>",3
363//! INST_COUNT    "Intrinsic.StdCoreSbAppendString",6
364//! INST_COUNT    "Intrinsic.StdCoreSbToString",3
365//! PASS_AFTER    "SimplifyStringBuilder"
366//! INST_COUNT    "StringBuilder::<ctor>",1
367//! INST_COUNT    "Intrinsic.StdCoreSbAppendString2",1
368//! INST_COUNT    "Intrinsic.StdCoreStringConcat2",1
369//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",1
370//! PASS_AFTER    "Codegen"
371//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
372//!
373//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat17"
374//! PASS_BEFORE   "BranchElimination"
375//! INST_COUNT    "StringBuilder::<ctor>",1
376//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
377//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
378//! PASS_AFTER    "SimplifyStringBuilder"
379//! INST_COUNT    "StringBuilder::<ctor>",1
380//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
381//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
382//!
383//! METHOD        "ets_string_builder_merge.ETSGLOBAL::unsupported_usage_chain_concat18"
384//! PASS_BEFORE   "BranchElimination"
385//! INST_COUNT    "StringBuilder::<ctor>",1
386//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
387//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
388//! INST_COUNT    "String::concat",1
389//! PASS_AFTER    "SimplifyStringBuilder"
390//! INST_COUNT    "StringBuilder::<ctor>",1
391//! INST_COUNT    "Intrinsic.StdCoreSbAppendString ",2
392//! INST_COUNT    "Intrinsic.StdCoreSbToString",1
393
394// Each '+=' operation on strings in tests below is translated into StringBuilder + 2 append calls by frontend
395
396function chain_concat0(a: String, n: int, b: String, m: int): String {
397    let str: String = "";
398    str += "_";
399    for (let i = 0; i < n; ++i)
400        str += a;
401    str += "_";
402    for (let i = 0; i < m; ++i)
403        str += b;
404    str += "_";
405    return str;                                 // applied, 5 SBs merged into 1
406}
407
408function chain_concat1(a: String, n: int, b: String, m: int, c: String, l: int): String {
409    let str: String = "";
410    str += "_";
411    for (let i = 0; i < n; ++i)
412        str += a;
413    str += "_";
414    for (let i = 0; i < m; ++i)
415        str += b;
416    str += "_";
417    for (let i = 0; i < l; ++i)
418        str += c;
419    str += "_";
420    return str;                                 // applied, 7 SBs merged into 1
421}
422
423function chain_concat2(a: String, n: int, b: String, m: int, c: String, l: int, d: String, k: int): String {
424    let str: String = "";
425    str += "_";
426    for (let i = 0; i < n; ++i)
427        str += a;
428    str += "_";
429    for (let i = 0; i < m; ++i)
430        str += b;
431    str += "_";
432    for (let i = 0; i < l; ++i)
433        str += c;
434    str += "_";
435    for (let i = 0; i < k; ++i)
436        str += d;
437    str += "_";
438    return str;                                 // applied, 9 SBs merged into 1
439}
440
441function chain_concat3(a: String, n: int, b: String, m: int, c: String, l: int, d: String, k: int): String {
442    let str0: String = "";                      // two SBs chains '0' and '1'
443    let str1: String = "";                      // for each string accumulator variable
444    str0 += "_";                                //  0
445    str1 += "_";                                //  |     1
446    for (let i = 0; i < n; ++i) {               //  |     |
447        str0 += a;                              //  0     |
448        str1 += a;                              //  |     1
449    }                                           //  |     |
450    str0 += "_";                                //  0     |
451    str1 += "_";                                //  |     1
452    for (let i = 0; i < m; ++i) {               //  |    /
453        str0 += b;                              //  0   /
454        str1 += b;                              //  |  1
455    }                                           //  | /
456                                                //  |/
457    str0 += str1;                               //  0 <- 'chain 1' connects to 'chain 0' here
458    str0 += "_";                                //  0
459                                                //  |
460    for (let i = 0; i < l; ++i)                 //  |
461        str0 += c;                              //  0
462    str0 += "_";                                //  0
463    for (let i = 0; i < k; ++i)                 //  |
464        str0 += d;                              //  0
465    str0 += "_";                                //  0
466    return str0;    // applied, 14 SBs (10 from 'chain 0', and 4 from 'chain 1') merged into 2 SBs
467}
468
469// Set of SB based tests
470
471const empty = "";
472const space = " ";
473
474function supported_chain_concat5(): String {
475    let sb0 = new StringBuilder();
476    sb0.append(0)
477       .append("1")
478       .append(c'2');
479
480    let sb1 = new StringBuilder();
481    sb1.append(sb0.toString())
482       .append(space)
483       .append(0)
484       .append("1")
485       .append(c'2');
486
487    return sb1.toString();                  // applied
488}
489
490function supported_chain_concat6(): String {
491    let sb0 = new StringBuilder();
492    sb0.append(space)
493       .append("abcΣΨΩ0123456789")
494       .append(space)
495       .append(true)
496       .append(space)
497       .append(false)
498       .append(space)
499       .append(c'A' as char)
500       .append(space)
501       .append(57 as byte)
502       .append(space)
503       .append(127 as byte)
504       .append(space)
505       .append(32767 as short)
506       .append(space)
507       .append(128934675 as int)
508       .append(space)
509       .append(701234987654321 as long)
510       .append(space)
511       .append(empty)
512       .append("string")
513       .append(space)
514       .append(new Object())
515       .append(space)
516       .append(1.0 as Float)
517       .append(space)
518       .append(1.0 as Double)
519       .append(space)
520       .append(1.0 as Number)
521       .append(space);
522
523    let sb1 = new StringBuilder();
524    sb1.append(sb0.toString())
525       .append(space)
526       .append("abcΣΨΩ0123456789")
527       .append(space)
528       .append(true)
529       .append(space)
530       .append(false)
531       .append(space)
532       .append(c'A' as char)
533       .append(space)
534       .append(57 as byte)
535       .append(space)
536       .append(127 as byte)
537       .append(space)
538       .append(32767 as short)
539       .append(space)
540       .append(128934675 as int)
541       .append(space)
542       .append(701234987654321 as long)
543       .append(space)
544       .append(empty)
545       .append("string")
546       .append(space)
547       .append(new Object())
548       .append(space)
549       .append(1.0 as Float)
550       .append(space)
551       .append(1.0 as Double)
552       .append(space)
553       .append(1.0 as Number)
554       .append(space);
555
556    return sb1.toString();                  // applied
557}
558
559function unsupported_append_chain_concat7(): String {
560    let sb0 = new StringBuilder();
561    sb0.append(0);
562
563    let sb1 = new StringBuilder();
564    sb1.append(0)
565       .append(space)
566       .append(sb0.toString());
567
568    return sb1.toString();                  // not applied, sb0.toString() must be appended first
569}
570
571function unsupported_constructor_chain_concat8(): String {
572    let sb0 = new StringBuilder();
573    sb0.append(0);
574
575    let sb1 = new StringBuilder("0");
576    sb1.append(sb0.toString());
577
578    return sb1.toString();                  // not applied, sb1 must be constructed via default constructor
579}
580
581function unsupported_usage_chain_concat9(): String {
582    let sb0 = new StringBuilder();
583    sb0.append(0);
584
585    let sb1 = new StringBuilder();
586    sb1.append(sb0.toString());
587
588    sb0.append(space);
589
590    return sb1.toString();                  // not applied, sb0 must not be used after sb0.toString() appended
591}
592
593function unsupported_chain_concat10(cond: boolean): String {
594    let sb0 = new StringBuilder();
595    sb0.append(0)
596       .append("1")
597       .append(c'2');
598
599    let sb1 = new StringBuilder();
600    if (cond)
601        sb1.append(sb0.toString());
602    else
603        sb1.append("210");
604
605    sb1.append(space)
606       .append(0)
607       .append("1")
608       .append(c'2');
609
610    return sb1.toString();                  // not applied, sb1 constructor and sb1.append(sb0.toString()) are not in the same BB
611}
612
613function unsupported_chain_concat11(cond: boolean): String {
614    let sb0 = new StringBuilder("0");
615    let sb1 = new StringBuilder("1");
616
617    let sb = cond ? sb1 : sb0;
618
619    let sb2 = new StringBuilder();
620    sb2.append(sb.toString())
621       .append(space)
622       .append(2);
623
624    return sb2.toString();                  // not applied, sb is Phi instruction
625}
626
627function __noinline__consume(obj: Object): void {}
628
629function unsupported_chain_concat12(cond: boolean): String {
630    let sb0 = new StringBuilder("0");
631    let sb1 = new StringBuilder();
632    let sb = cond ? sb1 : sb0;
633
634    sb1.append(sb0.toString())
635       .append(space)
636       .append(1);
637
638    __noinline__consume(sb);
639
640    return sb1.toString();                  // not applied, sb0 must not be used after sb0.toString() appended
641}
642
643let sb0_global = new StringBuilder("0");
644function unsupported_chain_concat13(): String {
645    let sb1 = new StringBuilder();
646    sb1.append(sb0_global.toString())
647       .append(space)
648       .append(1);
649
650    return sb1.toString();                  // not applied, sb0 must be local instance
651}
652
653function partially_supported_chain_concat14(a: String, b: String, c: String, d: String): String {
654    let ab = a + b;
655    let cd = c + d;                                 // not applied, due to 'cd' appended to result is not the first append
656    return ab + cd;                                 // applied, 3 SBs merged into 1 SB + concat2
657}
658
659function supported_chain_concat15(a: String, b: String, c: String, d: String): String {
660    let str = a + b;
661    str += c;
662    str += d;                                       // applied, 3 SBs merged into 1 SB
663    return str;
664}
665
666function partially_supported_chain_concat16(a: String, b: String, c: String, d: String): String {
667    let abcd = a + b;
668    abcd += c + d;                                  // not applied, due to 'c+d' appended to result is not the first append
669    return abcd;                                    // applied, 3 SBs merged into 1 SB + concat2
670}
671
672function unsupported_usage_chain_concat17(a: String): String {
673    let sb = new StringBuilder();
674    sb.append(a);
675    let result = sb.toString();
676    sb.append(a);
677    return result;                                  // not applied, sb must not be used after sb.toString() appended
678}
679
680function unsupported_usage_chain_concat18(a: String): String {
681    let sb = new StringBuilder();
682    sb.append(a);
683    let result = sb.toString();
684    sb.append(a);
685    return result.concat();                         // not applied, sb must not be used after sb.toString() appended
686}
687
688//! CHECKER       AOT IR Builder, check String Builders merging (chain_concat19 only, with --compiler-inlining=true)
689//! SKIP_IF       @architecture == "arm32"
690//! RUN_PAOC      options: "--compiler-regex='.*chain_concat19' --compiler-inlining=true"
691
692function chain_concat19(): void {
693    const _ = "_";
694    const a = "a";
695    const b = "b";
696    const c = "c";
697
698    let sb_a = new StringBuilder();
699    sb_a.append(_)
700    sb_a.append(a)
701    let _a = sb_a.toString()
702
703    let sb_ab = new StringBuilder();
704    sb_ab.append(_a)
705    sb_ab.append(b)
706    let _ab = sb_ab.toString()
707
708    let sb_abc = new StringBuilder();
709    sb_abc.append(_ab)
710    sb_abc.append(c)
711    let _abc = sb_abc.toString()
712
713    assertEQ(_a, "_a");
714    assertEQ(_ab, "_ab");
715    assertEQ(_abc, "_abc");
716}
717
718function main() {
719    assertEQ(chain_concat0("a", 4, "b", 3), "_aaaa_bbb_", "Wrong result at chain_concat0");
720    assertEQ(chain_concat1("a", 4, "b", 3, "c", 5), "_aaaa_bbb_ccccc_", "Wrong result at chain_concat1");
721    assertEQ(chain_concat2("a", 4, "b", 3, "c", 5, "d", 2), "_aaaa_bbb_ccccc_dd_", "Wrong result at chain_concat2");
722    assertEQ(chain_concat3("a", 4, "b", 3, "c", 5, "d", 2), "_aaaa_bbb_aaaa_bbb_ccccc_dd_", "Wrong result at chain_concat3");
723
724    assertEQ(supported_chain_concat5(), "012 012", "Wrong result at supported_chain_concat5");
725    assertEQ(supported_chain_concat6(), " abcΣΨΩ0123456789 true false A 57 127 32767 128934675 701234987654321 string [object Object] 1 1 1  abcΣΨΩ0123456789 true false A 57 127 32767 128934675 701234987654321 string [object Object] 1 1 1 ", "Wrong result at supported_chain_concat6");
726
727    assertEQ(unsupported_append_chain_concat7(), "0 0", "Wrong result at unsupported_append_chain_concat7");
728    assertEQ(unsupported_constructor_chain_concat8(), "00", "Wrong result at unsupported_constructor_chain_concat8");
729    assertEQ(unsupported_usage_chain_concat9(), "0", "Wrong result at unsupported_usage_chain_concat9");
730
731    assertEQ(unsupported_chain_concat10(false), "210 012", "Wrong result at unsupported_chain_concat10(false)");
732    assertEQ(unsupported_chain_concat10(true), "012 012", "Wrong result at unsupported_chain_concat10(true)");
733
734    assertEQ(unsupported_chain_concat11(false), "0 2", "Wrong result at unsupported_chain_concat11(false)");
735    assertEQ(unsupported_chain_concat11(true), "1 2", "Wrong result at unsupported_chain_concat11(true)");
736
737    assertEQ(unsupported_chain_concat12(false), "0 1", "Wrong result at unsupported_chain_concat12(false)");
738    assertEQ(unsupported_chain_concat12(true), "0 1", "Wrong result at unsupported_chain_concat12(true)");
739
740    assertEQ(unsupported_chain_concat13(), "0 1", "Wrong result at unsupported_chain_concat13()");
741
742    assertEQ(partially_supported_chain_concat14("ab", "c", "d", "e"), "abcde", "Wrong result at partially_supported_chain_concat14");
743    assertEQ(supported_chain_concat15("ab", "c", "d", "e"), "abcde", "Wrong result at supported_chain_concat15");
744    assertEQ(partially_supported_chain_concat16("ab", "c", "d", "e"), "abcde", "Wrong result at partially_supported_chain_concat16");
745    assertEQ(unsupported_usage_chain_concat17("abc"), "abc", "Wrong result at unsupported_usage_chain_concat17");
746    assertEQ(unsupported_usage_chain_concat18("abc"), "abc", "Wrong result at unsupported_usage_chain_concat18");
747
748    chain_concat19();
749}
750
751//! CHECKER       Unsupported concat pattern AOT (IBLDF4/22718)
752//! SKIP_IF       @architecture == "arm32"
753//! RUN_PAOC      options: "--compiler-regex='.*bugfix_chain_concat20' --compiler-inlining=true"
754
755//! CHECKER       Unsupported concat pattern JIT (IBLDF4/22718)
756//! SKIP_IF       @architecture == "arm32"
757//! RUN           force_jit: true, entry: "ets_string_builder_merge.ETSGLOBAL::bugfix_chain_concat20"
758
759function bugfix_chain_concat20(): void
760{
761    let a = "a";
762    let b = "b";
763    let abc = a + b + "c";
764    let abcd = abc + "d";
765    let abce = abc + "e";
766
767    assertEQ(abc, "abc");
768    assertEQ(abcd, "abcd");
769    assertEQ(abce, "abce");
770}
771