xref: /aosp_15_r20/art/test/697-checker-string-append/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright 2019 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class Main {
main(String[] args)18*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) {
19*795d594fSAndroid Build Coastguard Worker         testAppendStringAndLong();
20*795d594fSAndroid Build Coastguard Worker         testAppendStringAndInt();
21*795d594fSAndroid Build Coastguard Worker         testAppendStringAndFloat();
22*795d594fSAndroid Build Coastguard Worker         testAppendStringAndDouble();
23*795d594fSAndroid Build Coastguard Worker         testAppendDoubleAndFloat();
24*795d594fSAndroid Build Coastguard Worker         testAppendStringAndString();
25*795d594fSAndroid Build Coastguard Worker         testMiscelaneous();
26*795d594fSAndroid Build Coastguard Worker         testNoArgs();
27*795d594fSAndroid Build Coastguard Worker         testInline();
28*795d594fSAndroid Build Coastguard Worker         testEquals();
29*795d594fSAndroid Build Coastguard Worker         System.out.println("passed");
30*795d594fSAndroid Build Coastguard Worker     }
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker     private static final String APPEND_LONG_PREFIX = "Long/";
33*795d594fSAndroid Build Coastguard Worker     private static final String[] APPEND_LONG_TEST_CASES = {
34*795d594fSAndroid Build Coastguard Worker         "Long/0",
35*795d594fSAndroid Build Coastguard Worker         "Long/1",
36*795d594fSAndroid Build Coastguard Worker         "Long/9",
37*795d594fSAndroid Build Coastguard Worker         "Long/10",
38*795d594fSAndroid Build Coastguard Worker         "Long/99",
39*795d594fSAndroid Build Coastguard Worker         "Long/100",
40*795d594fSAndroid Build Coastguard Worker         "Long/999",
41*795d594fSAndroid Build Coastguard Worker         "Long/1000",
42*795d594fSAndroid Build Coastguard Worker         "Long/9999",
43*795d594fSAndroid Build Coastguard Worker         "Long/10000",
44*795d594fSAndroid Build Coastguard Worker         "Long/99999",
45*795d594fSAndroid Build Coastguard Worker         "Long/100000",
46*795d594fSAndroid Build Coastguard Worker         "Long/999999",
47*795d594fSAndroid Build Coastguard Worker         "Long/1000000",
48*795d594fSAndroid Build Coastguard Worker         "Long/9999999",
49*795d594fSAndroid Build Coastguard Worker         "Long/10000000",
50*795d594fSAndroid Build Coastguard Worker         "Long/99999999",
51*795d594fSAndroid Build Coastguard Worker         "Long/100000000",
52*795d594fSAndroid Build Coastguard Worker         "Long/999999999",
53*795d594fSAndroid Build Coastguard Worker         "Long/1000000000",
54*795d594fSAndroid Build Coastguard Worker         "Long/9999999999",
55*795d594fSAndroid Build Coastguard Worker         "Long/10000000000",
56*795d594fSAndroid Build Coastguard Worker         "Long/99999999999",
57*795d594fSAndroid Build Coastguard Worker         "Long/100000000000",
58*795d594fSAndroid Build Coastguard Worker         "Long/999999999999",
59*795d594fSAndroid Build Coastguard Worker         "Long/1000000000000",
60*795d594fSAndroid Build Coastguard Worker         "Long/9999999999999",
61*795d594fSAndroid Build Coastguard Worker         "Long/10000000000000",
62*795d594fSAndroid Build Coastguard Worker         "Long/99999999999999",
63*795d594fSAndroid Build Coastguard Worker         "Long/100000000000000",
64*795d594fSAndroid Build Coastguard Worker         "Long/999999999999999",
65*795d594fSAndroid Build Coastguard Worker         "Long/1000000000000000",
66*795d594fSAndroid Build Coastguard Worker         "Long/9999999999999999",
67*795d594fSAndroid Build Coastguard Worker         "Long/10000000000000000",
68*795d594fSAndroid Build Coastguard Worker         "Long/99999999999999999",
69*795d594fSAndroid Build Coastguard Worker         "Long/100000000000000000",
70*795d594fSAndroid Build Coastguard Worker         "Long/999999999999999999",
71*795d594fSAndroid Build Coastguard Worker         "Long/1000000000000000000",
72*795d594fSAndroid Build Coastguard Worker         "Long/9223372036854775807",  // Long.MAX_VALUE
73*795d594fSAndroid Build Coastguard Worker         "Long/-1",
74*795d594fSAndroid Build Coastguard Worker         "Long/-9",
75*795d594fSAndroid Build Coastguard Worker         "Long/-10",
76*795d594fSAndroid Build Coastguard Worker         "Long/-99",
77*795d594fSAndroid Build Coastguard Worker         "Long/-100",
78*795d594fSAndroid Build Coastguard Worker         "Long/-999",
79*795d594fSAndroid Build Coastguard Worker         "Long/-1000",
80*795d594fSAndroid Build Coastguard Worker         "Long/-9999",
81*795d594fSAndroid Build Coastguard Worker         "Long/-10000",
82*795d594fSAndroid Build Coastguard Worker         "Long/-99999",
83*795d594fSAndroid Build Coastguard Worker         "Long/-100000",
84*795d594fSAndroid Build Coastguard Worker         "Long/-999999",
85*795d594fSAndroid Build Coastguard Worker         "Long/-1000000",
86*795d594fSAndroid Build Coastguard Worker         "Long/-9999999",
87*795d594fSAndroid Build Coastguard Worker         "Long/-10000000",
88*795d594fSAndroid Build Coastguard Worker         "Long/-99999999",
89*795d594fSAndroid Build Coastguard Worker         "Long/-100000000",
90*795d594fSAndroid Build Coastguard Worker         "Long/-999999999",
91*795d594fSAndroid Build Coastguard Worker         "Long/-1000000000",
92*795d594fSAndroid Build Coastguard Worker         "Long/-9999999999",
93*795d594fSAndroid Build Coastguard Worker         "Long/-10000000000",
94*795d594fSAndroid Build Coastguard Worker         "Long/-99999999999",
95*795d594fSAndroid Build Coastguard Worker         "Long/-100000000000",
96*795d594fSAndroid Build Coastguard Worker         "Long/-999999999999",
97*795d594fSAndroid Build Coastguard Worker         "Long/-1000000000000",
98*795d594fSAndroid Build Coastguard Worker         "Long/-9999999999999",
99*795d594fSAndroid Build Coastguard Worker         "Long/-10000000000000",
100*795d594fSAndroid Build Coastguard Worker         "Long/-99999999999999",
101*795d594fSAndroid Build Coastguard Worker         "Long/-100000000000000",
102*795d594fSAndroid Build Coastguard Worker         "Long/-999999999999999",
103*795d594fSAndroid Build Coastguard Worker         "Long/-1000000000000000",
104*795d594fSAndroid Build Coastguard Worker         "Long/-9999999999999999",
105*795d594fSAndroid Build Coastguard Worker         "Long/-10000000000000000",
106*795d594fSAndroid Build Coastguard Worker         "Long/-99999999999999999",
107*795d594fSAndroid Build Coastguard Worker         "Long/-100000000000000000",
108*795d594fSAndroid Build Coastguard Worker         "Long/-999999999999999999",
109*795d594fSAndroid Build Coastguard Worker         "Long/-1000000000000000000",
110*795d594fSAndroid Build Coastguard Worker         "Long/-9223372036854775808",  // Long.MIN_VALUE
111*795d594fSAndroid Build Coastguard Worker     };
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndLong(java.lang.String, long) instruction_simplifier (before)
114*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndLong(java.lang.String, long) instruction_simplifier (after)
117*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendStringAndLong(String s, long l)118*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendStringAndLong(String s, long l) {
119*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s).append(l).toString();
120*795d594fSAndroid Build Coastguard Worker     }
121*795d594fSAndroid Build Coastguard Worker 
testAppendStringAndLong()122*795d594fSAndroid Build Coastguard Worker     public static void testAppendStringAndLong() {
123*795d594fSAndroid Build Coastguard Worker         for (String expected : APPEND_LONG_TEST_CASES) {
124*795d594fSAndroid Build Coastguard Worker             long l = Long.valueOf(expected.substring(APPEND_LONG_PREFIX.length()));
125*795d594fSAndroid Build Coastguard Worker             String result = $noinline$appendStringAndLong(APPEND_LONG_PREFIX, l);
126*795d594fSAndroid Build Coastguard Worker             assertEquals(expected, result);
127*795d594fSAndroid Build Coastguard Worker         }
128*795d594fSAndroid Build Coastguard Worker     }
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker     private static final String APPEND_INT_PREFIX = "Int/";
131*795d594fSAndroid Build Coastguard Worker     private static final String[] APPEND_INT_TEST_CASES = {
132*795d594fSAndroid Build Coastguard Worker         "Int/0",
133*795d594fSAndroid Build Coastguard Worker         "Int/1",
134*795d594fSAndroid Build Coastguard Worker         "Int/9",
135*795d594fSAndroid Build Coastguard Worker         "Int/10",
136*795d594fSAndroid Build Coastguard Worker         "Int/99",
137*795d594fSAndroid Build Coastguard Worker         "Int/100",
138*795d594fSAndroid Build Coastguard Worker         "Int/999",
139*795d594fSAndroid Build Coastguard Worker         "Int/1000",
140*795d594fSAndroid Build Coastguard Worker         "Int/9999",
141*795d594fSAndroid Build Coastguard Worker         "Int/10000",
142*795d594fSAndroid Build Coastguard Worker         "Int/99999",
143*795d594fSAndroid Build Coastguard Worker         "Int/100000",
144*795d594fSAndroid Build Coastguard Worker         "Int/999999",
145*795d594fSAndroid Build Coastguard Worker         "Int/1000000",
146*795d594fSAndroid Build Coastguard Worker         "Int/9999999",
147*795d594fSAndroid Build Coastguard Worker         "Int/10000000",
148*795d594fSAndroid Build Coastguard Worker         "Int/99999999",
149*795d594fSAndroid Build Coastguard Worker         "Int/100000000",
150*795d594fSAndroid Build Coastguard Worker         "Int/999999999",
151*795d594fSAndroid Build Coastguard Worker         "Int/1000000000",
152*795d594fSAndroid Build Coastguard Worker         "Int/2147483647",  // Integer.MAX_VALUE
153*795d594fSAndroid Build Coastguard Worker         "Int/-1",
154*795d594fSAndroid Build Coastguard Worker         "Int/-9",
155*795d594fSAndroid Build Coastguard Worker         "Int/-10",
156*795d594fSAndroid Build Coastguard Worker         "Int/-99",
157*795d594fSAndroid Build Coastguard Worker         "Int/-100",
158*795d594fSAndroid Build Coastguard Worker         "Int/-999",
159*795d594fSAndroid Build Coastguard Worker         "Int/-1000",
160*795d594fSAndroid Build Coastguard Worker         "Int/-9999",
161*795d594fSAndroid Build Coastguard Worker         "Int/-10000",
162*795d594fSAndroid Build Coastguard Worker         "Int/-99999",
163*795d594fSAndroid Build Coastguard Worker         "Int/-100000",
164*795d594fSAndroid Build Coastguard Worker         "Int/-999999",
165*795d594fSAndroid Build Coastguard Worker         "Int/-1000000",
166*795d594fSAndroid Build Coastguard Worker         "Int/-9999999",
167*795d594fSAndroid Build Coastguard Worker         "Int/-10000000",
168*795d594fSAndroid Build Coastguard Worker         "Int/-99999999",
169*795d594fSAndroid Build Coastguard Worker         "Int/-100000000",
170*795d594fSAndroid Build Coastguard Worker         "Int/-999999999",
171*795d594fSAndroid Build Coastguard Worker         "Int/-1000000000",
172*795d594fSAndroid Build Coastguard Worker         "Int/-2147483648",  // Integer.MIN_VALUE
173*795d594fSAndroid Build Coastguard Worker     };
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndInt(java.lang.String, int) instruction_simplifier (before)
176*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
177*795d594fSAndroid Build Coastguard Worker 
178*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndInt(java.lang.String, int) instruction_simplifier (after)
179*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendStringAndInt(String s, int i)180*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendStringAndInt(String s, int i) {
181*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s).append(i).toString();
182*795d594fSAndroid Build Coastguard Worker     }
183*795d594fSAndroid Build Coastguard Worker 
testAppendStringAndInt()184*795d594fSAndroid Build Coastguard Worker     public static void testAppendStringAndInt() {
185*795d594fSAndroid Build Coastguard Worker         for (String expected : APPEND_INT_TEST_CASES) {
186*795d594fSAndroid Build Coastguard Worker             int i = Integer.valueOf(expected.substring(APPEND_INT_PREFIX.length()));
187*795d594fSAndroid Build Coastguard Worker             String result = $noinline$appendStringAndInt(APPEND_INT_PREFIX, i);
188*795d594fSAndroid Build Coastguard Worker             assertEquals(expected, result);
189*795d594fSAndroid Build Coastguard Worker         }
190*795d594fSAndroid Build Coastguard Worker     }
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker     private static final String APPEND_FLOAT_PREFIX = "Float/";
193*795d594fSAndroid Build Coastguard Worker     private static final String[] APPEND_FLOAT_TEST_CASES = {
194*795d594fSAndroid Build Coastguard Worker         // We're testing only exact values here, i.e. values that do not require rounding.
195*795d594fSAndroid Build Coastguard Worker         "Float/1.0",
196*795d594fSAndroid Build Coastguard Worker         "Float/9.0",
197*795d594fSAndroid Build Coastguard Worker         "Float/10.0",
198*795d594fSAndroid Build Coastguard Worker         "Float/99.0",
199*795d594fSAndroid Build Coastguard Worker         "Float/100.0",
200*795d594fSAndroid Build Coastguard Worker         "Float/999.0",
201*795d594fSAndroid Build Coastguard Worker         "Float/1000.0",
202*795d594fSAndroid Build Coastguard Worker         "Float/9999.0",
203*795d594fSAndroid Build Coastguard Worker         "Float/10000.0",
204*795d594fSAndroid Build Coastguard Worker         "Float/99999.0",
205*795d594fSAndroid Build Coastguard Worker         "Float/100000.0",
206*795d594fSAndroid Build Coastguard Worker         "Float/999999.0",
207*795d594fSAndroid Build Coastguard Worker         "Float/1000000.0",
208*795d594fSAndroid Build Coastguard Worker         "Float/9999999.0",
209*795d594fSAndroid Build Coastguard Worker         "Float/1.0E7",
210*795d594fSAndroid Build Coastguard Worker         "Float/1.0E10",
211*795d594fSAndroid Build Coastguard Worker         "Float/-1.0",
212*795d594fSAndroid Build Coastguard Worker         "Float/-9.0",
213*795d594fSAndroid Build Coastguard Worker         "Float/-10.0",
214*795d594fSAndroid Build Coastguard Worker         "Float/-99.0",
215*795d594fSAndroid Build Coastguard Worker         "Float/-100.0",
216*795d594fSAndroid Build Coastguard Worker         "Float/-999.0",
217*795d594fSAndroid Build Coastguard Worker         "Float/-1000.0",
218*795d594fSAndroid Build Coastguard Worker         "Float/-9999.0",
219*795d594fSAndroid Build Coastguard Worker         "Float/-10000.0",
220*795d594fSAndroid Build Coastguard Worker         "Float/-99999.0",
221*795d594fSAndroid Build Coastguard Worker         "Float/-100000.0",
222*795d594fSAndroid Build Coastguard Worker         "Float/-999999.0",
223*795d594fSAndroid Build Coastguard Worker         "Float/-1000000.0",
224*795d594fSAndroid Build Coastguard Worker         "Float/-9999999.0",
225*795d594fSAndroid Build Coastguard Worker         "Float/-1.0E7",
226*795d594fSAndroid Build Coastguard Worker         "Float/-1.0E10",
227*795d594fSAndroid Build Coastguard Worker         "Float/0.25",
228*795d594fSAndroid Build Coastguard Worker         "Float/1.625",
229*795d594fSAndroid Build Coastguard Worker         "Float/9.3125",
230*795d594fSAndroid Build Coastguard Worker         "Float/-0.25",
231*795d594fSAndroid Build Coastguard Worker         "Float/-1.625",
232*795d594fSAndroid Build Coastguard Worker         "Float/-9.3125",
233*795d594fSAndroid Build Coastguard Worker     };
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndFloat(java.lang.String, float) instruction_simplifier (before)
236*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
237*795d594fSAndroid Build Coastguard Worker 
238*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndFloat(java.lang.String, float) instruction_simplifier (after)
239*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendStringAndFloat(String s, float f)240*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendStringAndFloat(String s, float f) {
241*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s).append(f).toString();
242*795d594fSAndroid Build Coastguard Worker     }
243*795d594fSAndroid Build Coastguard Worker 
testAppendStringAndFloat()244*795d594fSAndroid Build Coastguard Worker     public static void testAppendStringAndFloat() {
245*795d594fSAndroid Build Coastguard Worker         for (String expected : APPEND_FLOAT_TEST_CASES) {
246*795d594fSAndroid Build Coastguard Worker             float f = Float.valueOf(expected.substring(APPEND_FLOAT_PREFIX.length()));
247*795d594fSAndroid Build Coastguard Worker             String result = $noinline$appendStringAndFloat(APPEND_FLOAT_PREFIX, f);
248*795d594fSAndroid Build Coastguard Worker             assertEquals(expected, result);
249*795d594fSAndroid Build Coastguard Worker         }
250*795d594fSAndroid Build Coastguard Worker         // Special values.
251*795d594fSAndroid Build Coastguard Worker         assertEquals("Float/NaN", $noinline$appendStringAndFloat(APPEND_FLOAT_PREFIX, Float.NaN));
252*795d594fSAndroid Build Coastguard Worker         assertEquals("Float/Infinity",
253*795d594fSAndroid Build Coastguard Worker                      $noinline$appendStringAndFloat(APPEND_FLOAT_PREFIX, Float.POSITIVE_INFINITY));
254*795d594fSAndroid Build Coastguard Worker         assertEquals("Float/-Infinity",
255*795d594fSAndroid Build Coastguard Worker                      $noinline$appendStringAndFloat(APPEND_FLOAT_PREFIX, Float.NEGATIVE_INFINITY));
256*795d594fSAndroid Build Coastguard Worker     }
257*795d594fSAndroid Build Coastguard Worker 
258*795d594fSAndroid Build Coastguard Worker     private static final String APPEND_DOUBLE_PREFIX = "Double/";
259*795d594fSAndroid Build Coastguard Worker     private static final String[] APPEND_DOUBLE_TEST_CASES = {
260*795d594fSAndroid Build Coastguard Worker         // We're testing only exact values here, i.e. values that do not require rounding.
261*795d594fSAndroid Build Coastguard Worker         "Double/1.0",
262*795d594fSAndroid Build Coastguard Worker         "Double/9.0",
263*795d594fSAndroid Build Coastguard Worker         "Double/10.0",
264*795d594fSAndroid Build Coastguard Worker         "Double/99.0",
265*795d594fSAndroid Build Coastguard Worker         "Double/100.0",
266*795d594fSAndroid Build Coastguard Worker         "Double/999.0",
267*795d594fSAndroid Build Coastguard Worker         "Double/1000.0",
268*795d594fSAndroid Build Coastguard Worker         "Double/9999.0",
269*795d594fSAndroid Build Coastguard Worker         "Double/10000.0",
270*795d594fSAndroid Build Coastguard Worker         "Double/99999.0",
271*795d594fSAndroid Build Coastguard Worker         "Double/100000.0",
272*795d594fSAndroid Build Coastguard Worker         "Double/999999.0",
273*795d594fSAndroid Build Coastguard Worker         "Double/1000000.0",
274*795d594fSAndroid Build Coastguard Worker         "Double/9999999.0",
275*795d594fSAndroid Build Coastguard Worker         "Double/1.0E7",
276*795d594fSAndroid Build Coastguard Worker         "Double/1.0E24",
277*795d594fSAndroid Build Coastguard Worker         "Double/-1.0",
278*795d594fSAndroid Build Coastguard Worker         "Double/-9.0",
279*795d594fSAndroid Build Coastguard Worker         "Double/-10.0",
280*795d594fSAndroid Build Coastguard Worker         "Double/-99.0",
281*795d594fSAndroid Build Coastguard Worker         "Double/-100.0",
282*795d594fSAndroid Build Coastguard Worker         "Double/-999.0",
283*795d594fSAndroid Build Coastguard Worker         "Double/-1000.0",
284*795d594fSAndroid Build Coastguard Worker         "Double/-9999.0",
285*795d594fSAndroid Build Coastguard Worker         "Double/-10000.0",
286*795d594fSAndroid Build Coastguard Worker         "Double/-99999.0",
287*795d594fSAndroid Build Coastguard Worker         "Double/-100000.0",
288*795d594fSAndroid Build Coastguard Worker         "Double/-999999.0",
289*795d594fSAndroid Build Coastguard Worker         "Double/-1000000.0",
290*795d594fSAndroid Build Coastguard Worker         "Double/-9999999.0",
291*795d594fSAndroid Build Coastguard Worker         "Double/-1.0E7",
292*795d594fSAndroid Build Coastguard Worker         "Double/-1.0E24",
293*795d594fSAndroid Build Coastguard Worker         "Double/0.25",
294*795d594fSAndroid Build Coastguard Worker         "Double/1.625",
295*795d594fSAndroid Build Coastguard Worker         "Double/9.3125",
296*795d594fSAndroid Build Coastguard Worker         "Double/-0.25",
297*795d594fSAndroid Build Coastguard Worker         "Double/-1.625",
298*795d594fSAndroid Build Coastguard Worker         "Double/-9.3125",
299*795d594fSAndroid Build Coastguard Worker     };
300*795d594fSAndroid Build Coastguard Worker 
301*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndDouble(java.lang.String, double) instruction_simplifier (before)
302*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
303*795d594fSAndroid Build Coastguard Worker 
304*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendStringAndDouble(java.lang.String, double) instruction_simplifier (after)
305*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendStringAndDouble(String s, double d)306*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendStringAndDouble(String s, double d) {
307*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s).append(d).toString();
308*795d594fSAndroid Build Coastguard Worker     }
309*795d594fSAndroid Build Coastguard Worker 
testAppendStringAndDouble()310*795d594fSAndroid Build Coastguard Worker     public static void testAppendStringAndDouble() {
311*795d594fSAndroid Build Coastguard Worker         for (String expected : APPEND_DOUBLE_TEST_CASES) {
312*795d594fSAndroid Build Coastguard Worker             double f = Double.valueOf(expected.substring(APPEND_DOUBLE_PREFIX.length()));
313*795d594fSAndroid Build Coastguard Worker             String result = $noinline$appendStringAndDouble(APPEND_DOUBLE_PREFIX, f);
314*795d594fSAndroid Build Coastguard Worker             assertEquals(expected, result);
315*795d594fSAndroid Build Coastguard Worker         }
316*795d594fSAndroid Build Coastguard Worker         // Special values.
317*795d594fSAndroid Build Coastguard Worker         assertEquals(
318*795d594fSAndroid Build Coastguard Worker             "Double/NaN",
319*795d594fSAndroid Build Coastguard Worker             $noinline$appendStringAndDouble(APPEND_DOUBLE_PREFIX, Double.NaN));
320*795d594fSAndroid Build Coastguard Worker         assertEquals(
321*795d594fSAndroid Build Coastguard Worker             "Double/Infinity",
322*795d594fSAndroid Build Coastguard Worker             $noinline$appendStringAndDouble(APPEND_DOUBLE_PREFIX, Double.POSITIVE_INFINITY));
323*795d594fSAndroid Build Coastguard Worker         assertEquals(
324*795d594fSAndroid Build Coastguard Worker             "Double/-Infinity",
325*795d594fSAndroid Build Coastguard Worker             $noinline$appendStringAndDouble(APPEND_DOUBLE_PREFIX, Double.NEGATIVE_INFINITY));
326*795d594fSAndroid Build Coastguard Worker     }
327*795d594fSAndroid Build Coastguard Worker 
328*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendDoubleAndFloat(double, float) instruction_simplifier (before)
329*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendDoubleAndFloat(double, float) instruction_simplifier (after)
332*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendDoubleAndFloat(double d, float f)333*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendDoubleAndFloat(double d, float f) {
334*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(d).append(f).toString();
335*795d594fSAndroid Build Coastguard Worker     }
336*795d594fSAndroid Build Coastguard Worker 
testAppendDoubleAndFloat()337*795d594fSAndroid Build Coastguard Worker     public static void testAppendDoubleAndFloat() {
338*795d594fSAndroid Build Coastguard Worker         assertEquals("1.50.325", $noinline$appendDoubleAndFloat(1.5, 0.325f));
339*795d594fSAndroid Build Coastguard Worker         assertEquals("1.5E170.3125", $noinline$appendDoubleAndFloat(1.5E17, 0.3125f));
340*795d594fSAndroid Build Coastguard Worker         assertEquals("1.0E8NaN", $noinline$appendDoubleAndFloat(1.0E8, Float.NaN));
341*795d594fSAndroid Build Coastguard Worker         assertEquals("Infinity0.5", $noinline$appendDoubleAndFloat(Double.POSITIVE_INFINITY, 0.5f));
342*795d594fSAndroid Build Coastguard Worker         assertEquals("2.5-Infinity", $noinline$appendDoubleAndFloat(2.5, Float.NEGATIVE_INFINITY));
343*795d594fSAndroid Build Coastguard Worker     }
344*795d594fSAndroid Build Coastguard Worker 
$noinline$appendStringAndString(String s1, String s2)345*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendStringAndString(String s1, String s2) {
346*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s1).append(s2).toString();
347*795d594fSAndroid Build Coastguard Worker     }
348*795d594fSAndroid Build Coastguard Worker 
testAppendStringAndString()349*795d594fSAndroid Build Coastguard Worker     public static void testAppendStringAndString() {
350*795d594fSAndroid Build Coastguard Worker         assertEquals("nullnull", $noinline$appendStringAndString(null, null));
351*795d594fSAndroid Build Coastguard Worker         assertEquals("nullTEST", $noinline$appendStringAndString(null, "TEST"));
352*795d594fSAndroid Build Coastguard Worker         assertEquals("TESTnull", $noinline$appendStringAndString("TEST", null));
353*795d594fSAndroid Build Coastguard Worker         assertEquals("abcDEFGH", $noinline$appendStringAndString("abc", "DEFGH"));
354*795d594fSAndroid Build Coastguard Worker         // Test with a non-ASCII character.
355*795d594fSAndroid Build Coastguard Worker         assertEquals("test\u0131", $noinline$appendStringAndString("test", "\u0131"));
356*795d594fSAndroid Build Coastguard Worker         assertEquals("\u0131test", $noinline$appendStringAndString("\u0131", "test"));
357*795d594fSAndroid Build Coastguard Worker         assertEquals("\u0131test\u0131", $noinline$appendStringAndString("\u0131", "test\u0131"));
358*795d594fSAndroid Build Coastguard Worker     }
359*795d594fSAndroid Build Coastguard Worker 
360*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendSLILC(java.lang.String, long, int, long, char) instruction_simplifier (before)
361*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
362*795d594fSAndroid Build Coastguard Worker 
363*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendSLILC(java.lang.String, long, int, long, char) instruction_simplifier (after)
364*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$appendSLILC(String s, long l1, int i, long l2, char c)365*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendSLILC(String s,
366*795d594fSAndroid Build Coastguard Worker                                                long l1,
367*795d594fSAndroid Build Coastguard Worker                                                int i,
368*795d594fSAndroid Build Coastguard Worker                                                long l2,
369*795d594fSAndroid Build Coastguard Worker                                                char c) {
370*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().append(s)
371*795d594fSAndroid Build Coastguard Worker                                   .append(l1)
372*795d594fSAndroid Build Coastguard Worker                                   .append(i)
373*795d594fSAndroid Build Coastguard Worker                                   .append(l2)
374*795d594fSAndroid Build Coastguard Worker                                   .append(c).toString();
375*795d594fSAndroid Build Coastguard Worker     }
376*795d594fSAndroid Build Coastguard Worker 
testMiscelaneous()377*795d594fSAndroid Build Coastguard Worker     public static void testMiscelaneous() {
378*795d594fSAndroid Build Coastguard Worker         assertEquals("x17-1q",
379*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x", 1L, 7, -1L, 'q'));
380*795d594fSAndroid Build Coastguard Worker         assertEquals("null17-1q",
381*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC(null, 1L, 7, -1L, 'q'));
382*795d594fSAndroid Build Coastguard Worker         assertEquals("x\u013117-1q",
383*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x\u0131", 1L, 7, -1L, 'q'));
384*795d594fSAndroid Build Coastguard Worker         assertEquals("x427-1q",
385*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x", 42L, 7, -1L, 'q'));
386*795d594fSAndroid Build Coastguard Worker         assertEquals("x1-42-1q",
387*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x", 1L, -42, -1L, 'q'));
388*795d594fSAndroid Build Coastguard Worker         assertEquals("x17424242q",
389*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x", 1L, 7, 424242L, 'q'));
390*795d594fSAndroid Build Coastguard Worker         assertEquals("x17-1\u0131",
391*795d594fSAndroid Build Coastguard Worker                      $noinline$appendSLILC("x", 1L, 7, -1L, '\u0131'));
392*795d594fSAndroid Build Coastguard Worker     }
393*795d594fSAndroid Build Coastguard Worker 
$inline$testInlineInner(StringBuilder sb, String s, int i)394*795d594fSAndroid Build Coastguard Worker     public static String $inline$testInlineInner(StringBuilder sb, String s, int i) {
395*795d594fSAndroid Build Coastguard Worker         return sb.append(s).append(i).toString();
396*795d594fSAndroid Build Coastguard Worker     }
397*795d594fSAndroid Build Coastguard Worker 
398*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$testInlineOuter(java.lang.String, int) instruction_simplifier$after_inlining (before)
399*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
400*795d594fSAndroid Build Coastguard Worker 
401*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$testInlineOuter(java.lang.String, int) instruction_simplifier$after_inlining (after)
402*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$testInlineOuter(String s, int i)403*795d594fSAndroid Build Coastguard Worker     public static String $noinline$testInlineOuter(String s, int i) {
404*795d594fSAndroid Build Coastguard Worker         StringBuilder sb = new StringBuilder();
405*795d594fSAndroid Build Coastguard Worker         return $inline$testInlineInner(sb, s, i);
406*795d594fSAndroid Build Coastguard Worker     }
407*795d594fSAndroid Build Coastguard Worker 
testInline()408*795d594fSAndroid Build Coastguard Worker     public static void testInline() {
409*795d594fSAndroid Build Coastguard Worker         assertEquals("x42", $noinline$testInlineOuter("x", 42));
410*795d594fSAndroid Build Coastguard Worker     }
411*795d594fSAndroid Build Coastguard Worker 
412*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendNothing() instruction_simplifier (before)
413*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
414*795d594fSAndroid Build Coastguard Worker 
415*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: java.lang.String Main.$noinline$appendNothing() instruction_simplifier (after)
416*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
$noinline$appendNothing()417*795d594fSAndroid Build Coastguard Worker     public static String $noinline$appendNothing() {
418*795d594fSAndroid Build Coastguard Worker         return new StringBuilder().toString();
419*795d594fSAndroid Build Coastguard Worker     }
420*795d594fSAndroid Build Coastguard Worker 
testNoArgs()421*795d594fSAndroid Build Coastguard Worker     public static void testNoArgs() {
422*795d594fSAndroid Build Coastguard Worker         assertEquals("", $noinline$appendNothing());
423*795d594fSAndroid Build Coastguard Worker     }
424*795d594fSAndroid Build Coastguard Worker 
425*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: boolean Main.$noinline$testAppendEquals(java.lang.String, int) instruction_simplifier (before)
426*795d594fSAndroid Build Coastguard Worker     /// CHECK-NOT:              StringBuilderAppend
427*795d594fSAndroid Build Coastguard Worker 
428*795d594fSAndroid Build Coastguard Worker     /// CHECK-START: boolean Main.$noinline$testAppendEquals(java.lang.String, int) instruction_simplifier (after)
429*795d594fSAndroid Build Coastguard Worker     /// CHECK:                  StringBuilderAppend
$noinline$testAppendEquals(String s, int i)430*795d594fSAndroid Build Coastguard Worker     public static boolean $noinline$testAppendEquals(String s, int i) {
431*795d594fSAndroid Build Coastguard Worker       // Regression test for b/151107293 .
432*795d594fSAndroid Build Coastguard Worker       // When a string is used as both receiver and argument of String.equals(), we DCHECK()
433*795d594fSAndroid Build Coastguard Worker       // that it cannot be null. However, when replacing the call to StringBuilder.toString()
434*795d594fSAndroid Build Coastguard Worker       // with the HStringBuilderAppend(), the former reported CanBeNull() as false and
435*795d594fSAndroid Build Coastguard Worker       // therefore no explicit null checks were needed, but the replacement reported
436*795d594fSAndroid Build Coastguard Worker       // CanBeNull() as true, so when the result was used in String.equals() for both
437*795d594fSAndroid Build Coastguard Worker       // receiver and argument, the DCHECK() failed. This was fixed by overriding
438*795d594fSAndroid Build Coastguard Worker       // CanBeNull() in HStringBuilderAppend to correctly return false; the string that
439*795d594fSAndroid Build Coastguard Worker       // previously didn't require null check still does not require it.
440*795d594fSAndroid Build Coastguard Worker       String str = new StringBuilder().append(s).append(i).toString();
441*795d594fSAndroid Build Coastguard Worker       return str.equals(str);
442*795d594fSAndroid Build Coastguard Worker     }
443*795d594fSAndroid Build Coastguard Worker 
testEquals()444*795d594fSAndroid Build Coastguard Worker     public static void testEquals() {
445*795d594fSAndroid Build Coastguard Worker       if (!$noinline$testAppendEquals("Test", 42)) {
446*795d594fSAndroid Build Coastguard Worker         throw new Error("str.equals(str) is false");
447*795d594fSAndroid Build Coastguard Worker       }
448*795d594fSAndroid Build Coastguard Worker     }
449*795d594fSAndroid Build Coastguard Worker 
assertEquals(String expected, String actual)450*795d594fSAndroid Build Coastguard Worker     public static void assertEquals(String expected, String actual) {
451*795d594fSAndroid Build Coastguard Worker         if (!expected.equals(actual)) {
452*795d594fSAndroid Build Coastguard Worker             throw new AssertionError("Expected: " + expected + ", actual: " + actual);
453*795d594fSAndroid Build Coastguard Worker         }
454*795d594fSAndroid Build Coastguard Worker     }
455*795d594fSAndroid Build Coastguard Worker }
456