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 LTestCase; 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker.method public static $inline$True()Z 20*795d594fSAndroid Build Coastguard Worker .registers 1 21*795d594fSAndroid Build Coastguard Worker const/4 v0, 1 22*795d594fSAndroid Build Coastguard Worker return v0 23*795d594fSAndroid Build Coastguard Worker.end method 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testSingleExit(int, boolean) dead_code_elimination$after_inlining (before) 27*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 28*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 29*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1 30*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5 31*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 32*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 33*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 34*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>> 35*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>> 36*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 37*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testSingleExit(int, boolean) dead_code_elimination$after_inlining (after) 40*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 41*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 42*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 43*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<AddX:i\d+>>] loop:<<HeaderY:B\d+>> 44*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 45*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<AddX>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 46*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker.method public static testSingleExit(IZ)I 49*795d594fSAndroid Build Coastguard Worker .registers 3 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker # p0 = int X 52*795d594fSAndroid Build Coastguard Worker # p1 = boolean Y 53*795d594fSAndroid Build Coastguard Worker # v0 = true 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker invoke-static {}, LTestCase;->$inline$True()Z 56*795d594fSAndroid Build Coastguard Worker move-result v0 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker :loop_start 59*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_body # cannot be determined statically 60*795d594fSAndroid Build Coastguard Worker if-nez v0, :loop_end # will always exit 61*795d594fSAndroid Build Coastguard Worker 62*795d594fSAndroid Build Coastguard Worker # Dead block 63*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 5 64*795d594fSAndroid Build Coastguard Worker goto :loop_start 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker # Live block 67*795d594fSAndroid Build Coastguard Worker :loop_body 68*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 7 69*795d594fSAndroid Build Coastguard Worker goto :loop_start 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker :loop_end 72*795d594fSAndroid Build Coastguard Worker return p0 73*795d594fSAndroid Build Coastguard Worker.end method 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testMultipleExits(int, boolean, boolean) dead_code_elimination$after_inlining (before) 77*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 78*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 79*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 80*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1 81*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5 82*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 83*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 84*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 85*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgZ>>] loop:<<HeaderY>> 86*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>> 87*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>> 88*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 89*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testMultipleExits(int, boolean, boolean) dead_code_elimination$after_inlining (after) 92*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 93*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 94*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 95*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 96*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 97*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 98*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 99*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgZ>>] loop:none 100*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker.method public static testMultipleExits(IZZ)I 103*795d594fSAndroid Build Coastguard Worker .registers 4 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker # p0 = int X 106*795d594fSAndroid Build Coastguard Worker # p1 = boolean Y 107*795d594fSAndroid Build Coastguard Worker # p2 = boolean Z 108*795d594fSAndroid Build Coastguard Worker # v0 = true 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker invoke-static {}, LTestCase;->$inline$True()Z 111*795d594fSAndroid Build Coastguard Worker move-result v0 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker :loop_start 114*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_body # cannot be determined statically 115*795d594fSAndroid Build Coastguard Worker if-nez p2, :loop_end # may exit 116*795d594fSAndroid Build Coastguard Worker if-nez v0, :loop_end # will always exit 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker # Dead block 119*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 5 120*795d594fSAndroid Build Coastguard Worker goto :loop_start 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker # Live block 123*795d594fSAndroid Build Coastguard Worker :loop_body 124*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 7 125*795d594fSAndroid Build Coastguard Worker goto :loop_start 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker :loop_end 128*795d594fSAndroid Build Coastguard Worker return p0 129*795d594fSAndroid Build Coastguard Worker.end method 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) dead_code_elimination$after_inlining (before) 133*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 134*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 135*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 136*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1 137*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5 138*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 139*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst11:i\d+>> IntConstant 11 140*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 141*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 142*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Mul9:i\d+>> Mul [<<PhiX>>,<<Cst11>>] loop:<<HeaderY>> 143*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiY:i\d+>> Phi [<<PhiX>>,<<Mul9>>] loop:<<HeaderY>> 144*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>> 145*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add5>> Add [<<PhiY>>,<<Cst5>>] loop:<<HeaderY>> 146*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 147*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiY>>] loop:none 148*795d594fSAndroid Build Coastguard Worker 149*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) dead_code_elimination$after_inlining (after) 150*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 151*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 152*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 153*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 154*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst11:i\d+>> IntConstant 11 155*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 156*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 157*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 158*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Mul9:i\d+>> Mul [<<PhiX>>,<<Cst11>>] loop:none 159*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<PhiX>>,<<Mul9>>] loop:none 160*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Phi>>] loop:none 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) dead_code_elimination$after_inlining (after) 163*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: IntConstant 5 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) select_generator (after) 166*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 167*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 168*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 169*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 170*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst11:i\d+>> IntConstant 11 171*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 172*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 173*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 174*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Mul9:i\d+>> Mul [<<PhiX>>,<<Cst11>>] loop:none 175*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<SelX:i\d+>> Select [<<PhiX>>,<<Mul9>>,<<ArgZ>>] loop:none 176*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<SelX>>] loop:none 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker.method public static testExitPredecessors(IZZ)I 179*795d594fSAndroid Build Coastguard Worker .registers 4 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker # p0 = int X 182*795d594fSAndroid Build Coastguard Worker # p1 = boolean Y 183*795d594fSAndroid Build Coastguard Worker # p2 = boolean Z 184*795d594fSAndroid Build Coastguard Worker # v0 = true 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker invoke-static {}, LTestCase;->$inline$True()Z 187*795d594fSAndroid Build Coastguard Worker move-result v0 188*795d594fSAndroid Build Coastguard Worker 189*795d594fSAndroid Build Coastguard Worker :loop_start 190*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_body # cannot be determined statically 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker # Additional logic which will end up outside the loop 193*795d594fSAndroid Build Coastguard Worker if-eqz p2, :skip_if 194*795d594fSAndroid Build Coastguard Worker mul-int/lit8 p0, p0, 11 195*795d594fSAndroid Build Coastguard Worker :skip_if 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker if-nez v0, :loop_end # will always take the branch 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker # Dead block 200*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 5 201*795d594fSAndroid Build Coastguard Worker goto :loop_start 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker # Live block 204*795d594fSAndroid Build Coastguard Worker :loop_body 205*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 7 206*795d594fSAndroid Build Coastguard Worker goto :loop_start 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker :loop_end 209*795d594fSAndroid Build Coastguard Worker return p0 210*795d594fSAndroid Build Coastguard Worker.end method 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testInnerLoop(int, boolean, boolean) dead_code_elimination$after_inlining (before) 214*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 215*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 216*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 217*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst0:i\d+>> IntConstant 0 218*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1 219*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5 220*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 221*795d594fSAndroid Build Coastguard Worker# 222*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 223*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiZ1:i\d+>> Phi [<<ArgZ>>,<<XorZ:i\d+>>,<<PhiZ1>>] loop:<<HeaderY>> 224*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 225*795d594fSAndroid Build Coastguard Worker# 226*795d594fSAndroid Build Coastguard Worker# ### Inner loop ### 227*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiZ2:i\d+>> Phi [<<PhiZ1>>,<<Cst0>>] loop:<<HeaderZ:B\d+>> 228*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<XorZ>> Xor [<<PhiZ2>>,<<Cst1>>] loop:<<HeaderZ>> 229*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<CondZ:z\d+>> Equal [<<XorZ>>,<<Cst0>>] loop:<<HeaderZ>> 230*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<CondZ>>] loop:<<HeaderZ>> 231*795d594fSAndroid Build Coastguard Worker# 232*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>> 233*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 234*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker## CHECK-START: int TestCase.testInnerLoop(int, boolean, boolean) dead_code_elimination$after_inlining (after) 237*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgX:i\d+>> ParameterValue 238*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgY:z\d+>> ParameterValue 239*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue 240*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst0:i\d+>> IntConstant 0 241*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1 242*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7 243*795d594fSAndroid Build Coastguard Worker# 244*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>> 245*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>> 246*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>> 247*795d594fSAndroid Build Coastguard Worker# 248*795d594fSAndroid Build Coastguard Worker# ### Inner loop ### 249*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<PhiZ:i\d+>> Phi [<<ArgZ>>,<<Cst0>>] loop:<<HeaderZ:B\d+>> 250*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<XorZ:i\d+>> Xor [<<PhiZ>>,<<Cst1>>] loop:<<HeaderZ>> 251*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<CondZ:z\d+>> Equal [<<XorZ>>,<<Cst0>>] loop:<<HeaderZ>> 252*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<CondZ>>] loop:<<HeaderZ>> 253*795d594fSAndroid Build Coastguard Worker# 254*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<PhiX>>] loop:none 255*795d594fSAndroid Build Coastguard Worker 256*795d594fSAndroid Build Coastguard Worker.method public static testInnerLoop(IZZ)I 257*795d594fSAndroid Build Coastguard Worker .registers 4 258*795d594fSAndroid Build Coastguard Worker 259*795d594fSAndroid Build Coastguard Worker # p0 = int X 260*795d594fSAndroid Build Coastguard Worker # p1 = boolean Y 261*795d594fSAndroid Build Coastguard Worker # p2 = boolean Z 262*795d594fSAndroid Build Coastguard Worker # v0 = true 263*795d594fSAndroid Build Coastguard Worker 264*795d594fSAndroid Build Coastguard Worker invoke-static {}, LTestCase;->$inline$True()Z 265*795d594fSAndroid Build Coastguard Worker move-result v0 266*795d594fSAndroid Build Coastguard Worker 267*795d594fSAndroid Build Coastguard Worker :loop_start 268*795d594fSAndroid Build Coastguard Worker if-eqz p1, :loop_body # cannot be determined statically 269*795d594fSAndroid Build Coastguard Worker 270*795d594fSAndroid Build Coastguard Worker # Inner loop which will end up outside its parent 271*795d594fSAndroid Build Coastguard Worker :inner_loop_start 272*795d594fSAndroid Build Coastguard Worker xor-int/lit8 p2, p2, 1 273*795d594fSAndroid Build Coastguard Worker if-eqz p2, :inner_loop_start 274*795d594fSAndroid Build Coastguard Worker 275*795d594fSAndroid Build Coastguard Worker if-nez v0, :loop_end # will always take the branch 276*795d594fSAndroid Build Coastguard Worker 277*795d594fSAndroid Build Coastguard Worker # Dead block 278*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 5 279*795d594fSAndroid Build Coastguard Worker goto :loop_start 280*795d594fSAndroid Build Coastguard Worker 281*795d594fSAndroid Build Coastguard Worker # Live block 282*795d594fSAndroid Build Coastguard Worker :loop_body 283*795d594fSAndroid Build Coastguard Worker add-int/lit8 p0, p0, 7 284*795d594fSAndroid Build Coastguard Worker goto :loop_start 285*795d594fSAndroid Build Coastguard Worker 286*795d594fSAndroid Build Coastguard Worker :loop_end 287*795d594fSAndroid Build Coastguard Worker return p0 288*795d594fSAndroid Build Coastguard Worker.end method 289