blob: b5606bd4068f4a0933c99d30710e82cba8ee77c4 [file] [log] [blame]
Aart Bik281c6812016-08-26 11:31:48 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18 * Tests on loop optimizations related to induction.
19 */
20public class Main {
21
22 static int[] a = new int[10];
23
24 /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
25 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
26 //
27 /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
28 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
29 static void deadSingleLoop() {
30 for (int i = 0; i < 4; i++) {
31 }
32 }
33
Aart Bik9abf8942016-10-14 09:49:42 -070034 /// CHECK-START: void Main.deadSingleLoop() loop_optimization (before)
35 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
36 //
37 /// CHECK-START: void Main.deadSingleLoop() loop_optimization (after)
38 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
39 static void deadSingleLoopN(int n) {
40 for (int i = 0; i < n; i++) {
41 }
42 }
43
44 /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (before)
45 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
46 //
47 /// CHECK-START: void Main.potentialInfiniteLoop(int) loop_optimization (after)
48 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
49 static void potentialInfiniteLoop(int n) {
50 for (int i = 0; i <= n; i++) { // loops forever when n = MAX_INT
51 }
52 }
53
Aart Bik281c6812016-08-26 11:31:48 -070054 /// CHECK-START: void Main.deadNestedLoops() loop_optimization (before)
55 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
56 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop>>
57 //
58 /// CHECK-START: void Main.deadNestedLoops() loop_optimization (after)
59 /// CHECK-NOT: Phi loop:{{B\d+}}
60 static void deadNestedLoops() {
61 for (int i = 0; i < 4; i++) {
62 for (int j = 0; j < 4; j++) {
63 }
64 }
65 }
66
67 /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (before)
68 /// CHECK-DAG: Phi loop:<<Loop1:B\d+>> outer_loop:none
69 /// CHECK-DAG: Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
70 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
71 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop2>>
72 /// CHECK-DAG: Phi loop:<<Loop3:B\d+>> outer_loop:<<Loop1>>
73 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:<<Loop3>>
74 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
75 //
76 /// CHECK-START: void Main.deadNestedAndFollowingLoops() loop_optimization (after)
77 /// CHECK-NOT: Phi loop:{{B\d+}}
78 static void deadNestedAndFollowingLoops() {
79 for (int i = 0; i < 4; i++) {
80 for (int j = 0; j < 4; j++) {
81 for (int k = 0; k < 4; k++) {
82 }
83 for (int k = 0; k < 4; k++) {
84 }
85 }
86 for (int j = 0; j < 4; j++) {
87 for (int k = 0; k < 4; k++) {
88 }
89 }
90 }
91 for (int i = 0; i < 4; i++) {
92 }
93 }
94
95 /// CHECK-START: void Main.deadInduction() loop_optimization (before)
96 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
97 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
98 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
99 //
100 /// CHECK-START: void Main.deadInduction() loop_optimization (after)
101 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
102 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
103 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
104 static void deadInduction() {
105 int dead = 0;
106 for (int i = 0; i < a.length; i++) {
107 a[i] = 1;
108 dead += 5;
109 }
110 }
111
112 /// CHECK-START: void Main.deadManyInduction() loop_optimization (before)
113 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
114 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
115 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
116 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
117 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
118 //
119 /// CHECK-START: void Main.deadManyInduction() loop_optimization (after)
120 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
121 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
122 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
123 static void deadManyInduction() {
124 int dead1 = 0, dead2 = 1, dead3 = 3;
125 for (int i = 0; i < a.length; i++) {
126 dead1 += 5;
127 a[i] = 2;
128 dead2 += 10;
129 dead3 += 100;
130 }
131 }
132
133 /// CHECK-START: void Main.deadSequence() loop_optimization (before)
134 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
135 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
136 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
137 //
138 /// CHECK-START: void Main.deadSequence() loop_optimization (after)
139 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
140 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
141 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
142 static void deadSequence() {
143 int dead = 0;
144 for (int i = 0; i < a.length; i++) {
145 a[i] = 3;
146 // Increment value defined inside loop,
147 // but sequence itself not used anywhere.
148 dead += i;
149 }
150 }
151
152 /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (before)
153 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
154 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
155 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
156 /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700157 /// CHECK-NOT: BoundsCheck
Aart Bik281c6812016-08-26 11:31:48 -0700158 //
159 /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (after)
160 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
161 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
162 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700163 /// CHECK-NOT: ArrayGet loop:<<Loop>> outer_loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700164 static void deadCycleWithException(int k) {
165 int dead = 0;
166 for (int i = 0; i < a.length; i++) {
167 a[i] = 4;
Aart Bik482095d2016-10-10 15:39:10 -0700168 // Increment value of dead cycle may throw exception. Dynamic
169 // BCE takes care of the bounds check though, which enables
170 // removing the ArrayGet after removing the dead cycle.
Aart Bik281c6812016-08-26 11:31:48 -0700171 dead += a[k];
172 }
173 }
174
175 /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (before)
176 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
177 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
178 /// CHECK-DAG: Return [<<Phi1>>] loop:none
179 //
180 /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (after)
Aart Bik8c4a8542016-10-06 11:36:57 -0700181 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700182 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700183 //
184 /// CHECK-START: int Main.closedFormInductionUp() instruction_simplifier$after_bce (after)
185 /// CHECK-DAG: <<Int:i\d+>> IntConstant 12395
186 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700187 static int closedFormInductionUp() {
188 int closed = 12345;
189 for (int i = 0; i < 10; i++) {
190 closed += 5;
191 }
192 return closed; // only needs last value
193 }
194
195 /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (before)
196 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
197 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
198 /// CHECK-DAG: Return [<<Phi2>>] loop:none
199 //
200 /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (after)
Aart Bik8c4a8542016-10-06 11:36:57 -0700201 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700202 /// CHECK-DAG: Return loop:none
203 static int closedFormInductionInAndDown(int closed) {
204 for (int i = 0; i < 10; i++) {
205 closed -= 5;
206 }
207 return closed; // only needs last value
208 }
209
Aart Bik482095d2016-10-10 15:39:10 -0700210 /// CHECK-START: int Main.closedFormNested() loop_optimization (before)
211 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
212 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
213 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
214 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
215 /// CHECK-DAG: Return [<<Phi1>>] loop:none
216 //
217 /// CHECK-START: int Main.closedFormNested() loop_optimization (after)
218 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
219 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:loop{{B\d+}}
220 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700221 //
222 /// CHECK-START: int Main.closedFormNested() instruction_simplifier$after_bce (after)
223 /// CHECK-DAG: <<Int:i\d+>> IntConstant 100
224 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700225 static int closedFormNested() {
226 int closed = 0;
227 for (int i = 0; i < 10; i++) {
228 for (int j = 0; j < 10; j++) {
229 closed++;
230 }
231 }
232 return closed; // only needs last-value
233 }
234
Aart Bik482095d2016-10-10 15:39:10 -0700235 /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (before)
236 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
237 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
238 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
239 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
240 /// CHECK-DAG: Return [<<Phi1>>] loop:none
241 //
242 /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (after)
243 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
244 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:loop{{B\d+}}
245 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700246 //
247 /// CHECK-START: int Main.closedFormNestedAlt() instruction_simplifier$after_bce (after)
248 /// CHECK-DAG: <<Int:i\d+>> IntConstant 15082
249 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700250 static int closedFormNestedAlt() {
251 int closed = 12345;
252 for (int i = 0; i < 17; i++) {
253 for (int j = 0; j < 23; j++) {
254 closed += 7;
255 }
256 }
257 return closed; // only needs last-value
258 }
259
Aart Bik281c6812016-08-26 11:31:48 -0700260 // TODO: taken test around closed form?
261 static int closedFormInductionUpN(int n) {
262 int closed = 12345;
263 for (int i = 0; i < n; i++) {
264 closed += 5;
265 }
266 return closed; // only needs last value
267 }
268
269 // TODO: taken test around closed form?
270 static int closedFormInductionInAndDownN(int closed, int n) {
271 for (int i = 0; i < n; i++) {
272 closed -= 5;
273 }
274 return closed; // only needs last value
275 }
276
277 // TODO: move closed form even further out?
Aart Bik8c4a8542016-10-06 11:36:57 -0700278 static int closedFormNestedN(int n) {
Aart Bik281c6812016-08-26 11:31:48 -0700279 int closed = 0;
280 for (int i = 0; i < n; i++) {
281 for (int j = 0; j < 10; j++) {
282 closed++;
283 }
284 }
285 return closed; // only needs last-value
286 }
287
Aart Bik8c4a8542016-10-06 11:36:57 -0700288 // TODO: move closed form even further out?
Aart Bik482095d2016-10-10 15:39:10 -0700289 static int closedFormNestedNAlt(int n) {
290 int closed = 12345;
Aart Bik8c4a8542016-10-06 11:36:57 -0700291 for (int i = 0; i < n; i++) {
Aart Bik482095d2016-10-10 15:39:10 -0700292 for (int j = 0; j < 23; j++) {
293 closed += 7;
294 }
295 }
296 return closed; // only needs last-value
297 }
298
299 // TODO: move closed form even further out?
300 static int closedFormNestedMN(int m, int n) {
301 int closed = 0;
302 for (int i = 0; i < m; i++) {
Aart Bik8c4a8542016-10-06 11:36:57 -0700303 for (int j = 0; j < n; j++) {
304 closed++;
305 }
306 }
307 return closed; // only needs last-value
308 }
309
Aart Bik482095d2016-10-10 15:39:10 -0700310 // TODO: move closed form even further out?
311 static int closedFormNestedMNAlt(int m, int n) {
312 int closed = 12345;
313 for (int i = 0; i < m; i++) {
314 for (int j = 0; j < n; j++) {
315 closed += 7;
316 }
317 }
318 return closed; // only needs last-value
319 }
320
Aart Bik8c4a8542016-10-06 11:36:57 -0700321 /// CHECK-START: int Main.mainIndexReturned() loop_optimization (before)
322 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:{{B\d+}} outer_loop:none
323 /// CHECK-DAG: Return [<<Phi>>] loop:none
324 //
325 /// CHECK-START: int Main.mainIndexReturned() loop_optimization (after)
326 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
327 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700328 //
329 /// CHECK-START: int Main.mainIndexReturned() instruction_simplifier$after_bce (after)
330 /// CHECK-DAG: <<Int:i\d+>> IntConstant 10
331 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700332 static int mainIndexReturned() {
Aart Bik281c6812016-08-26 11:31:48 -0700333 int i;
Aart Bik8c4a8542016-10-06 11:36:57 -0700334 for (i = 0; i < 10; i++);
Aart Bik281c6812016-08-26 11:31:48 -0700335 return i;
336 }
337
Aart Bik9abf8942016-10-14 09:49:42 -0700338 /// CHECK-START: int Main.periodicReturned9() loop_optimization (before)
339 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
340 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
341 /// CHECK-DAG: Return [<<Phi2>>] loop:none
342 //
343 /// CHECK-START: int Main.periodicReturned9() loop_optimization (after)
344 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
345 /// CHECK-DAG: Return loop:none
346 //
347 /// CHECK-START: int Main.periodicReturned9() instruction_simplifier$after_bce (after)
348 /// CHECK-DAG: <<Int:i\d+>> IntConstant 1
349 /// CHECK-DAG: Return [<<Int>>] loop:none
350 static int periodicReturned9() {
Aart Bik281c6812016-08-26 11:31:48 -0700351 int k = 0;
Aart Bik8c4a8542016-10-06 11:36:57 -0700352 for (int i = 0; i < 9; i++) {
Aart Bik281c6812016-08-26 11:31:48 -0700353 k = 1 - k;
354 }
355 return k;
356 }
357
Aart Bik9abf8942016-10-14 09:49:42 -0700358 /// CHECK-START: int Main.periodicReturned10() loop_optimization (before)
359 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
360 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
361 /// CHECK-DAG: Return [<<Phi2>>] loop:none
362 //
363 /// CHECK-START: int Main.periodicReturned10() loop_optimization (after)
364 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
365 /// CHECK-DAG: Return loop:none
366 //
367 /// CHECK-START: int Main.periodicReturned10() instruction_simplifier$after_bce (after)
368 /// CHECK-DAG: <<Int:i\d+>> IntConstant 0
369 /// CHECK-DAG: Return [<<Int>>] loop:none
370 static int periodicReturned10() {
371 int k = 0;
372 for (int i = 0; i < 10; i++) {
373 k = 1 - k;
374 }
375 return k;
376 }
377
Aart Bik8c4a8542016-10-06 11:36:57 -0700378 // If ever replaced by closed form, last value should be correct!
Aart Bik281c6812016-08-26 11:31:48 -0700379 private static int getSum21() {
380 int k = 0;
381 int sum = 0;
382 for (int i = 0; i < 6; i++) {
383 k++;
384 sum += k;
385 }
386 return sum;
387 }
388
Aart Bik8c4a8542016-10-06 11:36:57 -0700389 // TODO: handle as closed/empty eventually?
390 static int mainIndexReturnedN(int n) {
391 int i;
392 for (i = 0; i < n; i++);
393 return i;
394 }
395
Aart Bik9abf8942016-10-14 09:49:42 -0700396 /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (before)
397 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
398 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
399 /// CHECK-DAG: Return [<<Phi2>>] loop:none
400 //
401 /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (after)
402 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
403 /// CHECK-DAG: Return loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700404 static int periodicReturnedN(int n) {
405 int k = 0;
406 for (int i = 0; i < n; i++) {
407 k = 1 - k;
408 }
409 return k;
410 }
411
412 // If ever replaced by closed form, last value should be correct!
413 private static int getSumN(int n) {
414 int k = 0;
415 int sum = 0;
416 for (int i = 0; i < n; i++) {
417 k++;
418 sum += k;
419 }
420 return sum;
421 }
422
423 // If ever replaced by closed form, last value should be correct!
Aart Bik281c6812016-08-26 11:31:48 -0700424 private static int closedTwice() {
425 int closed = 0;
426 for (int i = 0; i < 10; i++) {
427 closed++;
428 }
429 // Closed form of first loop defines trip count of second loop.
430 int other_closed = 0;
431 for (int i = 0; i < closed; i++) {
432 other_closed++;
433 }
434 return other_closed;
435 }
436
437 /// CHECK-START: int Main.closedFeed() loop_optimization (before)
438 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
439 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
440 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
441 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:none
442 /// CHECK-DAG: Return [<<Phi3>>] loop:none
443 /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
444 //
445 /// CHECK-START: int Main.closedFeed() loop_optimization (after)
Aart Bik8c4a8542016-10-06 11:36:57 -0700446 /// CHECK-NOT: Phi loop:{{B\d+}} outer_loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700447 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700448 //
449 /// CHECK-START: int Main.closedFeed() instruction_simplifier$after_bce (after)
450 /// CHECK-DAG: <<Int:i\d+>> IntConstant 20
451 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700452 private static int closedFeed() {
453 int closed = 0;
454 for (int i = 0; i < 10; i++) {
455 closed++;
456 }
457 // Closed form of first loop feeds into initial value of second loop,
458 // used when generating closed form for the latter.
459 for (int i = 0; i < 10; i++) {
460 closed++;
461 }
462 return closed;
463 }
464
465 /// CHECK-START: int Main.closedLargeUp() loop_optimization (before)
466 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
467 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
468 /// CHECK-DAG: Return [<<Phi1>>] loop:none
469 //
470 /// CHECK-START: int Main.closedLargeUp() loop_optimization (after)
471 /// CHECK-NOT: Phi loop:B\d+ outer_loop:none
472 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700473 //
474 /// CHECK-START: int Main.closedLargeUp() instruction_simplifier$after_bce (after)
475 /// CHECK-DAG: <<Int:i\d+>> IntConstant -10
476 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700477 private static int closedLargeUp() {
478 int closed = 0;
479 for (int i = 0; i < 10; i++) {
480 closed += 0x7fffffff;
481 }
482 return closed;
483 }
484
485 /// CHECK-START: int Main.closedLargeDown() loop_optimization (before)
486 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
487 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
488 /// CHECK-DAG: Return [<<Phi1>>] loop:none
489 //
490 /// CHECK-START: int Main.closedLargeDown() loop_optimization (after)
491 /// CHECK-NOT: Phi loop:B\d+ outer_loop:none
492 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700493 //
494 /// CHECK-START: int Main.closedLargeDown() instruction_simplifier$after_bce (after)
495 /// CHECK-DAG: <<Int:i\d+>> IntConstant 10
496 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700497 private static int closedLargeDown() {
498 int closed = 0;
499 for (int i = 0; i < 10; i++) {
500 closed -= 0x7fffffff;
501 }
502 return closed;
503 }
504
Aart Bik8c4a8542016-10-06 11:36:57 -0700505 /// CHECK-START: int Main.waterFall() loop_optimization (before)
506 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
507 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
508 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop3:B\d+>> outer_loop:none
509 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop4:B\d+>> outer_loop:none
510 /// CHECK-DAG: <<Phi5:i\d+>> Phi loop:<<Loop5:B\d+>> outer_loop:none
511 /// CHECK-DAG: Return [<<Phi5>>] loop:none
512 //
513 /// CHECK-START: int Main.waterFall() loop_optimization (after)
514 /// CHECK-NOT: Phi loop:B\d+ outer_loop:none
515 /// CHECK-DAG: Return loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700516 //
517 /// CHECK-START: int Main.waterFall() instruction_simplifier$after_bce (after)
518 /// CHECK-DAG: <<Int:i\d+>> IntConstant 50
519 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700520 private static int waterFall() {
521 int i = 0;
522 for (; i < 10; i++);
523 for (; i < 20; i++);
524 for (; i < 30; i++);
525 for (; i < 40; i++);
526 for (; i < 50; i++);
527 return i; // this should become just 50
528 }
529
Aart Bik281c6812016-08-26 11:31:48 -0700530 private static int exceptionExitBeforeAdd() {
531 int k = 0;
532 try {
533 for (int i = 0; i < 10; i++) {
534 a[i] = 0;
535 k += 10; // increment last
536 }
537 } catch(Exception e) {
538 // Flag error by returning current
539 // value of k negated.
540 return -k-1;
541 }
542 return k;
543 }
544
545 private static int exceptionExitAfterAdd() {
546 int k = 0;
547 try {
548 for (int i = 0; i < 10; i++) {
549 k += 10; // increment first
550 a[i] = 0;
551 }
552 } catch(Exception e) {
553 // Flag error by returning current
554 // value of k negated.
555 return -k-1;
556 }
557 return k;
558 }
559
560 public static void main(String[] args) {
561 deadSingleLoop();
Aart Bik9abf8942016-10-14 09:49:42 -0700562 deadSingleLoopN(4);
563 potentialInfiniteLoop(4);
Aart Bik281c6812016-08-26 11:31:48 -0700564 deadNestedLoops();
565 deadNestedAndFollowingLoops();
566
567 deadInduction();
568 for (int i = 0; i < a.length; i++) {
569 expectEquals(1, a[i]);
570 }
571 deadManyInduction();
572 for (int i = 0; i < a.length; i++) {
573 expectEquals(2, a[i]);
574 }
575 deadSequence();
576 for (int i = 0; i < a.length; i++) {
577 expectEquals(3, a[i]);
578 }
579 try {
580 deadCycleWithException(-1);
581 throw new Error("Expected: IOOB exception");
582 } catch (IndexOutOfBoundsException e) {
583 }
584 for (int i = 0; i < a.length; i++) {
585 expectEquals(i == 0 ? 4 : 3, a[i]);
586 }
587 deadCycleWithException(0);
588 for (int i = 0; i < a.length; i++) {
589 expectEquals(4, a[i]);
590 }
591
Aart Bik8c4a8542016-10-06 11:36:57 -0700592 expectEquals(12395, closedFormInductionUp());
593 expectEquals(12295, closedFormInductionInAndDown(12345));
594 expectEquals(10 * 10, closedFormNested());
Aart Bik482095d2016-10-10 15:39:10 -0700595 expectEquals(12345 + 17 * 23 * 7, closedFormNestedAlt());
Aart Bik281c6812016-08-26 11:31:48 -0700596 for (int n = -4; n < 10; n++) {
597 int tc = (n <= 0) ? 0 : n;
Aart Bik8c4a8542016-10-06 11:36:57 -0700598 expectEquals(12345 + tc * 5, closedFormInductionUpN(n));
599 expectEquals(12345 - tc * 5, closedFormInductionInAndDownN(12345, n));
600 expectEquals(tc * 10, closedFormNestedN(n));
Aart Bik482095d2016-10-10 15:39:10 -0700601 expectEquals(12345 + tc * 23 * 7, closedFormNestedNAlt(n));
602 expectEquals(tc * (tc + 1), closedFormNestedMN(n, n + 1));
603 expectEquals(12345 + tc * (tc + 1) * 7, closedFormNestedMNAlt(n, n + 1));
Aart Bik281c6812016-08-26 11:31:48 -0700604 }
605
Aart Bik8c4a8542016-10-06 11:36:57 -0700606 expectEquals(10, mainIndexReturned());
Aart Bik9abf8942016-10-14 09:49:42 -0700607 expectEquals(1, periodicReturned9());
608 expectEquals(0, periodicReturned10());
Aart Bik8c4a8542016-10-06 11:36:57 -0700609 expectEquals(21, getSum21());
Aart Bik281c6812016-08-26 11:31:48 -0700610 for (int n = -4; n < 4; n++) {
611 int tc = (n <= 0) ? 0 : n;
Aart Bik8c4a8542016-10-06 11:36:57 -0700612 expectEquals(tc, mainIndexReturnedN(n));
613 expectEquals(tc & 1, periodicReturnedN(n));
614 expectEquals((tc * (tc + 1)) / 2, getSumN(n));
Aart Bik281c6812016-08-26 11:31:48 -0700615 }
Aart Bik8c4a8542016-10-06 11:36:57 -0700616
Aart Bik281c6812016-08-26 11:31:48 -0700617 expectEquals(10, closedTwice());
618 expectEquals(20, closedFeed());
619 expectEquals(-10, closedLargeUp());
620 expectEquals(10, closedLargeDown());
Aart Bik8c4a8542016-10-06 11:36:57 -0700621 expectEquals(50, waterFall());
Aart Bik281c6812016-08-26 11:31:48 -0700622
623 expectEquals(100, exceptionExitBeforeAdd());
624 expectEquals(100, exceptionExitAfterAdd());
625 a = null;
626 expectEquals(-1, exceptionExitBeforeAdd());
627 expectEquals(-11, exceptionExitAfterAdd());
628 a = new int[4];
629 expectEquals(-41, exceptionExitBeforeAdd());
630 expectEquals(-51, exceptionExitAfterAdd());
631
632 System.out.println("passed");
633 }
634
635 private static void expectEquals(int expected, int result) {
636 if (expected != result) {
637 throw new Error("Expected: " + expected + ", found: " + result);
638 }
639 }
640}