xref: /aosp_15_r20/art/test/485-checker-dce-loop-update/smali/TestCase.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*795d594fSAndroid Build Coastguard Worker#
7*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*795d594fSAndroid Build Coastguard Worker# limitations under the License.
14*795d594fSAndroid Build Coastguard Worker
15*795d594fSAndroid Build Coastguard Worker.class public 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