xref: /aosp_15_r20/art/test/510-checker-try-catch/smali/Builder.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 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 LBuilder;
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object;
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker# Basic test case with two try blocks and three catch handlers, one of which
20*795d594fSAndroid Build Coastguard Worker# is shared by the two tries.
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testMultipleTryCatch(int, int, int) builder (after)
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Worker## CHECK:      name             "B0"
25*795d594fSAndroid Build Coastguard Worker## CHECK:      successors       "<<BEnterTry1:B\d+>>"
26*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus1:i\d+>>  IntConstant -1
27*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus2:i\d+>>  IntConstant -2
28*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus3:i\d+>>  IntConstant -3
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
31*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>"
32*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
33*795d594fSAndroid Build Coastguard Worker## CHECK:  DivZeroCheck
34*795d594fSAndroid Build Coastguard Worker
35*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BAdd:B\d+>>"
36*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
37*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2:B\d+>>"
38*795d594fSAndroid Build Coastguard Worker## CHECK:  Add
39*795d594fSAndroid Build Coastguard Worker
40*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
41*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2>>"
42*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
43*795d594fSAndroid Build Coastguard Worker## CHECK:  DivZeroCheck
44*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BAfterTry2:B\d+>>"
47*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
48*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn:B\d+>>"
49*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
50*795d594fSAndroid Build Coastguard Worker
51*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn>>"
52*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BAfterTry2>>" "<<BCatch1:B\d+>>" "<<BCatch2:B\d+>>" "<<BCatch3:B\d+>>"
53*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>,<<Minus2>>,<<Minus3>>]
54*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch1>>"
57*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BExitTry1>>"
58*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
59*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
60*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch2>>"
63*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2>>" "<<BExitTry2>>"
64*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
65*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
66*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
67*795d594fSAndroid Build Coastguard Worker
68*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch3>>"
69*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
70*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
71*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
72*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
73*795d594fSAndroid Build Coastguard Worker
74*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
75*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
76*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
77*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>" "<<BCatch3>>"
78*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
79*795d594fSAndroid Build Coastguard Worker
80*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
81*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BAdd>>"
82*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
83*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>" "<<BCatch3>>"
84*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
85*795d594fSAndroid Build Coastguard Worker
86*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
87*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
88*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BAdd>>"
89*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>" "<<BCatch3>>"
90*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
91*795d594fSAndroid Build Coastguard Worker
92*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
93*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
94*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BAfterTry2>>"
95*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>" "<<BCatch3>>"
96*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
97*795d594fSAndroid Build Coastguard Worker
98*795d594fSAndroid Build Coastguard Worker.method public static testMultipleTryCatch(III)I
99*795d594fSAndroid Build Coastguard Worker    .registers 3
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Worker    :try_start_1
102*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
103*795d594fSAndroid Build Coastguard Worker    :try_end_1
104*795d594fSAndroid Build Coastguard Worker    .catch Ljava/lang/ArithmeticException; {:try_start_1 .. :try_end_1} :catch_arith
105*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_1 .. :try_end_1} :catch_other
106*795d594fSAndroid Build Coastguard Worker
107*795d594fSAndroid Build Coastguard Worker    add-int/2addr p0, p0
108*795d594fSAndroid Build Coastguard Worker
109*795d594fSAndroid Build Coastguard Worker    :try_start_2
110*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
111*795d594fSAndroid Build Coastguard Worker    :try_end_2
112*795d594fSAndroid Build Coastguard Worker    .catch Ljava/lang/OutOfMemoryError; {:try_start_2 .. :try_end_2} :catch_mem
113*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_2 .. :try_end_2} :catch_other
114*795d594fSAndroid Build Coastguard Worker
115*795d594fSAndroid Build Coastguard Worker    nop
116*795d594fSAndroid Build Coastguard Worker
117*795d594fSAndroid Build Coastguard Worker    :return
118*795d594fSAndroid Build Coastguard Worker    return p0
119*795d594fSAndroid Build Coastguard Worker
120*795d594fSAndroid Build Coastguard Worker    :catch_arith
121*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
122*795d594fSAndroid Build Coastguard Worker    goto :return
123*795d594fSAndroid Build Coastguard Worker
124*795d594fSAndroid Build Coastguard Worker    :catch_mem
125*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x2
126*795d594fSAndroid Build Coastguard Worker    goto :return
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker    :catch_other
129*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x3
130*795d594fSAndroid Build Coastguard Worker    goto :return
131*795d594fSAndroid Build Coastguard Worker.end method
132*795d594fSAndroid Build Coastguard Worker
133*795d594fSAndroid Build Coastguard Worker# Tests try-entry block when there are multiple entry points into the try block.
134*795d594fSAndroid Build Coastguard Worker
135*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testMultipleEntries(int, int, int, int) builder (after)
136*795d594fSAndroid Build Coastguard Worker
137*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
138*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BIf:B\d+>>"
139*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Minus1:i\d+>>  IntConstant -1
140*795d594fSAndroid Build Coastguard Worker
141*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BIf>>"
142*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
143*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit1:B\d+>>" "<<BThen:B\d+>>"
144*795d594fSAndroid Build Coastguard Worker## CHECK:  If
145*795d594fSAndroid Build Coastguard Worker
146*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BThen>>"
147*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BIf>>"
148*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry1:B\d+>>"
149*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
150*795d594fSAndroid Build Coastguard Worker
151*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
152*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>"
153*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
154*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
155*795d594fSAndroid Build Coastguard Worker
156*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
157*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2:B\d+>>"
158*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
159*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
160*795d594fSAndroid Build Coastguard Worker
161*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
162*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit3:B\d+>>" "<<BCatch:B\d+>>"
163*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch>>"
166*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
167*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
168*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
169*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
170*795d594fSAndroid Build Coastguard Worker
171*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
172*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BThen>>"
173*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
174*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
175*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
176*795d594fSAndroid Build Coastguard Worker
177*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
178*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit1>>" "<<BSplit2:B\d+>>"
179*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
180*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
181*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
182*795d594fSAndroid Build Coastguard Worker
183*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
184*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
185*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit2>>"
186*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
187*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
188*795d594fSAndroid Build Coastguard Worker
189*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
190*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
191*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit3>>"
192*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
193*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
194*795d594fSAndroid Build Coastguard Worker
195*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit1>>"
196*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BIf>>"
197*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
198*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
199*795d594fSAndroid Build Coastguard Worker
200*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit2>>"
201*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
202*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
203*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
204*795d594fSAndroid Build Coastguard Worker
205*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit3>>"
206*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
207*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
208*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
209*795d594fSAndroid Build Coastguard Worker
210*795d594fSAndroid Build Coastguard Worker.method public static testMultipleEntries(IIII)I
211*795d594fSAndroid Build Coastguard Worker    .registers 4
212*795d594fSAndroid Build Coastguard Worker
213*795d594fSAndroid Build Coastguard Worker    if-eqz p2, :else
214*795d594fSAndroid Build Coastguard Worker
215*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
216*795d594fSAndroid Build Coastguard Worker
217*795d594fSAndroid Build Coastguard Worker    :try_start
218*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
219*795d594fSAndroid Build Coastguard Worker
220*795d594fSAndroid Build Coastguard Worker    :else
221*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p3
222*795d594fSAndroid Build Coastguard Worker    :try_end
223*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
224*795d594fSAndroid Build Coastguard Worker
225*795d594fSAndroid Build Coastguard Worker    :return
226*795d594fSAndroid Build Coastguard Worker    return p0
227*795d594fSAndroid Build Coastguard Worker
228*795d594fSAndroid Build Coastguard Worker    :catch_all
229*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
230*795d594fSAndroid Build Coastguard Worker    goto :return
231*795d594fSAndroid Build Coastguard Worker
232*795d594fSAndroid Build Coastguard Worker.end method
233*795d594fSAndroid Build Coastguard Worker
234*795d594fSAndroid Build Coastguard Worker# Test that multiple try-exit blocks are generated if (normal) control flow can
235*795d594fSAndroid Build Coastguard Worker# jump out of the try block at multiple points.
236*795d594fSAndroid Build Coastguard Worker
237*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testMultipleExits(int, int) builder (after)
238*795d594fSAndroid Build Coastguard Worker
239*795d594fSAndroid Build Coastguard Worker## CHECK:      name             "B0"
240*795d594fSAndroid Build Coastguard Worker## CHECK:      successors       "<<BEnterTry:B\d+>>"
241*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus1:i\d+>>  IntConstant -1
242*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus2:i\d+>>  IntConstant -2
243*795d594fSAndroid Build Coastguard Worker
244*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry:B\d+>>"
245*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>"
246*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>" "<<BExitTry2:B\d+>>"
247*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
248*795d594fSAndroid Build Coastguard Worker## CHECK:  If
249*795d594fSAndroid Build Coastguard Worker
250*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
251*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BThen:B\d+>>" "<<BCatch:B\d+>>"
252*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>,<<Minus2>>]
253*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
254*795d594fSAndroid Build Coastguard Worker
255*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BThen>>"
256*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
257*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
258*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
259*795d594fSAndroid Build Coastguard Worker
260*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch>>"
261*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>" "<<BExitTry1>>" "<<BExitTry2>>"
262*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
263*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
264*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
265*795d594fSAndroid Build Coastguard Worker
266*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry>>"
267*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
268*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry>>"
269*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
270*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
271*795d594fSAndroid Build Coastguard Worker
272*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
273*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry>>"
274*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BThen>>"
275*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
276*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
277*795d594fSAndroid Build Coastguard Worker
278*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
279*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry>>"
280*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
281*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
282*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
283*795d594fSAndroid Build Coastguard Worker
284*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
285*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
286*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
287*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
288*795d594fSAndroid Build Coastguard Worker
289*795d594fSAndroid Build Coastguard Worker.method public static testMultipleExits(II)I
290*795d594fSAndroid Build Coastguard Worker    .registers 2
291*795d594fSAndroid Build Coastguard Worker
292*795d594fSAndroid Build Coastguard Worker    :try_start
293*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
294*795d594fSAndroid Build Coastguard Worker    if-eqz p0, :then
295*795d594fSAndroid Build Coastguard Worker    :try_end
296*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
297*795d594fSAndroid Build Coastguard Worker
298*795d594fSAndroid Build Coastguard Worker    :return
299*795d594fSAndroid Build Coastguard Worker    return p0
300*795d594fSAndroid Build Coastguard Worker
301*795d594fSAndroid Build Coastguard Worker    :then
302*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
303*795d594fSAndroid Build Coastguard Worker    goto :return
304*795d594fSAndroid Build Coastguard Worker
305*795d594fSAndroid Build Coastguard Worker    :catch_all
306*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x2
307*795d594fSAndroid Build Coastguard Worker    goto :return
308*795d594fSAndroid Build Coastguard Worker.end method
309*795d594fSAndroid Build Coastguard Worker
310*795d594fSAndroid Build Coastguard Worker# Test that only one TryBoundary is inserted when an edge connects two different
311*795d594fSAndroid Build Coastguard Worker# try ranges.
312*795d594fSAndroid Build Coastguard Worker
313*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testSharedBoundary(int, int, int) builder (after)
314*795d594fSAndroid Build Coastguard Worker
315*795d594fSAndroid Build Coastguard Worker## CHECK:      name             "B0"
316*795d594fSAndroid Build Coastguard Worker## CHECK:      successors       "<<BEnter1:B\d+>>"
317*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus1:i\d+>>  IntConstant -1
318*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus2:i\d+>>  IntConstant -2
319*795d594fSAndroid Build Coastguard Worker
320*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
321*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1>>"
322*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit1:B\d+>>"
323*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
324*795d594fSAndroid Build Coastguard Worker
325*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
326*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2:B\d+>>"
327*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit2:B\d+>>"
328*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
329*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
330*795d594fSAndroid Build Coastguard Worker
331*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
332*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BCatch1:B\d+>>" "<<BCatch2:B\d+>>"
333*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>,<<Minus2>>]
334*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
335*795d594fSAndroid Build Coastguard Worker
336*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch1>>"
337*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1>>" "<<BExit1>>"
338*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
339*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
340*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
341*795d594fSAndroid Build Coastguard Worker
342*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch2>>"
343*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2>>" "<<BExit2>>"
344*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
345*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
346*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
347*795d594fSAndroid Build Coastguard Worker
348*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter1>>"
349*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
350*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
351*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
352*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
353*795d594fSAndroid Build Coastguard Worker
354*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter2>>"
355*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit1>>"
356*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
357*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
358*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
359*795d594fSAndroid Build Coastguard Worker
360*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit1>>"
361*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
362*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnter2>>"
363*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
364*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
365*795d594fSAndroid Build Coastguard Worker
366*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit2>>"
367*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
368*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
369*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
370*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
371*795d594fSAndroid Build Coastguard Worker
372*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
373*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit2>>"
374*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
375*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
376*795d594fSAndroid Build Coastguard Worker
377*795d594fSAndroid Build Coastguard Worker.method public static testSharedBoundary(III)I
378*795d594fSAndroid Build Coastguard Worker    .registers 3
379*795d594fSAndroid Build Coastguard Worker
380*795d594fSAndroid Build Coastguard Worker    :try_start_1
381*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
382*795d594fSAndroid Build Coastguard Worker    :try_end_1
383*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_1 .. :try_end_1} :catch_all_1
384*795d594fSAndroid Build Coastguard Worker
385*795d594fSAndroid Build Coastguard Worker    :try_start_2
386*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
387*795d594fSAndroid Build Coastguard Worker    :try_end_2
388*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_2 .. :try_end_2} :catch_all_2
389*795d594fSAndroid Build Coastguard Worker
390*795d594fSAndroid Build Coastguard Worker    :return
391*795d594fSAndroid Build Coastguard Worker    return p0
392*795d594fSAndroid Build Coastguard Worker
393*795d594fSAndroid Build Coastguard Worker    :catch_all_1
394*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
395*795d594fSAndroid Build Coastguard Worker    goto :return
396*795d594fSAndroid Build Coastguard Worker
397*795d594fSAndroid Build Coastguard Worker    :catch_all_2
398*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x2
399*795d594fSAndroid Build Coastguard Worker    goto :return
400*795d594fSAndroid Build Coastguard Worker.end method
401*795d594fSAndroid Build Coastguard Worker
402*795d594fSAndroid Build Coastguard Worker# Same as previous test, only the blocks are processed in the opposite order.
403*795d594fSAndroid Build Coastguard Worker
404*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testSharedBoundary_Reverse(int, int, int) builder (after)
405*795d594fSAndroid Build Coastguard Worker
406*795d594fSAndroid Build Coastguard Worker## CHECK:      name             "B0"
407*795d594fSAndroid Build Coastguard Worker## CHECK:      successors       "<<BGoto:B\d+>>"
408*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus1:i\d+>>  IntConstant -1
409*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus2:i\d+>>  IntConstant -2
410*795d594fSAndroid Build Coastguard Worker
411*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BGoto>>"
412*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnter2:B\d+>>"
413*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
414*795d594fSAndroid Build Coastguard Worker
415*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
416*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1:B\d+>>"
417*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit1:B\d+>>"
418*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
419*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
420*795d594fSAndroid Build Coastguard Worker
421*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
422*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2>>"
423*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit2:B\d+>>"
424*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
425*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
426*795d594fSAndroid Build Coastguard Worker
427*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
428*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BCatch1:B\d+>>" "<<BCatch2:B\d+>>"
429*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>,<<Minus2>>]
430*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
431*795d594fSAndroid Build Coastguard Worker
432*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch1>>"
433*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1>>" "<<BExit1>>"
434*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
435*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
436*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
437*795d594fSAndroid Build Coastguard Worker
438*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch2>>"
439*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2>>" "<<BExit2>>"
440*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
441*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
442*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
443*795d594fSAndroid Build Coastguard Worker
444*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter1>>"
445*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit2>>"
446*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
447*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
448*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
449*795d594fSAndroid Build Coastguard Worker
450*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter2>>"
451*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BGoto>>"
452*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
453*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
454*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
455*795d594fSAndroid Build Coastguard Worker
456*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit1>>"
457*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
458*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
459*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
460*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
461*795d594fSAndroid Build Coastguard Worker
462*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit2>>"
463*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
464*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnter1>>"
465*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
466*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
467*795d594fSAndroid Build Coastguard Worker
468*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
469*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit1>>"
470*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
471*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
472*795d594fSAndroid Build Coastguard Worker
473*795d594fSAndroid Build Coastguard Worker.method public static testSharedBoundary_Reverse(III)I
474*795d594fSAndroid Build Coastguard Worker    .registers 3
475*795d594fSAndroid Build Coastguard Worker
476*795d594fSAndroid Build Coastguard Worker    goto :try_start_2
477*795d594fSAndroid Build Coastguard Worker
478*795d594fSAndroid Build Coastguard Worker    :try_start_1
479*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
480*795d594fSAndroid Build Coastguard Worker    goto :return
481*795d594fSAndroid Build Coastguard Worker    :try_end_1
482*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_1 .. :try_end_1} :catch_all_1
483*795d594fSAndroid Build Coastguard Worker
484*795d594fSAndroid Build Coastguard Worker    :try_start_2
485*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
486*795d594fSAndroid Build Coastguard Worker    goto :try_start_1
487*795d594fSAndroid Build Coastguard Worker    :try_end_2
488*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_2 .. :try_end_2} :catch_all_2
489*795d594fSAndroid Build Coastguard Worker
490*795d594fSAndroid Build Coastguard Worker    :return
491*795d594fSAndroid Build Coastguard Worker    return p0
492*795d594fSAndroid Build Coastguard Worker
493*795d594fSAndroid Build Coastguard Worker    :catch_all_1
494*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
495*795d594fSAndroid Build Coastguard Worker    goto :return
496*795d594fSAndroid Build Coastguard Worker
497*795d594fSAndroid Build Coastguard Worker    :catch_all_2
498*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x2
499*795d594fSAndroid Build Coastguard Worker    goto :return
500*795d594fSAndroid Build Coastguard Worker.end method
501*795d594fSAndroid Build Coastguard Worker
502*795d594fSAndroid Build Coastguard Worker# Test that nested tries are split into non-overlapping blocks and TryBoundary
503*795d594fSAndroid Build Coastguard Worker# blocks are correctly created between them.
504*795d594fSAndroid Build Coastguard Worker
505*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testNestedTry(int, int, int, int) builder (after)
506*795d594fSAndroid Build Coastguard Worker
507*795d594fSAndroid Build Coastguard Worker## CHECK:      name             "B0"
508*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus1:i\d+>>  IntConstant -1
509*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:  <<Minus2:i\d+>>  IntConstant -2
510*795d594fSAndroid Build Coastguard Worker
511*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
512*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1:B\d+>>"
513*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit1:B\d+>>"
514*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
515*795d594fSAndroid Build Coastguard Worker
516*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
517*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2:B\d+>>"
518*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit2:B\d+>>"
519*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
520*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
521*795d594fSAndroid Build Coastguard Worker
522*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry3:B\d+>>"
523*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter3:B\d+>>"
524*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit3:B\d+>>"
525*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
526*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
527*795d594fSAndroid Build Coastguard Worker
528*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
529*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BCatchArith:B\d+>>" "<<BCatchAll:B\d+>>"
530*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>,<<Minus2>>]
531*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
532*795d594fSAndroid Build Coastguard Worker
533*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatchArith>>"
534*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter2>>" "<<BExit2>>"
535*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
536*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
537*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
538*795d594fSAndroid Build Coastguard Worker
539*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatchAll>>"
540*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnter1>>" "<<BEnter2>>" "<<BEnter3>>" "<<BExit1>>" "<<BExit2>>" "<<BExit3>>"
541*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
542*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
543*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
544*795d594fSAndroid Build Coastguard Worker
545*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter1>>"
546*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
547*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
548*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchAll>>"
549*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
550*795d594fSAndroid Build Coastguard Worker
551*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter2>>"
552*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit1>>"
553*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
554*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchArith>>" "<<BCatchAll>>"
555*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
556*795d594fSAndroid Build Coastguard Worker
557*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnter3>>"
558*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit2>>"
559*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry3>>"
560*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchAll>>"
561*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
562*795d594fSAndroid Build Coastguard Worker
563*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit1>>"
564*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
565*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnter2>>"
566*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchAll>>"
567*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
568*795d594fSAndroid Build Coastguard Worker
569*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit2>>"
570*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
571*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnter3>>"
572*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchArith>>" "<<BCatchAll>>"
573*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
574*795d594fSAndroid Build Coastguard Worker
575*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit3>>"
576*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry3>>"
577*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
578*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatchAll>>"
579*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
580*795d594fSAndroid Build Coastguard Worker
581*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
582*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExit3>>"
583*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
584*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
585*795d594fSAndroid Build Coastguard Worker
586*795d594fSAndroid Build Coastguard Worker.method public static testNestedTry(IIII)I
587*795d594fSAndroid Build Coastguard Worker    .registers 4
588*795d594fSAndroid Build Coastguard Worker
589*795d594fSAndroid Build Coastguard Worker    :try_start_1
590*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
591*795d594fSAndroid Build Coastguard Worker
592*795d594fSAndroid Build Coastguard Worker    :try_start_2
593*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
594*795d594fSAndroid Build Coastguard Worker    :try_end_2
595*795d594fSAndroid Build Coastguard Worker    .catch Ljava/lang/ArithmeticException; {:try_start_2 .. :try_end_2} :catch_arith
596*795d594fSAndroid Build Coastguard Worker
597*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p3
598*795d594fSAndroid Build Coastguard Worker    :try_end_1
599*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_1 .. :try_end_1} :catch_all
600*795d594fSAndroid Build Coastguard Worker
601*795d594fSAndroid Build Coastguard Worker    :return
602*795d594fSAndroid Build Coastguard Worker    return p0
603*795d594fSAndroid Build Coastguard Worker
604*795d594fSAndroid Build Coastguard Worker    :catch_arith
605*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
606*795d594fSAndroid Build Coastguard Worker    goto :return
607*795d594fSAndroid Build Coastguard Worker
608*795d594fSAndroid Build Coastguard Worker    :catch_all
609*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x2
610*795d594fSAndroid Build Coastguard Worker    goto :return
611*795d594fSAndroid Build Coastguard Worker.end method
612*795d594fSAndroid Build Coastguard Worker
613*795d594fSAndroid Build Coastguard Worker# Test control flow that enters a try block, leaves it and returns again.
614*795d594fSAndroid Build Coastguard Worker
615*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testIncontinuousTry(int, int, int, int) builder (after)
616*795d594fSAndroid Build Coastguard Worker
617*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
618*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Minus1:i\d+>>  IntConstant -1
619*795d594fSAndroid Build Coastguard Worker
620*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
621*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1:B\d+>>"
622*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
623*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
624*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
625*795d594fSAndroid Build Coastguard Worker
626*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
627*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2:B\d+>>"
628*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
629*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Div:i\d+>> Div
630*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
631*795d594fSAndroid Build Coastguard Worker
632*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
633*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BCatch:B\d+>>"
634*795d594fSAndroid Build Coastguard Worker## CHECK:  Phi [<<Div>>,<<Minus1>>]
635*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
636*795d594fSAndroid Build Coastguard Worker
637*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BOutside:B\d+>>"
638*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
639*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
640*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
641*795d594fSAndroid Build Coastguard Worker
642*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch>>"
643*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
644*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
645*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
646*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
647*795d594fSAndroid Build Coastguard Worker
648*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
649*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
650*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
651*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
652*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
653*795d594fSAndroid Build Coastguard Worker
654*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
655*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BOutside>>"
656*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
657*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
658*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
659*795d594fSAndroid Build Coastguard Worker
660*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
661*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
662*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BOutside>>"
663*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
664*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
665*795d594fSAndroid Build Coastguard Worker
666*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
667*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
668*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
669*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
670*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
671*795d594fSAndroid Build Coastguard Worker
672*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
673*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
674*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
675*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
676*795d594fSAndroid Build Coastguard Worker
677*795d594fSAndroid Build Coastguard Worker.method public static testIncontinuousTry(IIII)I
678*795d594fSAndroid Build Coastguard Worker    .registers 4
679*795d594fSAndroid Build Coastguard Worker
680*795d594fSAndroid Build Coastguard Worker    :try_start
681*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
682*795d594fSAndroid Build Coastguard Worker    goto :outside
683*795d594fSAndroid Build Coastguard Worker
684*795d594fSAndroid Build Coastguard Worker    :inside
685*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p3
686*795d594fSAndroid Build Coastguard Worker    :try_end
687*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
688*795d594fSAndroid Build Coastguard Worker
689*795d594fSAndroid Build Coastguard Worker    :return
690*795d594fSAndroid Build Coastguard Worker    return p0
691*795d594fSAndroid Build Coastguard Worker
692*795d594fSAndroid Build Coastguard Worker    :outside
693*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
694*795d594fSAndroid Build Coastguard Worker    goto :inside
695*795d594fSAndroid Build Coastguard Worker
696*795d594fSAndroid Build Coastguard Worker    :catch_all
697*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
698*795d594fSAndroid Build Coastguard Worker    goto :return
699*795d594fSAndroid Build Coastguard Worker.end method
700*795d594fSAndroid Build Coastguard Worker
701*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testSwitchTryEnter(int, int, int, int) builder (after)
702*795d594fSAndroid Build Coastguard Worker
703*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
704*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BPSwitch0:B\d+>>"
705*795d594fSAndroid Build Coastguard Worker
706*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BPSwitch0>>"
707*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
708*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit1:B\d+>>" "<<BPSwitch1:B\d+>>"
709*795d594fSAndroid Build Coastguard Worker## CHECK:  If
710*795d594fSAndroid Build Coastguard Worker
711*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BPSwitch1>>"
712*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch0>>"
713*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit2:B\d+>>" "<<BEnterTry1:B\d+>>"
714*795d594fSAndroid Build Coastguard Worker## CHECK:  If
715*795d594fSAndroid Build Coastguard Worker
716*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
717*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>"
718*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
719*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
720*795d594fSAndroid Build Coastguard Worker
721*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
722*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2:B\d+>>"
723*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
724*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
725*795d594fSAndroid Build Coastguard Worker
726*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BOutside:B\d+>>"
727*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit2>>" "<<BSplit4:B\d+>>"
728*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn:B\d+>>"
729*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
730*795d594fSAndroid Build Coastguard Worker
731*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn>>"
732*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BOutside>>" "<<BCatch:B\d+>>"
733*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
734*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
735*795d594fSAndroid Build Coastguard Worker
736*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
737*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
738*795d594fSAndroid Build Coastguard Worker
739*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch>>"
740*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
741*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
742*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
743*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
744*795d594fSAndroid Build Coastguard Worker
745*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
746*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch1>>"
747*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
748*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
749*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
750*795d594fSAndroid Build Coastguard Worker
751*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
752*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit1>>" "<<BSplit3:B\d+>>"
753*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
754*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
755*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
756*795d594fSAndroid Build Coastguard Worker
757*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
758*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
759*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit3>>"
760*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
761*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
762*795d594fSAndroid Build Coastguard Worker
763*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
764*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
765*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit4>>"
766*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
767*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
768*795d594fSAndroid Build Coastguard Worker
769*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit1>>"
770*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch0>>"
771*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
772*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
773*795d594fSAndroid Build Coastguard Worker
774*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit2>>"
775*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch1>>"
776*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BOutside>>"
777*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
778*795d594fSAndroid Build Coastguard Worker
779*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit3>>"
780*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
781*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
782*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
783*795d594fSAndroid Build Coastguard Worker
784*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit4>>"
785*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
786*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BOutside>>"
787*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
788*795d594fSAndroid Build Coastguard Worker
789*795d594fSAndroid Build Coastguard Worker.method public static testSwitchTryEnter(IIII)I
790*795d594fSAndroid Build Coastguard Worker    .registers 4
791*795d594fSAndroid Build Coastguard Worker
792*795d594fSAndroid Build Coastguard Worker    packed-switch p0, :pswitch_data
793*795d594fSAndroid Build Coastguard Worker
794*795d594fSAndroid Build Coastguard Worker    :try_start
795*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
796*795d594fSAndroid Build Coastguard Worker
797*795d594fSAndroid Build Coastguard Worker    :pswitch1
798*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
799*795d594fSAndroid Build Coastguard Worker    goto :pswitch2
800*795d594fSAndroid Build Coastguard Worker
801*795d594fSAndroid Build Coastguard Worker    :pswitch_data
802*795d594fSAndroid Build Coastguard Worker    .packed-switch 0x0
803*795d594fSAndroid Build Coastguard Worker        :pswitch1
804*795d594fSAndroid Build Coastguard Worker        :pswitch2
805*795d594fSAndroid Build Coastguard Worker    .end packed-switch
806*795d594fSAndroid Build Coastguard Worker    :try_end
807*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
808*795d594fSAndroid Build Coastguard Worker
809*795d594fSAndroid Build Coastguard Worker    :pswitch2
810*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p3
811*795d594fSAndroid Build Coastguard Worker
812*795d594fSAndroid Build Coastguard Worker    :catch_all
813*795d594fSAndroid Build Coastguard Worker    return p0
814*795d594fSAndroid Build Coastguard Worker.end method
815*795d594fSAndroid Build Coastguard Worker
816*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testSwitchTryExit(int, int, int, int) builder (after)
817*795d594fSAndroid Build Coastguard Worker
818*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
819*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry1:B\d+>>"
820*795d594fSAndroid Build Coastguard Worker
821*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BPSwitch0:B\d+>>"
822*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>"
823*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit1:B\d+>>" "<<BExitTry1:B\d+>>"
824*795d594fSAndroid Build Coastguard Worker## CHECK:  If
825*795d594fSAndroid Build Coastguard Worker
826*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BPSwitch1:B\d+>>"
827*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
828*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit2:B\d+>>" "<<BEnterTry2:B\d+>>"
829*795d594fSAndroid Build Coastguard Worker## CHECK:  If
830*795d594fSAndroid Build Coastguard Worker
831*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
832*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2>>"
833*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2:B\d+>>"
834*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
835*795d594fSAndroid Build Coastguard Worker
836*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2>>"
837*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit1>>" "<<BTry1>>"
838*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
839*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
840*795d594fSAndroid Build Coastguard Worker
841*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BOutside:B\d+>>"
842*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit2>>" "<<BSplit3:B\d+>>"
843*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn:B\d+>>"
844*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
845*795d594fSAndroid Build Coastguard Worker
846*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn>>"
847*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BOutside>>" "<<BCatch:B\d+>>"
848*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
849*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
850*795d594fSAndroid Build Coastguard Worker
851*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
852*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
853*795d594fSAndroid Build Coastguard Worker
854*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch>>"
855*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
856*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
857*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
858*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
859*795d594fSAndroid Build Coastguard Worker
860*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
861*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
862*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BPSwitch0>>"
863*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
864*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
865*795d594fSAndroid Build Coastguard Worker
866*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
867*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch1>>"
868*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
869*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
870*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
871*795d594fSAndroid Build Coastguard Worker
872*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
873*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch0>>"
874*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BPSwitch1>>"
875*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
876*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
877*795d594fSAndroid Build Coastguard Worker
878*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
879*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
880*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit3>>"
881*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
882*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
883*795d594fSAndroid Build Coastguard Worker
884*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit1>>"
885*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch0>>"
886*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
887*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
888*795d594fSAndroid Build Coastguard Worker
889*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit2>>"
890*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BPSwitch1>>"
891*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BOutside>>"
892*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
893*795d594fSAndroid Build Coastguard Worker
894*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit3>>"
895*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
896*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BOutside>>"
897*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
898*795d594fSAndroid Build Coastguard Worker
899*795d594fSAndroid Build Coastguard Worker.method public static testSwitchTryExit(IIII)I
900*795d594fSAndroid Build Coastguard Worker    .registers 4
901*795d594fSAndroid Build Coastguard Worker
902*795d594fSAndroid Build Coastguard Worker    :try_start
903*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
904*795d594fSAndroid Build Coastguard Worker    packed-switch p0, :pswitch_data
905*795d594fSAndroid Build Coastguard Worker
906*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
907*795d594fSAndroid Build Coastguard Worker
908*795d594fSAndroid Build Coastguard Worker    :pswitch1
909*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
910*795d594fSAndroid Build Coastguard Worker    :try_end
911*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
912*795d594fSAndroid Build Coastguard Worker
913*795d594fSAndroid Build Coastguard Worker    :pswitch2
914*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p3
915*795d594fSAndroid Build Coastguard Worker
916*795d594fSAndroid Build Coastguard Worker    :catch_all
917*795d594fSAndroid Build Coastguard Worker    return p0
918*795d594fSAndroid Build Coastguard Worker
919*795d594fSAndroid Build Coastguard Worker    :pswitch_data
920*795d594fSAndroid Build Coastguard Worker    .packed-switch 0x0
921*795d594fSAndroid Build Coastguard Worker        :pswitch1
922*795d594fSAndroid Build Coastguard Worker        :pswitch2
923*795d594fSAndroid Build Coastguard Worker    .end packed-switch
924*795d594fSAndroid Build Coastguard Worker.end method
925*795d594fSAndroid Build Coastguard Worker
926*795d594fSAndroid Build Coastguard Worker# Test that a TryBoundary is inserted between a Throw instruction and the exit
927*795d594fSAndroid Build Coastguard Worker# block when covered by a try range.
928*795d594fSAndroid Build Coastguard Worker
929*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testThrow(java.lang.Exception) builder (after)
930*795d594fSAndroid Build Coastguard Worker
931*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
932*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry:B\d+>>"
933*795d594fSAndroid Build Coastguard Worker## CHECK:  <<Minus1:i\d+>>  IntConstant -1
934*795d594fSAndroid Build Coastguard Worker
935*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry:B\d+>>"
936*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>"
937*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry:B\d+>>"
938*795d594fSAndroid Build Coastguard Worker## CHECK:  Throw
939*795d594fSAndroid Build Coastguard Worker
940*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch:B\d+>>"
941*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>" "<<BExitTry>>"
942*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
943*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
944*795d594fSAndroid Build Coastguard Worker## CHECK:  Return [<<Minus1>>]
945*795d594fSAndroid Build Coastguard Worker
946*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
947*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry>>" "<<BCatch>>"
948*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
949*795d594fSAndroid Build Coastguard Worker
950*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry>>"
951*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
952*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry>>"
953*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
954*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
955*795d594fSAndroid Build Coastguard Worker
956*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry>>"
957*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry>>"
958*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit>>"
959*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
960*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
961*795d594fSAndroid Build Coastguard Worker
962*795d594fSAndroid Build Coastguard Worker.method public static testThrow(Ljava/lang/Exception;)I
963*795d594fSAndroid Build Coastguard Worker    .registers 2
964*795d594fSAndroid Build Coastguard Worker
965*795d594fSAndroid Build Coastguard Worker    :try_start
966*795d594fSAndroid Build Coastguard Worker    throw p0
967*795d594fSAndroid Build Coastguard Worker    :try_end
968*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
969*795d594fSAndroid Build Coastguard Worker
970*795d594fSAndroid Build Coastguard Worker    :catch_all
971*795d594fSAndroid Build Coastguard Worker    const/4 v0, -0x1
972*795d594fSAndroid Build Coastguard Worker    return v0
973*795d594fSAndroid Build Coastguard Worker.end method
974*795d594fSAndroid Build Coastguard Worker
975*795d594fSAndroid Build Coastguard Worker# Test graph with a throw/catch loop.
976*795d594fSAndroid Build Coastguard Worker
977*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testCatchLoop(int, int, int) builder (after)
978*795d594fSAndroid Build Coastguard Worker
979*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
980*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit:B\d+>>"
981*795d594fSAndroid Build Coastguard Worker
982*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry:B\d+>>"
983*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry:B\d+>>"
984*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry:B\d+>>"
985*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
986*795d594fSAndroid Build Coastguard Worker
987*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
988*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry>>"
989*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
990*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
991*795d594fSAndroid Build Coastguard Worker
992*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
993*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BReturn>>"
994*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
995*795d594fSAndroid Build Coastguard Worker
996*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch:B\d+>>"
997*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>" "<<BExitTry>>"
998*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry>>"
999*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
1000*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1001*795d594fSAndroid Build Coastguard Worker
1002*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry>>"
1003*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit>>" "<<BCatch>>"
1004*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry>>"
1005*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1006*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1007*795d594fSAndroid Build Coastguard Worker
1008*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry>>"
1009*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry>>"
1010*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
1011*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1012*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1013*795d594fSAndroid Build Coastguard Worker
1014*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
1015*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
1016*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry>>"
1017*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1018*795d594fSAndroid Build Coastguard Worker
1019*795d594fSAndroid Build Coastguard Worker.method public static testCatchLoop(III)I
1020*795d594fSAndroid Build Coastguard Worker    .registers 4
1021*795d594fSAndroid Build Coastguard Worker
1022*795d594fSAndroid Build Coastguard Worker    :try_start
1023*795d594fSAndroid Build Coastguard Worker    :catch_all
1024*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
1025*795d594fSAndroid Build Coastguard Worker    :try_end
1026*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1027*795d594fSAndroid Build Coastguard Worker
1028*795d594fSAndroid Build Coastguard Worker    :return
1029*795d594fSAndroid Build Coastguard Worker    return p0
1030*795d594fSAndroid Build Coastguard Worker.end method
1031*795d594fSAndroid Build Coastguard Worker
1032*795d594fSAndroid Build Coastguard Worker# Test that handler edges are not split. In this scenario, the catch block is
1033*795d594fSAndroid Build Coastguard Worker# only the handler of the try block.
1034*795d594fSAndroid Build Coastguard Worker
1035*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testHandlerEdge1(int, int, int) builder (after)
1036*795d594fSAndroid Build Coastguard Worker
1037*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
1038*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry1:B\d+>>"
1039*795d594fSAndroid Build Coastguard Worker
1040*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
1041*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>"
1042*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
1043*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
1044*795d594fSAndroid Build Coastguard Worker
1045*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
1046*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2:B\d+>>"
1047*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
1048*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
1049*795d594fSAndroid Build Coastguard Worker
1050*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
1051*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
1052*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
1053*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
1054*795d594fSAndroid Build Coastguard Worker
1055*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
1056*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BReturn>>"
1057*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
1058*795d594fSAndroid Build Coastguard Worker
1059*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch:B\d+>>"
1060*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BEnterTry2>>" "<<BExitTry1>>" "<<BExitTry2>>"
1061*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
1062*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
1063*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1064*795d594fSAndroid Build Coastguard Worker
1065*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
1066*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
1067*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
1068*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1069*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1070*795d594fSAndroid Build Coastguard Worker
1071*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
1072*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit:B\d+>>" "<<BCatch>>"
1073*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
1074*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1075*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1076*795d594fSAndroid Build Coastguard Worker
1077*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
1078*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
1079*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit>>"
1080*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1081*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1082*795d594fSAndroid Build Coastguard Worker
1083*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
1084*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
1085*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
1086*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1087*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1088*795d594fSAndroid Build Coastguard Worker
1089*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit>>"
1090*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
1091*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
1092*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1093*795d594fSAndroid Build Coastguard Worker
1094*795d594fSAndroid Build Coastguard Worker.method public static testHandlerEdge1(III)I
1095*795d594fSAndroid Build Coastguard Worker    .registers 4
1096*795d594fSAndroid Build Coastguard Worker
1097*795d594fSAndroid Build Coastguard Worker    :try_start
1098*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
1099*795d594fSAndroid Build Coastguard Worker
1100*795d594fSAndroid Build Coastguard Worker    :catch_all
1101*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
1102*795d594fSAndroid Build Coastguard Worker    :try_end
1103*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1104*795d594fSAndroid Build Coastguard Worker
1105*795d594fSAndroid Build Coastguard Worker    return p0
1106*795d594fSAndroid Build Coastguard Worker.end method
1107*795d594fSAndroid Build Coastguard Worker
1108*795d594fSAndroid Build Coastguard Worker# Test that handler edges are not split. In this scenario, the catch block is
1109*795d594fSAndroid Build Coastguard Worker# the handler and also the successor of the try block.
1110*795d594fSAndroid Build Coastguard Worker
1111*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testHandlerEdge2(int, int, int) builder (after)
1112*795d594fSAndroid Build Coastguard Worker
1113*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
1114*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit1:B\d+>>"
1115*795d594fSAndroid Build Coastguard Worker
1116*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry1:B\d+>>"
1117*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1:B\d+>>"
1118*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry1:B\d+>>"
1119*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
1120*795d594fSAndroid Build Coastguard Worker
1121*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry2:B\d+>>"
1122*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2:B\d+>>"
1123*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry2:B\d+>>"
1124*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
1125*795d594fSAndroid Build Coastguard Worker
1126*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BReturn:B\d+>>"
1127*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry2>>"
1128*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExit:B\d+>>"
1129*795d594fSAndroid Build Coastguard Worker## CHECK:  Return
1130*795d594fSAndroid Build Coastguard Worker
1131*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExit>>"
1132*795d594fSAndroid Build Coastguard Worker## CHECK:  Exit
1133*795d594fSAndroid Build Coastguard Worker
1134*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch2:B\d+>>"
1135*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry1>>" "<<BExitTry1>>"
1136*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
1137*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
1138*795d594fSAndroid Build Coastguard Worker
1139*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch1:B\d+>>"
1140*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry2>>" "<<BExitTry2>>"
1141*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry1>>"
1142*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
1143*795d594fSAndroid Build Coastguard Worker
1144*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry1>>"
1145*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit1>>" "<<BCatch1>>"
1146*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry1>>"
1147*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
1148*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1149*795d594fSAndroid Build Coastguard Worker
1150*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry2>>"
1151*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit2:B\d+>>" "<<BCatch2>>"
1152*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry2>>"
1153*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
1154*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1155*795d594fSAndroid Build Coastguard Worker
1156*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry1>>"
1157*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry1>>"
1158*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit2>>"
1159*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch2>>"
1160*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1161*795d594fSAndroid Build Coastguard Worker
1162*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry2>>"
1163*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry2>>"
1164*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BReturn>>"
1165*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch1>>"
1166*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1167*795d594fSAndroid Build Coastguard Worker
1168*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit1>>"
1169*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
1170*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry1>>"
1171*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1172*795d594fSAndroid Build Coastguard Worker
1173*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit2>>"
1174*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry1>>"
1175*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry2>>"
1176*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1177*795d594fSAndroid Build Coastguard Worker
1178*795d594fSAndroid Build Coastguard Worker.method public static testHandlerEdge2(III)I
1179*795d594fSAndroid Build Coastguard Worker    .registers 4
1180*795d594fSAndroid Build Coastguard Worker
1181*795d594fSAndroid Build Coastguard Worker    :try_start_1
1182*795d594fSAndroid Build Coastguard Worker    :catch_all_1
1183*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
1184*795d594fSAndroid Build Coastguard Worker    :try_end_1
1185*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_1 .. :try_end_1} :catch_all_2
1186*795d594fSAndroid Build Coastguard Worker
1187*795d594fSAndroid Build Coastguard Worker    :try_start_2
1188*795d594fSAndroid Build Coastguard Worker    :catch_all_2
1189*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p2
1190*795d594fSAndroid Build Coastguard Worker    :try_end_2
1191*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start_2 .. :try_end_2} :catch_all_1
1192*795d594fSAndroid Build Coastguard Worker
1193*795d594fSAndroid Build Coastguard Worker    return p0
1194*795d594fSAndroid Build Coastguard Worker.end method
1195*795d594fSAndroid Build Coastguard Worker
1196*795d594fSAndroid Build Coastguard Worker# Test graph with try/catch inside a loop.
1197*795d594fSAndroid Build Coastguard Worker
1198*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testTryInLoop(int, int) builder (after)
1199*795d594fSAndroid Build Coastguard Worker
1200*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "B0"
1201*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit1:B\d+>>"
1202*795d594fSAndroid Build Coastguard Worker
1203*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BTry:B\d+>>"
1204*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry:B\d+>>"
1205*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BExitTry:B\d+>>"
1206*795d594fSAndroid Build Coastguard Worker## CHECK:  Div
1207*795d594fSAndroid Build Coastguard Worker
1208*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BCatch:B\d+>>"
1209*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BEnterTry>>" "<<BExitTry>>"
1210*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry>>"
1211*795d594fSAndroid Build Coastguard Worker## CHECK:  flags            "catch_block"
1212*795d594fSAndroid Build Coastguard Worker
1213*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BEnterTry>>"
1214*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BSplit1>>"
1215*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BTry>>"
1216*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1217*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:entry
1218*795d594fSAndroid Build Coastguard Worker
1219*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BExitTry>>"
1220*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BTry>>"
1221*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BSplit2:B\d+>>"
1222*795d594fSAndroid Build Coastguard Worker## CHECK:  xhandlers        "<<BCatch>>"
1223*795d594fSAndroid Build Coastguard Worker## CHECK:  TryBoundary      kind:exit
1224*795d594fSAndroid Build Coastguard Worker
1225*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit1>>"
1226*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "B0"
1227*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry>>"
1228*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1229*795d594fSAndroid Build Coastguard Worker
1230*795d594fSAndroid Build Coastguard Worker## CHECK:  name             "<<BSplit2>>"
1231*795d594fSAndroid Build Coastguard Worker## CHECK:  predecessors     "<<BExitTry>>"
1232*795d594fSAndroid Build Coastguard Worker## CHECK:  successors       "<<BEnterTry>>"
1233*795d594fSAndroid Build Coastguard Worker## CHECK:  Goto
1234*795d594fSAndroid Build Coastguard Worker
1235*795d594fSAndroid Build Coastguard Worker.method public static testTryInLoop(II)I
1236*795d594fSAndroid Build Coastguard Worker    .registers 3
1237*795d594fSAndroid Build Coastguard Worker
1238*795d594fSAndroid Build Coastguard Worker    :try_start
1239*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
1240*795d594fSAndroid Build Coastguard Worker    goto :try_start
1241*795d594fSAndroid Build Coastguard Worker    :try_end
1242*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1243*795d594fSAndroid Build Coastguard Worker
1244*795d594fSAndroid Build Coastguard Worker    :catch_all
1245*795d594fSAndroid Build Coastguard Worker    goto :try_start
1246*795d594fSAndroid Build Coastguard Worker.end method
1247*795d594fSAndroid Build Coastguard Worker
1248*795d594fSAndroid Build Coastguard Worker# Test that a MOVE_RESULT instruction is placed into the same block as the
1249*795d594fSAndroid Build Coastguard Worker# INVOKE it follows, even if there is a try boundary between them.
1250*795d594fSAndroid Build Coastguard Worker
1251*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testMoveResult_Invoke(int, int, int) builder (after)
1252*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<M1:i\d+>>  IntConstant -1
1253*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Res:i\d+>> InvokeStaticOrDirect
1254*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Phi:i\d+>> Phi [<<Res>>,<<M1>>]
1255*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                  Return [<<Phi>>]
1256*795d594fSAndroid Build Coastguard Worker
1257*795d594fSAndroid Build Coastguard Worker.method public static testMoveResult_Invoke(III)I
1258*795d594fSAndroid Build Coastguard Worker    .registers 3
1259*795d594fSAndroid Build Coastguard Worker
1260*795d594fSAndroid Build Coastguard Worker    :try_start
1261*795d594fSAndroid Build Coastguard Worker    invoke-static {p0, p1, p2}, LBuilder;->testCatchLoop(III)I
1262*795d594fSAndroid Build Coastguard Worker    :try_end
1263*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1264*795d594fSAndroid Build Coastguard Worker
1265*795d594fSAndroid Build Coastguard Worker    move-result p0
1266*795d594fSAndroid Build Coastguard Worker
1267*795d594fSAndroid Build Coastguard Worker    :return
1268*795d594fSAndroid Build Coastguard Worker    return p0
1269*795d594fSAndroid Build Coastguard Worker
1270*795d594fSAndroid Build Coastguard Worker    :catch_all
1271*795d594fSAndroid Build Coastguard Worker    const/4 p0, -0x1
1272*795d594fSAndroid Build Coastguard Worker    goto :return
1273*795d594fSAndroid Build Coastguard Worker.end method
1274*795d594fSAndroid Build Coastguard Worker
1275*795d594fSAndroid Build Coastguard Worker# Test that a MOVE_RESULT instruction is placed into the same block as the
1276*795d594fSAndroid Build Coastguard Worker# FILLED_NEW_ARRAY it follows, even if there is a try boundary between them.
1277*795d594fSAndroid Build Coastguard Worker
1278*795d594fSAndroid Build Coastguard Worker## CHECK-START: int[] Builder.testMoveResult_FilledNewArray(int, int, int) builder (after)
1279*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg1:i\d+>> ParameterValue
1280*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg2:i\d+>> ParameterValue
1281*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg3:i\d+>> ParameterValue
1282*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Null:l\d+>> NullConstant
1283*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Res:l\d+>>  NewArray
1284*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                   ArraySet   [<<Res>>,{{i\d+}},<<Arg1>>]
1285*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                   ArraySet   [<<Res>>,{{i\d+}},<<Arg2>>]
1286*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                   ArraySet   [<<Res>>,{{i\d+}},<<Arg3>>]
1287*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Phi:l\d+>>  Phi [<<Res>>,<<Null>>]
1288*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                   Return [<<Phi>>]
1289*795d594fSAndroid Build Coastguard Worker
1290*795d594fSAndroid Build Coastguard Worker.method public static testMoveResult_FilledNewArray(III)[I
1291*795d594fSAndroid Build Coastguard Worker    .registers 3
1292*795d594fSAndroid Build Coastguard Worker
1293*795d594fSAndroid Build Coastguard Worker    :try_start
1294*795d594fSAndroid Build Coastguard Worker    filled-new-array {p0, p1, p2}, [I
1295*795d594fSAndroid Build Coastguard Worker    :try_end
1296*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1297*795d594fSAndroid Build Coastguard Worker
1298*795d594fSAndroid Build Coastguard Worker    move-result-object p0
1299*795d594fSAndroid Build Coastguard Worker
1300*795d594fSAndroid Build Coastguard Worker    :return
1301*795d594fSAndroid Build Coastguard Worker    return-object p0
1302*795d594fSAndroid Build Coastguard Worker
1303*795d594fSAndroid Build Coastguard Worker    :catch_all
1304*795d594fSAndroid Build Coastguard Worker    const/4 p0, 0x0
1305*795d594fSAndroid Build Coastguard Worker    goto :return
1306*795d594fSAndroid Build Coastguard Worker.end method
1307*795d594fSAndroid Build Coastguard Worker
1308*795d594fSAndroid Build Coastguard Worker# Test case for ReturnVoid inside a try block. Builder needs to move it outside
1309*795d594fSAndroid Build Coastguard Worker# the try block so as to not split the ReturnVoid-Exit edge.
1310*795d594fSAndroid Build Coastguard Worker# This invariant is enforced by GraphChecker.
1311*795d594fSAndroid Build Coastguard Worker
1312*795d594fSAndroid Build Coastguard Worker.method public static testReturnVoidInTry(II)V
1313*795d594fSAndroid Build Coastguard Worker    .registers 2
1314*795d594fSAndroid Build Coastguard Worker
1315*795d594fSAndroid Build Coastguard Worker    :catch_all
1316*795d594fSAndroid Build Coastguard Worker    :try_start
1317*795d594fSAndroid Build Coastguard Worker    return-void
1318*795d594fSAndroid Build Coastguard Worker    :try_end
1319*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1320*795d594fSAndroid Build Coastguard Worker.end method
1321*795d594fSAndroid Build Coastguard Worker
1322*795d594fSAndroid Build Coastguard Worker# Test case for Return inside a try block. Builder needs to move it outside the
1323*795d594fSAndroid Build Coastguard Worker# try block so as to not split the Return-Exit edge.
1324*795d594fSAndroid Build Coastguard Worker# This invariant is enforced by GraphChecker.
1325*795d594fSAndroid Build Coastguard Worker
1326*795d594fSAndroid Build Coastguard Worker.method public static testReturnInTry(II)I
1327*795d594fSAndroid Build Coastguard Worker    .registers 2
1328*795d594fSAndroid Build Coastguard Worker
1329*795d594fSAndroid Build Coastguard Worker    :try_start
1330*795d594fSAndroid Build Coastguard Worker    div-int/2addr p0, p1
1331*795d594fSAndroid Build Coastguard Worker    return p0
1332*795d594fSAndroid Build Coastguard Worker    :try_end
1333*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1334*795d594fSAndroid Build Coastguard Worker
1335*795d594fSAndroid Build Coastguard Worker    :catch_all
1336*795d594fSAndroid Build Coastguard Worker    const/4 v0, 0x0
1337*795d594fSAndroid Build Coastguard Worker    return v0
1338*795d594fSAndroid Build Coastguard Worker.end method
1339*795d594fSAndroid Build Coastguard Worker
1340*795d594fSAndroid Build Coastguard Worker# Test a (dead) try block which flows out of the method. The block will be
1341*795d594fSAndroid Build Coastguard Worker# removed by DCE but needs to pass post-builder GraphChecker.
1342*795d594fSAndroid Build Coastguard Worker
1343*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testDeadEndTry(int) builder (after)
1344*795d594fSAndroid Build Coastguard Worker## CHECK-NOT:     TryBoundary is_exit:true
1345*795d594fSAndroid Build Coastguard Worker
1346*795d594fSAndroid Build Coastguard Worker.method public static testDeadEndTry(I)I
1347*795d594fSAndroid Build Coastguard Worker    .registers 1
1348*795d594fSAndroid Build Coastguard Worker
1349*795d594fSAndroid Build Coastguard Worker    return p0
1350*795d594fSAndroid Build Coastguard Worker
1351*795d594fSAndroid Build Coastguard Worker    :catch_all
1352*795d594fSAndroid Build Coastguard Worker    nop
1353*795d594fSAndroid Build Coastguard Worker
1354*795d594fSAndroid Build Coastguard Worker    :try_start
1355*795d594fSAndroid Build Coastguard Worker    nop
1356*795d594fSAndroid Build Coastguard Worker    :try_end
1357*795d594fSAndroid Build Coastguard Worker    .catchall {:try_start .. :try_end} :catch_all
1358*795d594fSAndroid Build Coastguard Worker.end method
1359*795d594fSAndroid Build Coastguard Worker
1360*795d594fSAndroid Build Coastguard Worker# Test that a throw-catch loop on monitor-exit is eliminated.
1361*795d594fSAndroid Build Coastguard Worker# Note that we do not test this until after DCE which merges trivially split blocks.
1362*795d594fSAndroid Build Coastguard Worker
1363*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Builder.testSynchronized(java.lang.Object) dead_code_elimination$initial (after)
1364*795d594fSAndroid Build Coastguard Worker## CHECK:      flags "catch_block"
1365*795d594fSAndroid Build Coastguard Worker## CHECK-NOT:  end_block
1366*795d594fSAndroid Build Coastguard Worker## CHECK:      MonitorOperation kind:exit
1367*795d594fSAndroid Build Coastguard Worker
1368*795d594fSAndroid Build Coastguard Worker.method public static testSynchronized(Ljava/lang/Object;)I
1369*795d594fSAndroid Build Coastguard Worker  .registers 2
1370*795d594fSAndroid Build Coastguard Worker
1371*795d594fSAndroid Build Coastguard Worker  monitor-enter p0
1372*795d594fSAndroid Build Coastguard Worker
1373*795d594fSAndroid Build Coastguard Worker  :try_start_9
1374*795d594fSAndroid Build Coastguard Worker  invoke-virtual {p0}, Ljava/lang/Object;->hashCode()I
1375*795d594fSAndroid Build Coastguard Worker  move-result v0
1376*795d594fSAndroid Build Coastguard Worker
1377*795d594fSAndroid Build Coastguard Worker  monitor-exit p0
1378*795d594fSAndroid Build Coastguard Worker  return v0
1379*795d594fSAndroid Build Coastguard Worker
1380*795d594fSAndroid Build Coastguard Worker  :catchall_11
1381*795d594fSAndroid Build Coastguard Worker  move-exception v0
1382*795d594fSAndroid Build Coastguard Worker  monitor-exit p0
1383*795d594fSAndroid Build Coastguard Worker  :try_end_15
1384*795d594fSAndroid Build Coastguard Worker  .catchall {:try_start_9 .. :try_end_15} :catchall_11
1385*795d594fSAndroid Build Coastguard Worker
1386*795d594fSAndroid Build Coastguard Worker  throw v0
1387*795d594fSAndroid Build Coastguard Worker.end method
1388