blob: ad3ff448d0074793caf4ac04dd2719341b07fb77 [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)
Aart Bikdf7822e2016-12-06 10:05:30 -080028 /// CHECK-NOT: Phi
Aart Bik281c6812016-08-26 11:31:48 -070029 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)
Aart Bikdf7822e2016-12-06 10:05:30 -080038 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -070039 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)
Aart Bikdf7822e2016-12-06 10:05:30 -080059 /// CHECK-NOT: Phi
Aart Bik281c6812016-08-26 11:31:48 -070060 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)
Aart Bikdf7822e2016-12-06 10:05:30 -080077 /// CHECK-NOT: Phi
Aart Bik281c6812016-08-26 11:31:48 -070078 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
Aart Bike3dedc52016-11-02 17:50:27 -070095 /// CHECK-START: void Main.deadConditional(int) loop_optimization (before)
96 /// CHECK-DAG: Phi loop:{{B\d+}} outer_loop:none
97 //
98 /// CHECK-START: void Main.deadConditional(int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -080099 /// CHECK-NOT: Phi
Aart Bike3dedc52016-11-02 17:50:27 -0700100 public static void deadConditional(int n) {
101 int k = 0;
102 int m = 0;
103 for (int i = 0; i < n; i++) {
104 if (i == 3)
105 k = i;
106 else
107 m = i;
108 }
109 }
110
111 /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (before)
112 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
113 /// CHECK-DAG: Phi loop:<<Loop>> 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 //
118 /// CHECK-START: void Main.deadConditionalCycle(int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800119 /// CHECK-NOT: Phi
Aart Bike3dedc52016-11-02 17:50:27 -0700120 public static void deadConditionalCycle(int n) {
121 int k = 0;
122 int m = 0;
123 for (int i = 0; i < n; i++) {
124 if (i == 3)
125 k--;
126 else
127 m++;
128 }
129 }
130
131
Aart Bik281c6812016-08-26 11:31:48 -0700132 /// CHECK-START: void Main.deadInduction() loop_optimization (before)
133 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
134 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
135 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
136 //
137 /// CHECK-START: void Main.deadInduction() loop_optimization (after)
138 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
139 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
140 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
141 static void deadInduction() {
142 int dead = 0;
143 for (int i = 0; i < a.length; i++) {
144 a[i] = 1;
145 dead += 5;
146 }
147 }
148
149 /// CHECK-START: void Main.deadManyInduction() loop_optimization (before)
150 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
151 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
152 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
153 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
154 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
155 //
156 /// CHECK-START: void Main.deadManyInduction() loop_optimization (after)
157 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
158 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
159 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
160 static void deadManyInduction() {
161 int dead1 = 0, dead2 = 1, dead3 = 3;
162 for (int i = 0; i < a.length; i++) {
163 dead1 += 5;
164 a[i] = 2;
165 dead2 += 10;
166 dead3 += 100;
167 }
168 }
169
170 /// CHECK-START: void Main.deadSequence() loop_optimization (before)
171 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
172 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
173 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
174 //
175 /// CHECK-START: void Main.deadSequence() loop_optimization (after)
176 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
177 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
178 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
179 static void deadSequence() {
180 int dead = 0;
181 for (int i = 0; i < a.length; i++) {
182 a[i] = 3;
183 // Increment value defined inside loop,
184 // but sequence itself not used anywhere.
185 dead += i;
186 }
187 }
188
189 /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (before)
190 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
191 /// CHECK-DAG: Phi loop:<<Loop>> outer_loop:none
192 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
193 /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700194 /// CHECK-NOT: BoundsCheck
Aart Bik281c6812016-08-26 11:31:48 -0700195 //
196 /// CHECK-START: void Main.deadCycleWithException(int) loop_optimization (after)
197 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none
198 /// CHECK-NOT: Phi loop:<<Loop>> outer_loop:none
199 /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700200 /// CHECK-NOT: ArrayGet loop:<<Loop>> outer_loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700201 static void deadCycleWithException(int k) {
202 int dead = 0;
203 for (int i = 0; i < a.length; i++) {
204 a[i] = 4;
Aart Bik482095d2016-10-10 15:39:10 -0700205 // Increment value of dead cycle may throw exception. Dynamic
206 // BCE takes care of the bounds check though, which enables
207 // removing the ArrayGet after removing the dead cycle.
Aart Bik281c6812016-08-26 11:31:48 -0700208 dead += a[k];
209 }
210 }
211
212 /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (before)
213 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
214 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
215 /// CHECK-DAG: Return [<<Phi1>>] loop:none
216 //
217 /// CHECK-START: int Main.closedFormInductionUp() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800218 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700219 //
220 /// CHECK-START: int Main.closedFormInductionUp() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800221 /// CHECK-DAG: <<Int:i\d+>> IntConstant 12395 loop:none
222 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700223 static int closedFormInductionUp() {
224 int closed = 12345;
225 for (int i = 0; i < 10; i++) {
226 closed += 5;
227 }
228 return closed; // only needs last value
229 }
230
231 /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (before)
232 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
233 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
234 /// CHECK-DAG: Return [<<Phi2>>] loop:none
235 //
236 /// CHECK-START: int Main.closedFormInductionInAndDown(int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800237 /// CHECK-NOT: Phi
238 //
239 /// CHECK-START: int Main.closedFormInductionInAndDown(int) instruction_simplifier$after_bce (after)
240 /// CHECK-DAG: <<Par:i\d+>> ParameterValue loop:none
241 /// CHECK-DAG: <<Int:i\d+>> IntConstant -50 loop:none
242 /// CHECK-DAG: <<Add:i\d+>> Add [<<Int>>,<<Par>>] loop:none
243 /// CHECK-DAG: Return [<<Add>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700244 static int closedFormInductionInAndDown(int closed) {
245 for (int i = 0; i < 10; i++) {
246 closed -= 5;
247 }
248 return closed; // only needs last value
249 }
250
Aart Bikd0a022d2016-12-13 11:22:31 -0800251 /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (before)
252 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
253 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
254 /// CHECK-DAG: Select loop:<<Loop>> outer_loop:none
255 /// CHECK-DAG: Return [<<Phi1>>] loop:none
256 //
257 /// CHECK-START: int Main.closedFormInductionTrivialIf() loop_optimization (after)
258 /// CHECK-NOT: Phi
259 /// CHECK-NOT: Select
260 //
261 /// CHECK-START: int Main.closedFormInductionTrivialIf() instruction_simplifier$after_bce (after)
262 /// CHECK-DAG: <<Int:i\d+>> IntConstant 81 loop:none
263 /// CHECK-DAG: Return [<<Int>>] loop:none
264 static int closedFormInductionTrivialIf() {
265 int closed = 11;
266 for (int i = 0; i < 10; i++) {
267 // Trivial if becomes trivial select at HIR level.
268 // Make sure this is still recognized as induction.
269 if (i < 5) {
270 closed += 7;
271 } else {
272 closed += 7;
273 }
274 }
275 return closed; // only needs last value
276 }
277
Aart Bik482095d2016-10-10 15:39:10 -0700278 /// CHECK-START: int Main.closedFormNested() loop_optimization (before)
279 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
280 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
281 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
282 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
283 /// CHECK-DAG: Return [<<Phi1>>] loop:none
284 //
285 /// CHECK-START: int Main.closedFormNested() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800286 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700287 //
288 /// CHECK-START: int Main.closedFormNested() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800289 /// CHECK-DAG: <<Int:i\d+>> IntConstant 100 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700290 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700291 static int closedFormNested() {
292 int closed = 0;
293 for (int i = 0; i < 10; i++) {
294 for (int j = 0; j < 10; j++) {
295 closed++;
296 }
297 }
298 return closed; // only needs last-value
299 }
300
Aart Bik482095d2016-10-10 15:39:10 -0700301 /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (before)
302 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
303 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
304 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:<<Loop1>>
305 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:<<Loop1>>
306 /// CHECK-DAG: Return [<<Phi1>>] loop:none
307 //
308 /// CHECK-START: int Main.closedFormNestedAlt() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800309 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700310 //
311 /// CHECK-START: int Main.closedFormNestedAlt() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800312 /// CHECK-DAG: <<Int:i\d+>> IntConstant 15082 loop:none
313 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik482095d2016-10-10 15:39:10 -0700314 static int closedFormNestedAlt() {
315 int closed = 12345;
316 for (int i = 0; i < 17; i++) {
317 for (int j = 0; j < 23; j++) {
318 closed += 7;
319 }
320 }
321 return closed; // only needs last-value
322 }
323
Aart Bik281c6812016-08-26 11:31:48 -0700324 // TODO: taken test around closed form?
325 static int closedFormInductionUpN(int n) {
326 int closed = 12345;
327 for (int i = 0; i < n; i++) {
328 closed += 5;
329 }
330 return closed; // only needs last value
331 }
332
333 // TODO: taken test around closed form?
334 static int closedFormInductionInAndDownN(int closed, int n) {
335 for (int i = 0; i < n; i++) {
336 closed -= 5;
337 }
338 return closed; // only needs last value
339 }
340
341 // TODO: move closed form even further out?
Aart Bik8c4a8542016-10-06 11:36:57 -0700342 static int closedFormNestedN(int n) {
Aart Bik281c6812016-08-26 11:31:48 -0700343 int closed = 0;
344 for (int i = 0; i < n; i++) {
345 for (int j = 0; j < 10; j++) {
346 closed++;
347 }
348 }
349 return closed; // only needs last-value
350 }
351
Aart Bik8c4a8542016-10-06 11:36:57 -0700352 // TODO: move closed form even further out?
Aart Bik482095d2016-10-10 15:39:10 -0700353 static int closedFormNestedNAlt(int n) {
354 int closed = 12345;
Aart Bik8c4a8542016-10-06 11:36:57 -0700355 for (int i = 0; i < n; i++) {
Aart Bik482095d2016-10-10 15:39:10 -0700356 for (int j = 0; j < 23; j++) {
357 closed += 7;
358 }
359 }
360 return closed; // only needs last-value
361 }
362
363 // TODO: move closed form even further out?
364 static int closedFormNestedMN(int m, int n) {
365 int closed = 0;
366 for (int i = 0; i < m; i++) {
Aart Bik8c4a8542016-10-06 11:36:57 -0700367 for (int j = 0; j < n; j++) {
368 closed++;
369 }
370 }
371 return closed; // only needs last-value
372 }
373
Aart Bik482095d2016-10-10 15:39:10 -0700374 // TODO: move closed form even further out?
375 static int closedFormNestedMNAlt(int m, int n) {
376 int closed = 12345;
377 for (int i = 0; i < m; i++) {
378 for (int j = 0; j < n; j++) {
379 closed += 7;
380 }
381 }
382 return closed; // only needs last-value
383 }
384
Aart Bik8c4a8542016-10-06 11:36:57 -0700385 /// CHECK-START: int Main.mainIndexReturned() loop_optimization (before)
386 /// CHECK-DAG: <<Phi:i\d+>> Phi loop:{{B\d+}} outer_loop:none
387 /// CHECK-DAG: Return [<<Phi>>] loop:none
388 //
389 /// CHECK-START: int Main.mainIndexReturned() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800390 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700391 //
392 /// CHECK-START: int Main.mainIndexReturned() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800393 /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700394 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700395 static int mainIndexReturned() {
Aart Bik281c6812016-08-26 11:31:48 -0700396 int i;
Aart Bik8c4a8542016-10-06 11:36:57 -0700397 for (i = 0; i < 10; i++);
Aart Bik281c6812016-08-26 11:31:48 -0700398 return i;
399 }
400
Aart Bik9abf8942016-10-14 09:49:42 -0700401 /// CHECK-START: int Main.periodicReturned9() loop_optimization (before)
402 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
403 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
404 /// CHECK-DAG: Return [<<Phi2>>] loop:none
405 //
406 /// CHECK-START: int Main.periodicReturned9() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800407 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700408 //
409 /// CHECK-START: int Main.periodicReturned9() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800410 /// CHECK-DAG: <<Int:i\d+>> IntConstant 1 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700411 /// CHECK-DAG: Return [<<Int>>] loop:none
412 static int periodicReturned9() {
Aart Bik281c6812016-08-26 11:31:48 -0700413 int k = 0;
Aart Bik8c4a8542016-10-06 11:36:57 -0700414 for (int i = 0; i < 9; i++) {
Aart Bik281c6812016-08-26 11:31:48 -0700415 k = 1 - k;
416 }
417 return k;
418 }
419
Aart Bik9abf8942016-10-14 09:49:42 -0700420 /// CHECK-START: int Main.periodicReturned10() loop_optimization (before)
421 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
422 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
423 /// CHECK-DAG: Return [<<Phi2>>] loop:none
424 //
425 /// CHECK-START: int Main.periodicReturned10() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800426 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700427 //
428 /// CHECK-START: int Main.periodicReturned10() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800429 /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700430 /// CHECK-DAG: Return [<<Int>>] loop:none
431 static int periodicReturned10() {
432 int k = 0;
433 for (int i = 0; i < 10; i++) {
434 k = 1 - k;
435 }
436 return k;
437 }
438
Aart Bikdf7822e2016-12-06 10:05:30 -0800439 /// CHECK-START: int Main.getSum21() loop_optimization (before)
440 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
441 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
442 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop>> outer_loop:none
443 /// CHECK-DAG: Return [<<Phi3>>] loop:none
444 //
445 /// CHECK-START: int Main.getSum21() loop_optimization (after)
446 /// CHECK-NOT: Phi
447 //
448 /// CHECK-START: int Main.getSum21() instruction_simplifier$after_bce (after)
449 /// CHECK-DAG: <<Int:i\d+>> IntConstant 21 loop:none
450 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700451 private static int getSum21() {
452 int k = 0;
453 int sum = 0;
454 for (int i = 0; i < 6; i++) {
455 k++;
456 sum += k;
457 }
458 return sum;
459 }
460
Aart Bik8c4a8542016-10-06 11:36:57 -0700461 // TODO: handle as closed/empty eventually?
462 static int mainIndexReturnedN(int n) {
463 int i;
464 for (i = 0; i < n; i++);
465 return i;
466 }
467
Aart Bike6bd0272016-12-16 13:57:52 -0800468 // TODO: handle as closed/empty eventually?
469 static int mainIndexShort1(short s) {
470 int i = 0;
471 for (i = 0; i < s; i++) { }
472 return i;
473 }
474
475 // TODO: handle as closed/empty eventually?
476 static int mainIndexShort2(short s) {
477 int i = 0;
478 for (i = 0; s > i; i++) { }
479 return i;
480 }
481
Aart Bik9abf8942016-10-14 09:49:42 -0700482 /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (before)
483 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
484 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
485 /// CHECK-DAG: Return [<<Phi2>>] loop:none
486 //
487 /// CHECK-START: int Main.periodicReturnedN(int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800488 /// CHECK-NOT: Phi
Aart Bik8c4a8542016-10-06 11:36:57 -0700489 static int periodicReturnedN(int n) {
490 int k = 0;
491 for (int i = 0; i < n; i++) {
492 k = 1 - k;
493 }
494 return k;
495 }
496
497 // If ever replaced by closed form, last value should be correct!
498 private static int getSumN(int n) {
499 int k = 0;
500 int sum = 0;
501 for (int i = 0; i < n; i++) {
502 k++;
503 sum += k;
504 }
505 return sum;
506 }
507
508 // If ever replaced by closed form, last value should be correct!
Aart Bik281c6812016-08-26 11:31:48 -0700509 private static int closedTwice() {
510 int closed = 0;
511 for (int i = 0; i < 10; i++) {
512 closed++;
513 }
514 // Closed form of first loop defines trip count of second loop.
515 int other_closed = 0;
516 for (int i = 0; i < closed; i++) {
517 other_closed++;
518 }
519 return other_closed;
520 }
521
522 /// CHECK-START: int Main.closedFeed() loop_optimization (before)
523 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
524 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop1>> outer_loop:none
525 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
526 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop2>> outer_loop:none
527 /// CHECK-DAG: Return [<<Phi3>>] loop:none
528 /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>"
529 //
530 /// CHECK-START: int Main.closedFeed() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800531 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700532 //
533 /// CHECK-START: int Main.closedFeed() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800534 /// CHECK-DAG: <<Int:i\d+>> IntConstant 20 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700535 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700536 private static int closedFeed() {
537 int closed = 0;
538 for (int i = 0; i < 10; i++) {
539 closed++;
540 }
541 // Closed form of first loop feeds into initial value of second loop,
542 // used when generating closed form for the latter.
543 for (int i = 0; i < 10; i++) {
544 closed++;
545 }
546 return closed;
547 }
548
549 /// CHECK-START: int Main.closedLargeUp() loop_optimization (before)
550 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
551 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
552 /// CHECK-DAG: Return [<<Phi1>>] loop:none
553 //
554 /// CHECK-START: int Main.closedLargeUp() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800555 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700556 //
557 /// CHECK-START: int Main.closedLargeUp() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800558 /// CHECK-DAG: <<Int:i\d+>> IntConstant -10 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700559 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700560 private static int closedLargeUp() {
561 int closed = 0;
562 for (int i = 0; i < 10; i++) {
563 closed += 0x7fffffff;
564 }
565 return closed;
566 }
567
568 /// CHECK-START: int Main.closedLargeDown() loop_optimization (before)
569 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
570 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
571 /// CHECK-DAG: Return [<<Phi1>>] loop:none
572 //
573 /// CHECK-START: int Main.closedLargeDown() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800574 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700575 //
576 /// CHECK-START: int Main.closedLargeDown() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800577 /// CHECK-DAG: <<Int:i\d+>> IntConstant 10 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700578 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik281c6812016-08-26 11:31:48 -0700579 private static int closedLargeDown() {
580 int closed = 0;
581 for (int i = 0; i < 10; i++) {
582 closed -= 0x7fffffff;
583 }
584 return closed;
585 }
586
Aart Bik8c4a8542016-10-06 11:36:57 -0700587 /// CHECK-START: int Main.waterFall() loop_optimization (before)
588 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop1:B\d+>> outer_loop:none
589 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop2:B\d+>> outer_loop:none
590 /// CHECK-DAG: <<Phi3:i\d+>> Phi loop:<<Loop3:B\d+>> outer_loop:none
591 /// CHECK-DAG: <<Phi4:i\d+>> Phi loop:<<Loop4:B\d+>> outer_loop:none
592 /// CHECK-DAG: <<Phi5:i\d+>> Phi loop:<<Loop5:B\d+>> outer_loop:none
593 /// CHECK-DAG: Return [<<Phi5>>] loop:none
594 //
595 /// CHECK-START: int Main.waterFall() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800596 /// CHECK-NOT: Phi
Aart Bik9abf8942016-10-14 09:49:42 -0700597 //
598 /// CHECK-START: int Main.waterFall() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800599 /// CHECK-DAG: <<Int:i\d+>> IntConstant 50 loop:none
Aart Bik9abf8942016-10-14 09:49:42 -0700600 /// CHECK-DAG: Return [<<Int>>] loop:none
Aart Bik8c4a8542016-10-06 11:36:57 -0700601 private static int waterFall() {
602 int i = 0;
603 for (; i < 10; i++);
604 for (; i < 20; i++);
605 for (; i < 30; i++);
606 for (; i < 40; i++);
607 for (; i < 50; i++);
608 return i; // this should become just 50
609 }
610
Aart Bik639cc8c2016-10-18 13:03:31 -0700611 /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (before)
612 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
613 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
614 /// CHECK-DAG: Return [<<Phi2>>] loop:none
615 //
616 /// CHECK-START: boolean Main.periodicBoolIdiom1() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800617 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700618 //
619 /// CHECK-START: boolean Main.periodicBoolIdiom1() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800620 /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
Aart Bik639cc8c2016-10-18 13:03:31 -0700621 /// CHECK-DAG: Return [<<Int>>] loop:none
622 private static boolean periodicBoolIdiom1() {
623 boolean x = true;
624 for (int i = 0; i < 7; i++) {
625 x = !x;
626 }
627 return x;
628 }
629
630 /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (before)
631 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
632 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
633 /// CHECK-DAG: Return [<<Phi2>>] loop:none
634 //
635 /// CHECK-START: boolean Main.periodicBoolIdiom2() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800636 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700637 //
638 /// CHECK-START: boolean Main.periodicBoolIdiom2() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800639 /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
Aart Bik639cc8c2016-10-18 13:03:31 -0700640 /// CHECK-DAG: Return [<<Int>>] loop:none
641 private static boolean periodicBoolIdiom2() {
642 boolean x = true;
643 for (int i = 0; i < 7; i++) {
644 x = (x != true);
645 }
646 return x;
647 }
648
649 /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (before)
650 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
651 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
652 /// CHECK-DAG: Return [<<Phi2>>] loop:none
653 //
654 /// CHECK-START: boolean Main.periodicBoolIdiom3() loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800655 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700656 //
657 /// CHECK-START: boolean Main.periodicBoolIdiom3() instruction_simplifier$after_bce (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800658 /// CHECK-DAG: <<Int:i\d+>> IntConstant 0 loop:none
Aart Bik639cc8c2016-10-18 13:03:31 -0700659 /// CHECK-DAG: Return [<<Int>>] loop:none
660 private static boolean periodicBoolIdiom3() {
661 boolean x = true;
662 for (int i = 0; i < 7; i++) {
663 x = (x == false);
664 }
665 return x;
666 }
667
668 /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (before)
669 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
670 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
671 /// CHECK-DAG: Return [<<Phi2>>] loop:none
672 //
673 /// CHECK-START: boolean Main.periodicBoolIdiom1N(boolean, int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800674 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700675 private static boolean periodicBoolIdiom1N(boolean x, int n) {
676 for (int i = 0; i < n; i++) {
677 x = !x;
678 }
679 return x;
680 }
681
682 /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (before)
683 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
684 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
685 /// CHECK-DAG: Return [<<Phi2>>] loop:none
686 //
687 /// CHECK-START: boolean Main.periodicBoolIdiom2N(boolean, int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800688 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700689 private static boolean periodicBoolIdiom2N(boolean x, int n) {
690 for (int i = 0; i < n; i++) {
691 x = (x != true);
692 }
693 return x;
694 }
695
696 /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (before)
697 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
698 /// CHECK-DAG: <<Phi2:i\d+>> Phi loop:<<Loop>> outer_loop:none
699 /// CHECK-DAG: Return [<<Phi2>>] loop:none
700 //
701 /// CHECK-START: boolean Main.periodicBoolIdiom3N(boolean, int) loop_optimization (after)
Aart Bikdf7822e2016-12-06 10:05:30 -0800702 /// CHECK-NOT: Phi
Aart Bik639cc8c2016-10-18 13:03:31 -0700703 private static boolean periodicBoolIdiom3N(boolean x, int n) {
704 for (int i = 0; i < n; i++) {
705 x = (x == false);
706 }
707 return x;
708 }
709
Aart Bike6bd0272016-12-16 13:57:52 -0800710 /// CHECK-START: float Main.periodicFloat10() loop_optimization (before)
711 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
712 /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
713 /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
714 /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
715 /// CHECK-DAG: Return [<<Phi2>>] loop:none
716 //
717 /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
718 /// CHECK-NOT: Phi
719 //
720 /// CHECK-START: float Main.periodicFloat10() loop_optimization (after)
721 /// CHECK-DAG: <<Float:f\d+>> FloatConstant 2 loop:none
722 /// CHECK-DAG: Return [<<Float>>] loop:none
723 private static float periodicFloat10() {
724 float r = 4.5f;
725 float s = 2.0f;
726 float t = -1.0f;
727 for (int i = 0; i < 10; i++) {
728 float tmp = t; t = r; r = s; s = tmp;
729 }
730 return r;
731 }
732
733 /// CHECK-START: float Main.periodicFloat11() loop_optimization (before)
734 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
735 /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
736 /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
737 /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
738 /// CHECK-DAG: Return [<<Phi2>>] loop:none
739 //
740 /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
741 /// CHECK-NOT: Phi
742 //
743 /// CHECK-START: float Main.periodicFloat11() loop_optimization (after)
744 /// CHECK-DAG: <<Float:f\d+>> FloatConstant -1 loop:none
745 /// CHECK-DAG: Return [<<Float>>] loop:none
746 private static float periodicFloat11() {
747 float r = 4.5f;
748 float s = 2.0f;
749 float t = -1.0f;
750 for (int i = 0; i < 11; i++) {
751 float tmp = t; t = r; r = s; s = tmp;
752 }
753 return r;
754 }
755
756 /// CHECK-START: float Main.periodicFloat12() loop_optimization (before)
757 /// CHECK-DAG: <<Phi1:i\d+>> Phi loop:<<Loop:B\d+>> outer_loop:none
758 /// CHECK-DAG: <<Phi2:f\d+>> Phi loop:<<Loop>> outer_loop:none
759 /// CHECK-DAG: <<Phi3:f\d+>> Phi loop:<<Loop>> outer_loop:none
760 /// CHECK-DAG: <<Phi4:f\d+>> Phi loop:<<Loop>> outer_loop:none
761 /// CHECK-DAG: Return [<<Phi2>>] loop:none
762 //
763 /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
764 /// CHECK-NOT: Phi
765 //
766 /// CHECK-START: float Main.periodicFloat12() loop_optimization (after)
767 /// CHECK-DAG: <<Float:f\d+>> FloatConstant 4.5 loop:none
768 /// CHECK-DAG: Return [<<Float>>] loop:none
769 private static float periodicFloat12() {
770 float r = 4.5f;
771 float s = 2.0f;
772 float t = -1.0f;
773 for (int i = 0; i < 12; i++) {
774 float tmp = t; t = r; r = s; s = tmp;
775 }
776 return r;
777 }
778
Aart Bik281c6812016-08-26 11:31:48 -0700779 private static int exceptionExitBeforeAdd() {
780 int k = 0;
781 try {
782 for (int i = 0; i < 10; i++) {
783 a[i] = 0;
784 k += 10; // increment last
785 }
786 } catch(Exception e) {
787 // Flag error by returning current
788 // value of k negated.
789 return -k-1;
790 }
791 return k;
792 }
793
794 private static int exceptionExitAfterAdd() {
795 int k = 0;
796 try {
797 for (int i = 0; i < 10; i++) {
798 k += 10; // increment first
799 a[i] = 0;
800 }
801 } catch(Exception e) {
802 // Flag error by returning current
803 // value of k negated.
804 return -k-1;
805 }
806 return k;
807 }
808
809 public static void main(String[] args) {
810 deadSingleLoop();
Aart Bik9abf8942016-10-14 09:49:42 -0700811 deadSingleLoopN(4);
812 potentialInfiniteLoop(4);
Aart Bik281c6812016-08-26 11:31:48 -0700813 deadNestedLoops();
814 deadNestedAndFollowingLoops();
Aart Bike3dedc52016-11-02 17:50:27 -0700815 deadConditional(4);
816 deadConditionalCycle(4);
Aart Bik281c6812016-08-26 11:31:48 -0700817
818 deadInduction();
819 for (int i = 0; i < a.length; i++) {
820 expectEquals(1, a[i]);
821 }
822 deadManyInduction();
823 for (int i = 0; i < a.length; i++) {
824 expectEquals(2, a[i]);
825 }
826 deadSequence();
827 for (int i = 0; i < a.length; i++) {
828 expectEquals(3, a[i]);
829 }
830 try {
831 deadCycleWithException(-1);
832 throw new Error("Expected: IOOB exception");
833 } catch (IndexOutOfBoundsException e) {
834 }
835 for (int i = 0; i < a.length; i++) {
836 expectEquals(i == 0 ? 4 : 3, a[i]);
837 }
838 deadCycleWithException(0);
839 for (int i = 0; i < a.length; i++) {
840 expectEquals(4, a[i]);
841 }
842
Aart Bik8c4a8542016-10-06 11:36:57 -0700843 expectEquals(12395, closedFormInductionUp());
844 expectEquals(12295, closedFormInductionInAndDown(12345));
Aart Bikd0a022d2016-12-13 11:22:31 -0800845 expectEquals(81, closedFormInductionTrivialIf());
Aart Bik8c4a8542016-10-06 11:36:57 -0700846 expectEquals(10 * 10, closedFormNested());
Aart Bik482095d2016-10-10 15:39:10 -0700847 expectEquals(12345 + 17 * 23 * 7, closedFormNestedAlt());
Aart Bik281c6812016-08-26 11:31:48 -0700848 for (int n = -4; n < 10; n++) {
849 int tc = (n <= 0) ? 0 : n;
Aart Bik8c4a8542016-10-06 11:36:57 -0700850 expectEquals(12345 + tc * 5, closedFormInductionUpN(n));
851 expectEquals(12345 - tc * 5, closedFormInductionInAndDownN(12345, n));
852 expectEquals(tc * 10, closedFormNestedN(n));
Aart Bik482095d2016-10-10 15:39:10 -0700853 expectEquals(12345 + tc * 23 * 7, closedFormNestedNAlt(n));
854 expectEquals(tc * (tc + 1), closedFormNestedMN(n, n + 1));
855 expectEquals(12345 + tc * (tc + 1) * 7, closedFormNestedMNAlt(n, n + 1));
Aart Bik281c6812016-08-26 11:31:48 -0700856 }
857
Aart Bik8c4a8542016-10-06 11:36:57 -0700858 expectEquals(10, mainIndexReturned());
Aart Bik9abf8942016-10-14 09:49:42 -0700859 expectEquals(1, periodicReturned9());
860 expectEquals(0, periodicReturned10());
Aart Bik8c4a8542016-10-06 11:36:57 -0700861 expectEquals(21, getSum21());
Aart Bik281c6812016-08-26 11:31:48 -0700862 for (int n = -4; n < 4; n++) {
863 int tc = (n <= 0) ? 0 : n;
Aart Bik8c4a8542016-10-06 11:36:57 -0700864 expectEquals(tc, mainIndexReturnedN(n));
Aart Bike6bd0272016-12-16 13:57:52 -0800865 expectEquals(tc, mainIndexShort1((short) n));
866 expectEquals(tc, mainIndexShort2((short) n));
Aart Bik8c4a8542016-10-06 11:36:57 -0700867 expectEquals(tc & 1, periodicReturnedN(n));
868 expectEquals((tc * (tc + 1)) / 2, getSumN(n));
Aart Bik281c6812016-08-26 11:31:48 -0700869 }
Aart Bik8c4a8542016-10-06 11:36:57 -0700870
Aart Bik281c6812016-08-26 11:31:48 -0700871 expectEquals(10, closedTwice());
872 expectEquals(20, closedFeed());
873 expectEquals(-10, closedLargeUp());
874 expectEquals(10, closedLargeDown());
Aart Bik8c4a8542016-10-06 11:36:57 -0700875 expectEquals(50, waterFall());
Aart Bik281c6812016-08-26 11:31:48 -0700876
Aart Bik639cc8c2016-10-18 13:03:31 -0700877 expectEquals(false, periodicBoolIdiom1());
878 expectEquals(false, periodicBoolIdiom2());
879 expectEquals(false, periodicBoolIdiom3());
880 for (int n = -4; n < 10; n++) {
881 int tc = (n <= 0) ? 0 : n;
882 boolean even = (tc & 1) == 0;
883 expectEquals(even, periodicBoolIdiom1N(true, n));
884 expectEquals(!even, periodicBoolIdiom1N(false, n));
885 expectEquals(even, periodicBoolIdiom2N(true, n));
886 expectEquals(!even, periodicBoolIdiom2N(false, n));
887 expectEquals(even, periodicBoolIdiom3N(true, n));
888 expectEquals(!even, periodicBoolIdiom3N(false, n));
889 }
890
Aart Bike6bd0272016-12-16 13:57:52 -0800891 expectEquals( 2.0f, periodicFloat10());
892 expectEquals(-1.0f, periodicFloat11());
893 expectEquals( 4.5f, periodicFloat12());
894
Aart Bik281c6812016-08-26 11:31:48 -0700895 expectEquals(100, exceptionExitBeforeAdd());
896 expectEquals(100, exceptionExitAfterAdd());
897 a = null;
898 expectEquals(-1, exceptionExitBeforeAdd());
899 expectEquals(-11, exceptionExitAfterAdd());
900 a = new int[4];
901 expectEquals(-41, exceptionExitBeforeAdd());
902 expectEquals(-51, exceptionExitAfterAdd());
903
904 System.out.println("passed");
905 }
906
Aart Bike6bd0272016-12-16 13:57:52 -0800907 private static void expectEquals(float expected, float result) {
908 if (expected != result) {
909 throw new Error("Expected: " + expected + ", found: " + result);
910 }
911 }
912
Aart Bik281c6812016-08-26 11:31:48 -0700913 private static void expectEquals(int expected, int result) {
914 if (expected != result) {
915 throw new Error("Expected: " + expected + ", found: " + result);
916 }
917 }
Aart Bik639cc8c2016-10-18 13:03:31 -0700918
919 private static void expectEquals(boolean expected, boolean result) {
920 if (expected != result) {
921 throw new Error("Expected: " + expected + ", found: " + result);
922 }
923 }
Aart Bik281c6812016-08-26 11:31:48 -0700924}