xref: /aosp_15_r20/art/test/563-checker-fakestring/smali/TestCase.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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