1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2016 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker.class public LTestCase; 16*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 17*795d594fSAndroid Build Coastguard Worker 18*795d594fSAndroid Build Coastguard Worker# Test that all vregs holding the new-instance are updated after the 19*795d594fSAndroid Build Coastguard Worker# StringFactory call. 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker## CHECK-START: java.lang.String TestCase.vregAliasing(byte[]) register (after) 22*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<String:l\d+>>] 23*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String>> InvokeStaticOrDirect method_name:java.lang.String.<init> 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker.method public static vregAliasing([B)Ljava/lang/String; 26*795d594fSAndroid Build Coastguard Worker .registers 5 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker # Create new instance of String and store it to v0, v1, v2. 29*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 30*795d594fSAndroid Build Coastguard Worker move-object v1, v0 31*795d594fSAndroid Build Coastguard Worker move-object v2, v0 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker # Call String.<init> on v1. 34*795d594fSAndroid Build Coastguard Worker const-string v3, "UTF8" 35*795d594fSAndroid Build Coastguard Worker invoke-direct {v1, p0, v3}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker # Return the object from v2. 38*795d594fSAndroid Build Coastguard Worker return-object v2 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker.end method 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker# Test usage of String new-instance before it is initialized. 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker## CHECK-START: void TestCase.compareNewInstance() register (after) 45*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null:l\d+>> InvokeStaticOrDirect method_name:Main.$noinline$HiddenNull 46*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String:l\d+>> NewInstance 47*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Null>>,<<String>>] 48*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker.method public static compareNewInstance()V 51*795d594fSAndroid Build Coastguard Worker .registers 3 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->$noinline$HiddenNull()Ljava/lang/Object; 54*795d594fSAndroid Build Coastguard Worker move-result-object v1 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 57*795d594fSAndroid Build Coastguard Worker if-ne v0, v1, :return 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker # Will throw NullPointerException if this branch is taken. 60*795d594fSAndroid Build Coastguard Worker const v1, 0x0 61*795d594fSAndroid Build Coastguard Worker const-string v2, "UTF8" 62*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, v1, v2}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 63*795d594fSAndroid Build Coastguard Worker return-void 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker :return 66*795d594fSAndroid Build Coastguard Worker return-void 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker.end method 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker# Test deoptimization between String's allocation and initialization. When not 71*795d594fSAndroid Build Coastguard Worker# compiling --debuggable, the NewInstance will be optimized out. 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.deoptimizeNewInstance(int[], byte[]) register (after) 74*795d594fSAndroid Build Coastguard Worker## CHECK: <<Null:l\d+>> NullConstant 75*795d594fSAndroid Build Coastguard Worker## CHECK: Deoptimize env:[[<<Null>>,{{.*]]}} 76*795d594fSAndroid Build Coastguard Worker## CHECK: InvokeStaticOrDirect method_name:java.lang.String.<init> 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker## CHECK-START-DEBUGGABLE: int TestCase.deoptimizeNewInstance(int[], byte[]) register (after) 79*795d594fSAndroid Build Coastguard Worker## CHECK: <<String:l\d+>> NewInstance 80*795d594fSAndroid Build Coastguard Worker## CHECK: Deoptimize env:[[<<String>>,{{.*]]}} 81*795d594fSAndroid Build Coastguard Worker## CHECK: InvokeStaticOrDirect method_name:java.lang.String.<init> 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker.method public static deoptimizeNewInstance([I[B)I 84*795d594fSAndroid Build Coastguard Worker .registers 6 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker const v2, 0x0 87*795d594fSAndroid Build Coastguard Worker const v1, 0x1 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; # HNewInstance(String) 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker # Deoptimize here if the array is too short. 92*795d594fSAndroid Build Coastguard Worker aget v1, p0, v1 # v1 = int_array[0x1] 93*795d594fSAndroid Build Coastguard Worker add-int/2addr v2, v1 # v2 = 0x0 + v1 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker # Check that we're being executed by the interpreter. 96*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->assertIsInterpreted()V 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker # String allocation should succeed. 99*795d594fSAndroid Build Coastguard Worker const-string v3, "UTF8" 100*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p1, v3}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 101*795d594fSAndroid Build Coastguard Worker # Transformed into invoke StringFactory(p1,v3). 102*795d594fSAndroid Build Coastguard Worker # The use of v0 is dropped (so HNewInstance(String) ends up having 0 uses and is removed). 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker # This ArrayGet will throw ArrayIndexOutOfBoundsException. 105*795d594fSAndroid Build Coastguard Worker const v1, 0x4 106*795d594fSAndroid Build Coastguard Worker aget v1, p0, v1 107*795d594fSAndroid Build Coastguard Worker add-int/2addr v2, v1 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker return v2 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker.end method 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker# Test that a redundant NewInstance is removed if not used and not compiling 114*795d594fSAndroid Build Coastguard Worker# --debuggable. 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker## CHECK-START: java.lang.String TestCase.removeNewInstance(byte[]) register (after) 117*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: NewInstance 118*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: LoadClass 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker## CHECK-START-DEBUGGABLE: java.lang.String TestCase.removeNewInstance(byte[]) register (after) 121*795d594fSAndroid Build Coastguard Worker## CHECK: NewInstance 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker.method public static removeNewInstance([B)Ljava/lang/String; 124*795d594fSAndroid Build Coastguard Worker .registers 5 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 127*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 128*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 129*795d594fSAndroid Build Coastguard Worker return-object v0 130*795d594fSAndroid Build Coastguard Worker # Although it looks like we "use" the new-instance v0 here, the optimizing compiler 131*795d594fSAndroid Build Coastguard Worker # transforms all uses of the new-instance into uses of the StringFactory invoke. 132*795d594fSAndroid Build Coastguard Worker # therefore the HNewInstance for v0 becomes dead and is removed. 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker.end method 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker# Test #1 for irreducible loops and String.<init>. 137*795d594fSAndroid Build Coastguard Worker.method public static irreducibleLoopAndStringInit1([BZ)Ljava/lang/String; 138*795d594fSAndroid Build Coastguard Worker .registers 5 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 141*795d594fSAndroid Build Coastguard Worker 142*795d594fSAndroid Build Coastguard Worker # Irreducible loop 143*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_entry 144*795d594fSAndroid Build Coastguard Worker :loop_header 145*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 146*795d594fSAndroid Build Coastguard Worker :loop_entry 147*795d594fSAndroid Build Coastguard Worker if-eqz p1, :string_init 148*795d594fSAndroid Build Coastguard Worker goto :loop_header 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker :string_init 151*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 152*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 153*795d594fSAndroid Build Coastguard Worker return-object v0 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker.end method 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker# Test #2 for irreducible loops and String.<init>. 158*795d594fSAndroid Build Coastguard Worker.method public static irreducibleLoopAndStringInit2([BZ)Ljava/lang/String; 159*795d594fSAndroid Build Coastguard Worker .registers 5 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker # Irreducible loop 164*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_entry 165*795d594fSAndroid Build Coastguard Worker :loop_header 166*795d594fSAndroid Build Coastguard Worker if-eqz p1, :string_init 167*795d594fSAndroid Build Coastguard Worker :loop_entry 168*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 169*795d594fSAndroid Build Coastguard Worker goto :loop_header 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker :string_init 172*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 173*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 174*795d594fSAndroid Build Coastguard Worker return-object v0 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker.end method 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker# Test #3 for irreducible loops and String.<init> alias. 179*795d594fSAndroid Build Coastguard Worker.method public static irreducibleLoopAndStringInit3([BZ)Ljava/lang/String; 180*795d594fSAndroid Build Coastguard Worker .registers 5 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 183*795d594fSAndroid Build Coastguard Worker move-object v2, v0 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker # Irreducible loop 186*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_entry 187*795d594fSAndroid Build Coastguard Worker :loop_header 188*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 189*795d594fSAndroid Build Coastguard Worker :loop_entry 190*795d594fSAndroid Build Coastguard Worker if-eqz p1, :string_init 191*795d594fSAndroid Build Coastguard Worker goto :loop_header 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker :string_init 194*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 195*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 196*795d594fSAndroid Build Coastguard Worker return-object v2 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker.end method 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker# Test with a loop between allocation and String.<init>. 201*795d594fSAndroid Build Coastguard Worker.method public static loopAndStringInit([BZ)Ljava/lang/String; 202*795d594fSAndroid Build Coastguard Worker .registers 5 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 205*795d594fSAndroid Build Coastguard Worker 206*795d594fSAndroid Build Coastguard Worker # Loop 207*795d594fSAndroid Build Coastguard Worker :loop_header 208*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit 209*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 210*795d594fSAndroid Build Coastguard Worker goto :loop_header 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker :loop_exit 213*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 214*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 215*795d594fSAndroid Build Coastguard Worker return-object v0 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker.end method 218*795d594fSAndroid Build Coastguard Worker 219*795d594fSAndroid Build Coastguard Worker# Test with a loop and aliases between allocation and String.<init>. 220*795d594fSAndroid Build Coastguard Worker.method public static loopAndStringInitAlias([BZ)Ljava/lang/String; 221*795d594fSAndroid Build Coastguard Worker .registers 5 222*795d594fSAndroid Build Coastguard Worker 223*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 224*795d594fSAndroid Build Coastguard Worker move-object v2, v0 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker # Loop 227*795d594fSAndroid Build Coastguard Worker :loop_header 228*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit 229*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 230*795d594fSAndroid Build Coastguard Worker goto :loop_header 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker :loop_exit 233*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 234*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 235*795d594fSAndroid Build Coastguard Worker return-object v2 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker.end method 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker# Test deoptimization after String initialization of a phi. 240*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.deoptimizeNewInstanceAfterLoop(int[], byte[], int) register (after) 241*795d594fSAndroid Build Coastguard Worker## CHECK: <<Invoke:l\d+>> InvokeStaticOrDirect method_name:java.lang.String.<init> 242*795d594fSAndroid Build Coastguard Worker## CHECK: Deoptimize env:[[<<Invoke>>,{{.*]]}} 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker.method public static deoptimizeNewInstanceAfterLoop([I[BI)I 245*795d594fSAndroid Build Coastguard Worker .registers 8 246*795d594fSAndroid Build Coastguard Worker 247*795d594fSAndroid Build Coastguard Worker const v2, 0x0 248*795d594fSAndroid Build Coastguard Worker const v1, 0x1 249*795d594fSAndroid Build Coastguard Worker 250*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; # HNewInstance(String) 251*795d594fSAndroid Build Coastguard Worker move-object v4, v0 252*795d594fSAndroid Build Coastguard Worker # Loop 253*795d594fSAndroid Build Coastguard Worker :loop_header 254*795d594fSAndroid Build Coastguard Worker if-eqz p2, :loop_exit 255*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p2, p2, 0x1 256*795d594fSAndroid Build Coastguard Worker goto :loop_header 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker :loop_exit 259*795d594fSAndroid Build Coastguard Worker const-string v3, "UTF8" 260*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p1, v3}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 261*795d594fSAndroid Build Coastguard Worker 262*795d594fSAndroid Build Coastguard Worker # Deoptimize here if the array is too short. 263*795d594fSAndroid Build Coastguard Worker aget v1, p0, v1 # v1 = int_array[0x1] 264*795d594fSAndroid Build Coastguard Worker add-int/2addr v2, v1 # v2 = 0x0 + v1 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker # Check that we're being executed by the interpreter. 267*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->assertIsInterpreted()V 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker # Check that the environments contain the right string. 270*795d594fSAndroid Build Coastguard Worker invoke-static {p1, v0}, LMain;->assertEqual([BLjava/lang/String;)V 271*795d594fSAndroid Build Coastguard Worker invoke-static {p1, v4}, LMain;->assertEqual([BLjava/lang/String;)V 272*795d594fSAndroid Build Coastguard Worker 273*795d594fSAndroid Build Coastguard Worker # This ArrayGet will throw ArrayIndexOutOfBoundsException. 274*795d594fSAndroid Build Coastguard Worker const v1, 0x4 275*795d594fSAndroid Build Coastguard Worker aget v1, p0, v1 276*795d594fSAndroid Build Coastguard Worker add-int/2addr v2, v1 277*795d594fSAndroid Build Coastguard Worker 278*795d594fSAndroid Build Coastguard Worker return v2 279*795d594fSAndroid Build Coastguard Worker 280*795d594fSAndroid Build Coastguard Worker.end method 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker# Test with a loop between allocation and String.<init> and a null check. 283*795d594fSAndroid Build Coastguard Worker## CHECK-START: java.lang.String TestCase.loopAndStringInitAndTest(byte[], boolean) builder (after) 284*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null:l\d+>> NullConstant 285*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String:l\d+>> NewInstance 286*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> NotEqual [<<String>>,<<Null>>] 287*795d594fSAndroid Build Coastguard Worker 288*795d594fSAndroid Build Coastguard Worker## CHECK-START: java.lang.String TestCase.loopAndStringInitAndTest(byte[], boolean) register (after) 289*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String:l\d+>> NewInstance 290*795d594fSAndroid Build Coastguard Worker.method public static loopAndStringInitAndTest([BZ)Ljava/lang/String; 291*795d594fSAndroid Build Coastguard Worker .registers 5 292*795d594fSAndroid Build Coastguard Worker 293*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 294*795d594fSAndroid Build Coastguard Worker 295*795d594fSAndroid Build Coastguard Worker # Loop 296*795d594fSAndroid Build Coastguard Worker :loop_header 297*795d594fSAndroid Build Coastguard Worker # Use the new-instance in the only way it can be used. 298*795d594fSAndroid Build Coastguard Worker if-nez v0, :loop_exit 299*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p1, p1, 0x1 300*795d594fSAndroid Build Coastguard Worker goto :loop_header 301*795d594fSAndroid Build Coastguard Worker 302*795d594fSAndroid Build Coastguard Worker :loop_exit 303*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 304*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 305*795d594fSAndroid Build Coastguard Worker return-object v0 306*795d594fSAndroid Build Coastguard Worker 307*795d594fSAndroid Build Coastguard Worker.end method 308*795d594fSAndroid Build Coastguard Worker 309*795d594fSAndroid Build Coastguard Worker## CHECK-START: java.lang.String TestCase.loopAndStringInitAndPhi(byte[], boolean) register (after) 310*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: NewInstance 311*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Invoke1:l\d+>> InvokeStaticOrDirect method_name:java.lang.String.<init> 312*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Invoke2:l\d+>> InvokeStaticOrDirect method_name:java.lang.String.<init> 313*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:l\d+>> Phi [<<Invoke1>>,<<Invoke2>>] 314*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Phi>>] 315*795d594fSAndroid Build Coastguard Worker.method public static loopAndStringInitAndPhi([BZ)Ljava/lang/String; 316*795d594fSAndroid Build Coastguard Worker .registers 4 317*795d594fSAndroid Build Coastguard Worker 318*795d594fSAndroid Build Coastguard Worker if-nez p1, :allocate_other 319*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 320*795d594fSAndroid Build Coastguard Worker 321*795d594fSAndroid Build Coastguard Worker # Loop 322*795d594fSAndroid Build Coastguard Worker :loop_header 323*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit 324*795d594fSAndroid Build Coastguard Worker goto :loop_header 325*795d594fSAndroid Build Coastguard Worker 326*795d594fSAndroid Build Coastguard Worker :loop_exit 327*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 328*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 329*795d594fSAndroid Build Coastguard Worker goto : exit 330*795d594fSAndroid Build Coastguard Worker 331*795d594fSAndroid Build Coastguard Worker :allocate_other 332*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 333*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 334*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 335*795d594fSAndroid Build Coastguard Worker :exit 336*795d594fSAndroid Build Coastguard Worker return-object v0 337*795d594fSAndroid Build Coastguard Worker 338*795d594fSAndroid Build Coastguard Worker.end method 339*795d594fSAndroid Build Coastguard Worker 340*795d594fSAndroid Build Coastguard Worker.method public static loopAndTwoStringInitAndPhi([BZZ)Ljava/lang/String; 341*795d594fSAndroid Build Coastguard Worker .registers 6 342*795d594fSAndroid Build Coastguard Worker 343*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 344*795d594fSAndroid Build Coastguard Worker new-instance v2, Ljava/lang/String; 345*795d594fSAndroid Build Coastguard Worker 346*795d594fSAndroid Build Coastguard Worker if-nez p2, :allocate_other 347*795d594fSAndroid Build Coastguard Worker 348*795d594fSAndroid Build Coastguard Worker # Loop 349*795d594fSAndroid Build Coastguard Worker :loop_header 350*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit 351*795d594fSAndroid Build Coastguard Worker goto :loop_header 352*795d594fSAndroid Build Coastguard Worker 353*795d594fSAndroid Build Coastguard Worker :loop_exit 354*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 355*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 356*795d594fSAndroid Build Coastguard Worker goto :exit 357*795d594fSAndroid Build Coastguard Worker 358*795d594fSAndroid Build Coastguard Worker :allocate_other 359*795d594fSAndroid Build Coastguard Worker 360*795d594fSAndroid Build Coastguard Worker # Loop 361*795d594fSAndroid Build Coastguard Worker :loop_header2 362*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit2 363*795d594fSAndroid Build Coastguard Worker goto :loop_header2 364*795d594fSAndroid Build Coastguard Worker 365*795d594fSAndroid Build Coastguard Worker :loop_exit2 366*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 367*795d594fSAndroid Build Coastguard Worker invoke-direct {v2, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 368*795d594fSAndroid Build Coastguard Worker move-object v0, v2 369*795d594fSAndroid Build Coastguard Worker 370*795d594fSAndroid Build Coastguard Worker :exit 371*795d594fSAndroid Build Coastguard Worker return-object v0 372*795d594fSAndroid Build Coastguard Worker 373*795d594fSAndroid Build Coastguard Worker.end method 374*795d594fSAndroid Build Coastguard Worker 375*795d594fSAndroid Build Coastguard Worker# Regression test for a new string flowing into a catch phi. 376*795d594fSAndroid Build Coastguard Worker.method public static stringAndCatch([BZ)Ljava/lang/Object; 377*795d594fSAndroid Build Coastguard Worker .registers 4 378*795d594fSAndroid Build Coastguard Worker 379*795d594fSAndroid Build Coastguard Worker const v0, 0x0 380*795d594fSAndroid Build Coastguard Worker 381*795d594fSAndroid Build Coastguard Worker :try_start_a 382*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 383*795d594fSAndroid Build Coastguard Worker 384*795d594fSAndroid Build Coastguard Worker # Loop 385*795d594fSAndroid Build Coastguard Worker :loop_header 386*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_exit 387*795d594fSAndroid Build Coastguard Worker goto :loop_header 388*795d594fSAndroid Build Coastguard Worker 389*795d594fSAndroid Build Coastguard Worker :loop_exit 390*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 391*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 392*795d594fSAndroid Build Coastguard Worker goto :exit 393*795d594fSAndroid Build Coastguard Worker :try_end_a 394*795d594fSAndroid Build Coastguard Worker .catch Ljava/lang/Exception; {:try_start_a .. :try_end_a} :catch_a 395*795d594fSAndroid Build Coastguard Worker 396*795d594fSAndroid Build Coastguard Worker :catch_a 397*795d594fSAndroid Build Coastguard Worker # Initially, we create a catch phi with the potential uninitalized string, which used to 398*795d594fSAndroid Build Coastguard Worker # trip the compiler. However, using that catch phi is an error caught by the verifier, so 399*795d594fSAndroid Build Coastguard Worker # having the phi is benign. 400*795d594fSAndroid Build Coastguard Worker const v0, 0x0 401*795d594fSAndroid Build Coastguard Worker 402*795d594fSAndroid Build Coastguard Worker :exit 403*795d594fSAndroid Build Coastguard Worker return-object v0 404*795d594fSAndroid Build Coastguard Worker 405*795d594fSAndroid Build Coastguard Worker.end method 406*795d594fSAndroid Build Coastguard Worker 407*795d594fSAndroid Build Coastguard Worker# Same test as above, but with a catch phi being used by the string constructor. 408*795d594fSAndroid Build Coastguard Worker.method public static stringAndCatch2([BZ)Ljava/lang/Object; 409*795d594fSAndroid Build Coastguard Worker .registers 4 410*795d594fSAndroid Build Coastguard Worker 411*795d594fSAndroid Build Coastguard Worker const v0, 0x0 412*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 413*795d594fSAndroid Build Coastguard Worker 414*795d594fSAndroid Build Coastguard Worker :try_start_a 415*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 416*795d594fSAndroid Build Coastguard Worker :try_end_a 417*795d594fSAndroid Build Coastguard Worker .catch Ljava/lang/Exception; {:try_start_a .. :try_end_a} :catch_a 418*795d594fSAndroid Build Coastguard Worker 419*795d594fSAndroid Build Coastguard Worker :catch_a 420*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 421*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 422*795d594fSAndroid Build Coastguard Worker return-object v0 423*795d594fSAndroid Build Coastguard Worker 424*795d594fSAndroid Build Coastguard Worker.end method 425*795d594fSAndroid Build Coastguard Worker 426*795d594fSAndroid Build Coastguard Worker# Same test as above, but with a catch phi being used by the string constructor and 427*795d594fSAndroid Build Coastguard Worker# a null test. 428*795d594fSAndroid Build Coastguard Worker.method public static stringAndCatch3([BZ)Ljava/lang/Object; 429*795d594fSAndroid Build Coastguard Worker .registers 4 430*795d594fSAndroid Build Coastguard Worker 431*795d594fSAndroid Build Coastguard Worker const v0, 0x0 432*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 433*795d594fSAndroid Build Coastguard Worker 434*795d594fSAndroid Build Coastguard Worker :try_start_a 435*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 436*795d594fSAndroid Build Coastguard Worker :try_end_a 437*795d594fSAndroid Build Coastguard Worker .catch Ljava/lang/Exception; {:try_start_a .. :try_end_a} :catch_a 438*795d594fSAndroid Build Coastguard Worker 439*795d594fSAndroid Build Coastguard Worker :catch_a 440*795d594fSAndroid Build Coastguard Worker if-eqz v0, :unexpected 441*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 442*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 443*795d594fSAndroid Build Coastguard Worker goto :exit 444*795d594fSAndroid Build Coastguard Worker :unexpected 445*795d594fSAndroid Build Coastguard Worker const-string v0, "UTF8" 446*795d594fSAndroid Build Coastguard Worker :exit 447*795d594fSAndroid Build Coastguard Worker return-object v0 448*795d594fSAndroid Build Coastguard Worker 449*795d594fSAndroid Build Coastguard Worker.end method 450*795d594fSAndroid Build Coastguard Worker 451*795d594fSAndroid Build Coastguard Worker# Regression test that tripped the compiler. 452*795d594fSAndroid Build Coastguard Worker.method public static stringAndPhi([BZ)Ljava/lang/Object; 453*795d594fSAndroid Build Coastguard Worker .registers 4 454*795d594fSAndroid Build Coastguard Worker 455*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/String; 456*795d594fSAndroid Build Coastguard Worker const-string v1, "UTF8" 457*795d594fSAndroid Build Coastguard Worker 458*795d594fSAndroid Build Coastguard Worker :loop_header 459*795d594fSAndroid Build Coastguard Worker if-nez p1, :unused 460*795d594fSAndroid Build Coastguard Worker if-eqz p1, :invoke 461*795d594fSAndroid Build Coastguard Worker goto :loop_header 462*795d594fSAndroid Build Coastguard Worker 463*795d594fSAndroid Build Coastguard Worker :invoke 464*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, p0, v1}, Ljava/lang/String;-><init>([BLjava/lang/String;)V 465*795d594fSAndroid Build Coastguard Worker goto :exit 466*795d594fSAndroid Build Coastguard Worker 467*795d594fSAndroid Build Coastguard Worker :unused 468*795d594fSAndroid Build Coastguard Worker const-string v0, "UTF8" 469*795d594fSAndroid Build Coastguard Worker if-nez p1, :exit 470*795d594fSAndroid Build Coastguard Worker goto :unused 471*795d594fSAndroid Build Coastguard Worker 472*795d594fSAndroid Build Coastguard Worker :exit 473*795d594fSAndroid Build Coastguard Worker return-object v0 474*795d594fSAndroid Build Coastguard Worker 475*795d594fSAndroid Build Coastguard Worker.end method 476