blob: 056f22c71c6cb273c95fb097b6dd99453b302b51 [file] [log] [blame]
David Brazdila4b8c212015-05-07 09:59:30 +01001# Copyright (C) 2015 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15.class public LTestCase;
16
17.super Ljava/lang/Object;
18
19.method public static $inline$True()Z
20 .registers 1
21 const/4 v0, 1
22 return v0
23.end method
24
25
David Brazdila06d66a2015-05-28 11:14:54 +010026## CHECK-START: int TestCase.testSingleExit(int, boolean) dead_code_elimination_final (before)
27## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
28## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
29## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1
30## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5
31## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
32## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
33## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
34## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>>
35## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>>
36## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
37## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +010038
David Brazdila06d66a2015-05-28 11:14:54 +010039## CHECK-START: int TestCase.testSingleExit(int, boolean) dead_code_elimination_final (after)
40## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
41## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
42## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
43## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<AddX:i\d+>>] loop:<<HeaderY:B\d+>>
44## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
45## CHECK-DAG: <<AddX>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
46## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +010047
48.method public static testSingleExit(IZ)I
49 .registers 3
50
51 # p0 = int X
52 # p1 = boolean Y
53 # v0 = true
54
55 invoke-static {}, LTestCase;->$inline$True()Z
56 move-result v0
57
58 :loop_start
59 if-eqz p1, :loop_body # cannot be determined statically
60 if-nez v0, :loop_end # will always exit
61
62 # Dead block
63 add-int/lit8 p0, p0, 5
64 goto :loop_start
65
66 # Live block
67 :loop_body
68 add-int/lit8 p0, p0, 7
69 goto :loop_start
70
71 :loop_end
72 return p0
73.end method
74
75
David Brazdila06d66a2015-05-28 11:14:54 +010076## CHECK-START: int TestCase.testMultipleExits(int, boolean, boolean) dead_code_elimination_final (before)
77## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
78## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
79## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
80## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1
81## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5
82## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
83## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
84## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
85## CHECK-DAG: If [<<ArgZ>>] loop:<<HeaderY>>
86## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>>
87## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>>
88## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
89## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +010090
David Brazdila06d66a2015-05-28 11:14:54 +010091## CHECK-START: int TestCase.testMultipleExits(int, boolean, boolean) dead_code_elimination_final (after)
92## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
93## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
94## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
95## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
96## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
97## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
98## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
99## CHECK-DAG: If [<<ArgZ>>] loop:none
100## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +0100101
102.method public static testMultipleExits(IZZ)I
103 .registers 4
104
105 # p0 = int X
106 # p1 = boolean Y
107 # p2 = boolean Z
108 # v0 = true
109
110 invoke-static {}, LTestCase;->$inline$True()Z
111 move-result v0
112
113 :loop_start
114 if-eqz p1, :loop_body # cannot be determined statically
115 if-nez p2, :loop_end # may exit
116 if-nez v0, :loop_end # will always exit
117
118 # Dead block
119 add-int/lit8 p0, p0, 5
120 goto :loop_start
121
122 # Live block
123 :loop_body
124 add-int/lit8 p0, p0, 7
125 goto :loop_start
126
127 :loop_end
128 return p0
129.end method
130
131
David Brazdila06d66a2015-05-28 11:14:54 +0100132## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) dead_code_elimination_final (before)
133## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
134## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
135## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
136## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1
137## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5
138## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
Alexandre Rames38db7852015-11-20 15:02:45 +0000139## CHECK-DAG: <<Cst11:i\d+>> IntConstant 11
David Brazdil74eb1b22015-12-14 11:44:01 +0000140## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
David Brazdila06d66a2015-05-28 11:14:54 +0100141## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
David Brazdil74eb1b22015-12-14 11:44:01 +0000142## CHECK-DAG: <<Mul9:i\d+>> Mul [<<PhiX>>,<<Cst11>>] loop:<<HeaderY>>
143## CHECK-DAG: <<SelX:i\d+>> Select [<<PhiX>>,<<Mul9>>,<<ArgZ>>] loop:<<HeaderY>>
David Brazdila06d66a2015-05-28 11:14:54 +0100144## CHECK-DAG: If [<<Cst1>>] loop:<<HeaderY>>
David Brazdil74eb1b22015-12-14 11:44:01 +0000145## CHECK-DAG: <<Add5>> Add [<<SelX>>,<<Cst5>>] loop:<<HeaderY>>
146## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
147## CHECK-DAG: Return [<<SelX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +0100148
David Brazdila06d66a2015-05-28 11:14:54 +0100149## CHECK-START: int TestCase.testExitPredecessors(int, boolean, boolean) dead_code_elimination_final (after)
150## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
151## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
152## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
153## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
Alexandre Rames38db7852015-11-20 15:02:45 +0000154## CHECK-DAG: <<Cst11:i\d+>> IntConstant 11
David Brazdil74eb1b22015-12-14 11:44:01 +0000155## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
David Brazdila06d66a2015-05-28 11:14:54 +0100156## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
David Brazdil74eb1b22015-12-14 11:44:01 +0000157## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
158## CHECK-DAG: <<Mul9:i\d+>> Mul [<<PhiX>>,<<Cst11>>] loop:none
159## CHECK-DAG: <<SelX:i\d+>> Select [<<PhiX>>,<<Mul9>>,<<ArgZ>>] loop:none
160## CHECK-DAG: Return [<<SelX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +0100161
162.method public static testExitPredecessors(IZZ)I
163 .registers 4
164
165 # p0 = int X
166 # p1 = boolean Y
167 # p2 = boolean Z
168 # v0 = true
169
170 invoke-static {}, LTestCase;->$inline$True()Z
171 move-result v0
172
173 :loop_start
174 if-eqz p1, :loop_body # cannot be determined statically
175
176 # Additional logic which will end up outside the loop
177 if-eqz p2, :skip_if
Alexandre Rames38db7852015-11-20 15:02:45 +0000178 mul-int/lit8 p0, p0, 11
David Brazdila4b8c212015-05-07 09:59:30 +0100179 :skip_if
180
181 if-nez v0, :loop_end # will always take the branch
182
183 # Dead block
184 add-int/lit8 p0, p0, 5
185 goto :loop_start
186
187 # Live block
188 :loop_body
189 add-int/lit8 p0, p0, 7
190 goto :loop_start
191
192 :loop_end
193 return p0
194.end method
195
196
David Brazdila06d66a2015-05-28 11:14:54 +0100197## CHECK-START: int TestCase.testInnerLoop(int, boolean, boolean) dead_code_elimination_final (before)
198## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
199## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
200## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
201## CHECK-DAG: <<Cst0:i\d+>> IntConstant 0
202## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1
203## CHECK-DAG: <<Cst5:i\d+>> IntConstant 5
204## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
David Brazdila4b8c212015-05-07 09:59:30 +0100205#
David Brazdila06d66a2015-05-28 11:14:54 +0100206## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add5:i\d+>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
207## CHECK-DAG: <<PhiZ1:i\d+>> Phi [<<ArgZ>>,<<XorZ:i\d+>>,<<PhiZ1>>] loop:<<HeaderY>>
208## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
David Brazdila4b8c212015-05-07 09:59:30 +0100209#
David Brazdila06d66a2015-05-28 11:14:54 +0100210# ### Inner loop ###
211## CHECK-DAG: <<PhiZ2:i\d+>> Phi [<<PhiZ1>>,<<XorZ>>] loop:<<HeaderZ:B\d+>>
212## CHECK-DAG: <<XorZ>> Xor [<<PhiZ2>>,<<Cst1>>] loop:<<HeaderZ>>
213## CHECK-DAG: <<CondZ:z\d+>> Equal [<<XorZ>>,<<Cst0>>] loop:<<HeaderZ>>
214## CHECK-DAG: If [<<CondZ>>] loop:<<HeaderZ>>
David Brazdila4b8c212015-05-07 09:59:30 +0100215#
David Brazdila06d66a2015-05-28 11:14:54 +0100216## CHECK-DAG: <<Add5>> Add [<<PhiX>>,<<Cst5>>] loop:<<HeaderY>>
217## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
218## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +0100219
David Brazdila06d66a2015-05-28 11:14:54 +0100220## CHECK-START: int TestCase.testInnerLoop(int, boolean, boolean) dead_code_elimination_final (after)
221## CHECK-DAG: <<ArgX:i\d+>> ParameterValue
222## CHECK-DAG: <<ArgY:z\d+>> ParameterValue
223## CHECK-DAG: <<ArgZ:z\d+>> ParameterValue
224## CHECK-DAG: <<Cst0:i\d+>> IntConstant 0
225## CHECK-DAG: <<Cst1:i\d+>> IntConstant 1
226## CHECK-DAG: <<Cst7:i\d+>> IntConstant 7
David Brazdila4b8c212015-05-07 09:59:30 +0100227#
David Brazdila06d66a2015-05-28 11:14:54 +0100228## CHECK-DAG: <<PhiX:i\d+>> Phi [<<ArgX>>,<<Add7:i\d+>>] loop:<<HeaderY:B\d+>>
229## CHECK-DAG: If [<<ArgY>>] loop:<<HeaderY>>
230## CHECK-DAG: <<Add7>> Add [<<PhiX>>,<<Cst7>>] loop:<<HeaderY>>
David Brazdila4b8c212015-05-07 09:59:30 +0100231#
David Brazdila06d66a2015-05-28 11:14:54 +0100232# ### Inner loop ###
233## CHECK-DAG: <<PhiZ:i\d+>> Phi [<<ArgZ>>,<<XorZ:i\d+>>] loop:<<HeaderZ:B\d+>>
234## CHECK-DAG: <<XorZ>> Xor [<<PhiZ>>,<<Cst1>>] loop:<<HeaderZ>>
235## CHECK-DAG: <<CondZ:z\d+>> Equal [<<XorZ>>,<<Cst0>>] loop:<<HeaderZ>>
236## CHECK-DAG: If [<<CondZ>>] loop:<<HeaderZ>>
David Brazdila4b8c212015-05-07 09:59:30 +0100237#
David Brazdila06d66a2015-05-28 11:14:54 +0100238## CHECK-DAG: Return [<<PhiX>>] loop:none
David Brazdila4b8c212015-05-07 09:59:30 +0100239
240.method public static testInnerLoop(IZZ)I
241 .registers 4
242
243 # p0 = int X
244 # p1 = boolean Y
245 # p2 = boolean Z
246 # v0 = true
247
248 invoke-static {}, LTestCase;->$inline$True()Z
249 move-result v0
250
251 :loop_start
252 if-eqz p1, :loop_body # cannot be determined statically
253
254 # Inner loop which will end up outside its parent
255 :inner_loop_start
256 xor-int/lit8 p2, p2, 1
257 if-eqz p2, :inner_loop_start
258
259 if-nez v0, :loop_end # will always take the branch
260
261 # Dead block
262 add-int/lit8 p0, p0, 5
263 goto :loop_start
264
265 # Live block
266 :loop_body
267 add-int/lit8 p0, p0, 7
268 goto :loop_start
269
270 :loop_end
271 return p0
272.end method