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