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