blob: 2aa40fcdc1b00518d985c9dd7710571a84310b98 [file] [log] [blame]
Aart Bik18b36ab2016-04-13 16:41:35 -07001/*
2 * Copyright (C) 2015 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// Test on (in)variant instance field and array references in loops.
19//
20public class Main {
21
22 private static Object anObject = new Object();
23 private static Object anotherObject = new Object();
24
25 //
26 // Instance fields.
27 //
28
29 private boolean mZ;
30 private byte mB;
31 private char mC;
32 private short mS;
33 private int mI;
34 private long mJ;
35 private float mF;
36 private double mD;
37 private Object mL;
38
39 //
40 // Instance arrays.
41 //
42
43 private boolean[] mArrZ;
44 private byte[] mArrB;
45 private char[] mArrC;
46 private short[] mArrS;
47 private int[] mArrI;
48 private long[] mArrJ;
49 private float[] mArrF;
50 private double[] mArrD;
51 private Object[] mArrL;
52
53 //
54 // Loops on instance arrays with invariant instance field references.
55 // The checker is used to ensure hoisting occurred.
56 //
57
58 /// CHECK-START: void Main.InvLoopZ() licm (before)
59 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
60 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
61
62 /// CHECK-START: void Main.InvLoopZ() licm (after)
63 /// CHECK-DAG: InstanceFieldGet loop:none
64 /// CHECK-DAG: InstanceFieldGet loop:none
65
66 private void InvLoopZ() {
67 for (int i = 0; i < mArrZ.length; i++) {
68 mArrZ[i] = mZ;
69 }
70 }
71
72 /// CHECK-START: void Main.InvLoopB() licm (before)
73 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
74 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
75
76 /// CHECK-START: void Main.InvLoopB() licm (after)
77 /// CHECK-DAG: InstanceFieldGet loop:none
78 /// CHECK-DAG: InstanceFieldGet loop:none
79
80 private void InvLoopB() {
81 for (int i = 0; i < mArrB.length; i++) {
82 mArrB[i] = mB;
83 }
84 }
85
86 /// CHECK-START: void Main.InvLoopC() licm (before)
87 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
88 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
89
90 /// CHECK-START: void Main.InvLoopC() licm (after)
91 /// CHECK-DAG: InstanceFieldGet loop:none
92 /// CHECK-DAG: InstanceFieldGet loop:none
93
94 private void InvLoopC() {
95 for (int i = 0; i < mArrC.length; i++) {
96 mArrC[i] = mC;
97 }
98 }
99
100 /// CHECK-START: void Main.InvLoopS() licm (before)
101 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
102 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
103
104 /// CHECK-START: void Main.InvLoopS() licm (after)
105 /// CHECK-DAG: InstanceFieldGet loop:none
106 /// CHECK-DAG: InstanceFieldGet loop:none
107
108 private void InvLoopS() {
109 for (int i = 0; i < mArrS.length; i++) {
110 mArrS[i] = mS;
111 }
112 }
113
114 /// CHECK-START: void Main.InvLoopI() licm (before)
115 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
116 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
117
118 /// CHECK-START: void Main.InvLoopI() licm (after)
119 /// CHECK-DAG: InstanceFieldGet loop:none
120 /// CHECK-DAG: InstanceFieldGet loop:none
121
122 private void InvLoopI() {
123 for (int i = 0; i < mArrI.length; i++) {
124 mArrI[i] = mI;
125 }
126 }
127
128 /// CHECK-START: void Main.InvLoopJ() licm (before)
129 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
130 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
131
132 /// CHECK-START: void Main.InvLoopJ() licm (after)
133 /// CHECK-DAG: InstanceFieldGet loop:none
134 /// CHECK-DAG: InstanceFieldGet loop:none
135
136 private void InvLoopJ() {
137 for (int i = 0; i < mArrJ.length; i++) {
138 mArrJ[i] = mJ;
139 }
140 }
141
142 /// CHECK-START: void Main.InvLoopF() licm (before)
143 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
144 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
145
146 /// CHECK-START: void Main.InvLoopF() licm (after)
147 /// CHECK-DAG: InstanceFieldGet loop:none
148 /// CHECK-DAG: InstanceFieldGet loop:none
149
150 private void InvLoopF() {
151 for (int i = 0; i < mArrF.length; i++) {
152 mArrF[i] = mF;
153 }
154 }
155
156 /// CHECK-START: void Main.InvLoopD() licm (before)
157 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
158 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
159
160 /// CHECK-START: void Main.InvLoopD() licm (after)
161 /// CHECK-DAG: InstanceFieldGet loop:none
162 /// CHECK-DAG: InstanceFieldGet loop:none
163
164 private void InvLoopD() {
165 for (int i = 0; i < mArrD.length; i++) {
166 mArrD[i] = mD;
167 }
168 }
169
170 /// CHECK-START: void Main.InvLoopL() licm (before)
171 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
172 /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
173
174 /// CHECK-START: void Main.InvLoopL() licm (after)
175 /// CHECK-DAG: InstanceFieldGet loop:none
176 /// CHECK-DAG: InstanceFieldGet loop:none
177
178 private void InvLoopL() {
179 for (int i = 0; i < mArrL.length; i++) {
180 mArrL[i] = mL;
181 }
182 }
183
184 //
185 // Loops on instance arrays with variant instance field references.
186 // Incorrect hoisting is detected by incorrect outcome.
187 //
188
189 private void VarLoopZ() {
190 for (int i = 0; i < mArrZ.length; i++) {
191 mArrZ[i] = mZ;
192 if (i == 10)
193 mZ = !mZ;
194 }
195 }
196
197 private void VarLoopB() {
198 for (int i = 0; i < mArrB.length; i++) {
199 mArrB[i] = mB;
200 if (i == 10)
201 mB++;
202 }
203 }
204
205 private void VarLoopC() {
206 for (int i = 0; i < mArrC.length; i++) {
207 mArrC[i] = mC;
208 if (i == 10)
209 mC++;
210 }
211 }
212
213 private void VarLoopS() {
214 for (int i = 0; i < mArrS.length; i++) {
215 mArrS[i] = mS;
216 if (i == 10)
217 mS++;
218 }
219 }
220
221 private void VarLoopI() {
222 for (int i = 0; i < mArrI.length; i++) {
223 mArrI[i] = mI;
224 if (i == 10)
225 mI++;
226 }
227 }
228
229 private void VarLoopJ() {
230 for (int i = 0; i < mArrJ.length; i++) {
231 mArrJ[i] = mJ;
232 if (i == 10)
233 mJ++;
234 }
235 }
236
237 private void VarLoopF() {
238 for (int i = 0; i < mArrF.length; i++) {
239 mArrF[i] = mF;
240 if (i == 10)
241 mF++;
242 }
243 }
244
245 private void VarLoopD() {
246 for (int i = 0; i < mArrD.length; i++) {
247 mArrD[i] = mD;
248 if (i == 10)
249 mD++;
250 }
251 }
252
253 private void VarLoopL() {
254 for (int i = 0; i < mArrL.length; i++) {
255 mArrL[i] = mL;
256 if (i == 10)
257 mL = anotherObject;
258 }
259 }
260
261 //
262 // Loops on instance arrays with a cross-over reference.
263 // Incorrect hoisting is detected by incorrect outcome.
264 // In addition, the checker is used to detect no hoisting.
265 //
266
267 /// CHECK-START: void Main.CrossOverLoopZ() licm (before)
268 /// CHECK-DAG: ArraySet loop:none
269 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
270 /// CHECK-DAG: ArraySet loop:{{B\d+}}
271
272 /// CHECK-START: void Main.CrossOverLoopZ() licm (after)
273 /// CHECK-DAG: ArraySet loop:none
274 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
275 /// CHECK-DAG: ArraySet loop:{{B\d+}}
276
277 private void CrossOverLoopZ() {
278 mArrZ[20] = false;
279 for (int i = 0; i < mArrZ.length; i++) {
280 mArrZ[i] = !mArrZ[20];
281 }
282 }
283
284 /// CHECK-START: void Main.CrossOverLoopB() licm (before)
285 /// CHECK-DAG: ArraySet loop:none
286 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
287 /// CHECK-DAG: ArraySet loop:{{B\d+}}
288
289 /// CHECK-START: void Main.CrossOverLoopB() licm (after)
290 /// CHECK-DAG: ArraySet loop:none
291 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
292 /// CHECK-DAG: ArraySet loop:{{B\d+}}
293
294 private void CrossOverLoopB() {
295 mArrB[20] = 111;
296 for (int i = 0; i < mArrB.length; i++) {
297 mArrB[i] = (byte)(mArrB[20] + 2);
298 }
299 }
300
301 /// CHECK-START: void Main.CrossOverLoopC() licm (before)
302 /// CHECK-DAG: ArraySet loop:none
303 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
304 /// CHECK-DAG: ArraySet loop:{{B\d+}}
305
306 /// CHECK-START: void Main.CrossOverLoopC() licm (after)
307 /// CHECK-DAG: ArraySet loop:none
308 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
309 /// CHECK-DAG: ArraySet loop:{{B\d+}}
310
311 private void CrossOverLoopC() {
312 mArrC[20] = 111;
313 for (int i = 0; i < mArrC.length; i++) {
314 mArrC[i] = (char)(mArrC[20] + 2);
315 }
316 }
317
318 /// CHECK-START: void Main.CrossOverLoopS() licm (before)
319 /// CHECK-DAG: ArraySet loop:none
320 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
321 /// CHECK-DAG: ArraySet loop:{{B\d+}}
322
323 /// CHECK-START: void Main.CrossOverLoopS() licm (after)
324 /// CHECK-DAG: ArraySet loop:none
325 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
326 /// CHECK-DAG: ArraySet loop:{{B\d+}}
327
328 private void CrossOverLoopS() {
329 mArrS[20] = 111;
330 for (int i = 0; i < mArrS.length; i++) {
331 mArrS[i] = (short)(mArrS[20] + 2);
332 }
333 }
334
335 /// CHECK-START: void Main.CrossOverLoopI() licm (before)
336 /// CHECK-DAG: ArraySet loop:none
337 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
338 /// CHECK-DAG: ArraySet loop:{{B\d+}}
339
340 /// CHECK-START: void Main.CrossOverLoopI() licm (after)
341 /// CHECK-DAG: ArraySet loop:none
342 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
343 /// CHECK-DAG: ArraySet loop:{{B\d+}}
344
345 private void CrossOverLoopI() {
346 mArrI[20] = 111;
347 for (int i = 0; i < mArrI.length; i++) {
348 mArrI[i] = mArrI[20] + 2;
349 }
350 }
351
352 /// CHECK-START: void Main.CrossOverLoopJ() licm (before)
353 /// CHECK-DAG: ArraySet loop:none
354 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
355 /// CHECK-DAG: ArraySet loop:{{B\d+}}
356
357 /// CHECK-START: void Main.CrossOverLoopJ() licm (after)
358 /// CHECK-DAG: ArraySet loop:none
359 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
360 /// CHECK-DAG: ArraySet loop:{{B\d+}}
361
362 private void CrossOverLoopJ() {
363 mArrJ[20] = 111;
364 for (int i = 0; i < mArrJ.length; i++) {
365 mArrJ[i] = mArrJ[20] + 2;
366 }
367 }
368
369 /// CHECK-START: void Main.CrossOverLoopF() licm (before)
370 /// CHECK-DAG: ArraySet loop:none
371 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
372 /// CHECK-DAG: ArraySet loop:{{B\d+}}
373
374 /// CHECK-START: void Main.CrossOverLoopF() licm (after)
375 /// CHECK-DAG: ArraySet loop:none
376 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
377 /// CHECK-DAG: ArraySet loop:{{B\d+}}
378
379 private void CrossOverLoopF() {
380 mArrF[20] = 111;
381 for (int i = 0; i < mArrF.length; i++) {
382 mArrF[i] = mArrF[20] + 2;
383 }
384 }
385
386 /// CHECK-START: void Main.CrossOverLoopD() licm (before)
387 /// CHECK-DAG: ArraySet loop:none
388 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
389 /// CHECK-DAG: ArraySet loop:{{B\d+}}
390
391 /// CHECK-START: void Main.CrossOverLoopD() licm (after)
392 /// CHECK-DAG: ArraySet loop:none
393 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
394 /// CHECK-DAG: ArraySet loop:{{B\d+}}
395
396 private void CrossOverLoopD() {
397 mArrD[20] = 111;
398 for (int i = 0; i < mArrD.length; i++) {
399 mArrD[i] = mArrD[20] + 2;
400 }
401 }
402
403 /// CHECK-START: void Main.CrossOverLoopL() licm (before)
404 /// CHECK-DAG: ArraySet loop:none
405 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
406 /// CHECK-DAG: ArraySet loop:{{B\d+}}
407
408 /// CHECK-START: void Main.CrossOverLoopL() licm (after)
409 /// CHECK-DAG: ArraySet loop:none
410 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
411 /// CHECK-DAG: ArraySet loop:{{B\d+}}
412
413 private void CrossOverLoopL() {
414 mArrL[20] = anotherObject;
415 for (int i = 0; i < mArrL.length; i++) {
416 mArrL[i] = (mArrL[20] == anObject) ? anotherObject : anObject;
417 }
418 }
419
420 //
421 // False cross-over loops on instance arrays with data types (I/F and J/D) that used
422 // to be aliased in an older version of the compiler. This alias has been removed,
423 // however, which enables hoisting the invariant array reference.
424 //
425
426 /// CHECK-START: void Main.FalseCrossOverLoop1() licm (before)
427 /// CHECK-DAG: ArraySet loop:none
428 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
429 /// CHECK-DAG: ArraySet loop:{{B\d+}}
430
431 /// CHECK-START: void Main.FalseCrossOverLoop1() licm (after)
432 /// CHECK-DAG: ArraySet loop:none
433 /// CHECK-DAG: ArrayGet loop:none
434 /// CHECK-DAG: ArraySet loop:{{B\d+}}
435
436 private void FalseCrossOverLoop1() {
437 mArrF[20] = -1;
438 for (int i = 0; i < mArrI.length; i++) {
439 mArrI[i] = (int) mArrF[20] - 2;
440 }
441 }
442
443 /// CHECK-START: void Main.FalseCrossOverLoop2() licm (before)
444 /// CHECK-DAG: ArraySet loop:none
445 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
446 /// CHECK-DAG: ArraySet loop:{{B\d+}}
447
448 /// CHECK-START: void Main.FalseCrossOverLoop2() licm (after)
449 /// CHECK-DAG: ArraySet loop:none
450 /// CHECK-DAG: ArrayGet loop:none
451 /// CHECK-DAG: ArraySet loop:{{B\d+}}
452
453 private void FalseCrossOverLoop2() {
454 mArrI[20] = -2;
455 for (int i = 0; i < mArrF.length; i++) {
456 mArrF[i] = mArrI[20] - 2;
457 }
458 }
459
460 /// CHECK-START: void Main.FalseCrossOverLoop3() licm (before)
461 /// CHECK-DAG: ArraySet loop:none
462 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
463 /// CHECK-DAG: ArraySet loop:{{B\d+}}
464
465 /// CHECK-START: void Main.FalseCrossOverLoop3() licm (after)
466 /// CHECK-DAG: ArraySet loop:none
467 /// CHECK-DAG: ArrayGet loop:none
468 /// CHECK-DAG: ArraySet loop:{{B\d+}}
469
470 private void FalseCrossOverLoop3() {
471 mArrD[20] = -3;
472 for (int i = 0; i < mArrJ.length; i++) {
473 mArrJ[i] = (long) mArrD[20] - 2;
474 }
475 }
476
477 /// CHECK-START: void Main.FalseCrossOverLoop4() licm (before)
478 /// CHECK-DAG: ArraySet loop:none
479 /// CHECK-DAG: ArrayGet loop:{{B\d+}}
480 /// CHECK-DAG: ArraySet loop:{{B\d+}}
481
482 /// CHECK-START: void Main.FalseCrossOverLoop4() licm (after)
483 /// CHECK-DAG: ArraySet loop:none
484 /// CHECK-DAG: ArrayGet loop:none
485 /// CHECK-DAG: ArraySet loop:{{B\d+}}
486
487 private void FalseCrossOverLoop4() {
488 mArrJ[20] = -4;
489 for (int i = 0; i < mArrD.length; i++) {
490 mArrD[i] = mArrJ[20] - 2;
491 }
492 }
493
494 //
495 // Main driver and testers.
496 //
497
498 public static void main(String[] args) {
499 new Main().DoInstanceTests();
500 System.out.println("passed");
501 }
502
503 private void DoInstanceTests() {
504 // Type Z.
505 mZ = true;
506 mArrZ = new boolean[100];
507 InvLoopZ();
508 for (int i = 0; i < mArrZ.length; i++) {
509 expectEquals(true, mArrZ[i]);
510 }
511 VarLoopZ();
512 for (int i = 0; i < mArrZ.length; i++) {
513 expectEquals(i <= 10, mArrZ[i]);
514 }
515 CrossOverLoopZ();
516 for (int i = 0; i < mArrZ.length; i++) {
517 expectEquals(i <= 20, mArrZ[i]);
518 }
519 // Type B.
520 mB = 1;
521 mArrB = new byte[100];
522 InvLoopB();
523 for (int i = 0; i < mArrB.length; i++) {
524 expectEquals(1, mArrB[i]);
525 }
526 VarLoopB();
527 for (int i = 0; i < mArrB.length; i++) {
528 expectEquals(i <= 10 ? 1 : 2, mArrB[i]);
529 }
530 CrossOverLoopB();
531 for (int i = 0; i < mArrB.length; i++) {
532 expectEquals(i <= 20 ? 113 : 115, mArrB[i]);
533 }
534 // Type C.
535 mC = 2;
536 mArrC = new char[100];
537 InvLoopC();
538 for (int i = 0; i < mArrC.length; i++) {
539 expectEquals(2, mArrC[i]);
540 }
541 VarLoopC();
542 for (int i = 0; i < mArrC.length; i++) {
543 expectEquals(i <= 10 ? 2 : 3, mArrC[i]);
544 }
545 CrossOverLoopC();
546 for (int i = 0; i < mArrC.length; i++) {
547 expectEquals(i <= 20 ? 113 : 115, mArrC[i]);
548 }
549 // Type S.
550 mS = 3;
551 mArrS = new short[100];
552 InvLoopS();
553 for (int i = 0; i < mArrS.length; i++) {
554 expectEquals(3, mArrS[i]);
555 }
556 VarLoopS();
557 for (int i = 0; i < mArrS.length; i++) {
558 expectEquals(i <= 10 ? 3 : 4, mArrS[i]);
559 }
560 CrossOverLoopS();
561 for (int i = 0; i < mArrS.length; i++) {
562 expectEquals(i <= 20 ? 113 : 115, mArrS[i]);
563 }
564 // Type I.
565 mI = 4;
566 mArrI = new int[100];
567 InvLoopI();
568 for (int i = 0; i < mArrI.length; i++) {
569 expectEquals(4, mArrI[i]);
570 }
571 VarLoopI();
572 for (int i = 0; i < mArrI.length; i++) {
573 expectEquals(i <= 10 ? 4 : 5, mArrI[i]);
574 }
575 CrossOverLoopI();
576 for (int i = 0; i < mArrI.length; i++) {
577 expectEquals(i <= 20 ? 113 : 115, mArrI[i]);
578 }
579 // Type J.
580 mJ = 5;
581 mArrJ = new long[100];
582 InvLoopJ();
583 for (int i = 0; i < mArrJ.length; i++) {
584 expectEquals(5, mArrJ[i]);
585 }
586 VarLoopJ();
587 for (int i = 0; i < mArrJ.length; i++) {
588 expectEquals(i <= 10 ? 5 : 6, mArrJ[i]);
589 }
590 CrossOverLoopJ();
591 for (int i = 0; i < mArrJ.length; i++) {
592 expectEquals(i <= 20 ? 113 : 115, mArrJ[i]);
593 }
594 // Type F.
595 mF = 6.0f;
596 mArrF = new float[100];
597 InvLoopF();
598 for (int i = 0; i < mArrF.length; i++) {
599 expectEquals(6, mArrF[i]);
600 }
601 VarLoopF();
602 for (int i = 0; i < mArrF.length; i++) {
603 expectEquals(i <= 10 ? 6 : 7, mArrF[i]);
604 }
605 CrossOverLoopF();
606 for (int i = 0; i < mArrF.length; i++) {
607 expectEquals(i <= 20 ? 113 : 115, mArrF[i]);
608 }
609 // Type D.
610 mD = 7.0;
611 mArrD = new double[100];
612 InvLoopD();
613 for (int i = 0; i < mArrD.length; i++) {
614 expectEquals(7.0, mArrD[i]);
615 }
616 VarLoopD();
617 for (int i = 0; i < mArrD.length; i++) {
618 expectEquals(i <= 10 ? 7 : 8, mArrD[i]);
619 }
620 CrossOverLoopD();
621 for (int i = 0; i < mArrD.length; i++) {
622 expectEquals(i <= 20 ? 113 : 115, mArrD[i]);
623 }
624 // Type L.
625 mL = anObject;
626 mArrL = new Object[100];
627 InvLoopL();
628 for (int i = 0; i < mArrL.length; i++) {
629 expectEquals(anObject, mArrL[i]);
630 }
631 VarLoopL();
632 for (int i = 0; i < mArrL.length; i++) {
633 expectEquals(i <= 10 ? anObject : anotherObject, mArrL[i]);
634 }
635 CrossOverLoopL();
636 for (int i = 0; i < mArrL.length; i++) {
637 expectEquals(i <= 20 ? anObject : anotherObject, mArrL[i]);
638 }
639 // False cross-over.
640 FalseCrossOverLoop1();
641 for (int i = 0; i < mArrI.length; i++) {
642 expectEquals(-3, mArrI[i]);
643 }
644 FalseCrossOverLoop2();
645 for (int i = 0; i < mArrF.length; i++) {
646 expectEquals(-4, mArrF[i]);
647 }
648 FalseCrossOverLoop3();
649 for (int i = 0; i < mArrJ.length; i++) {
650 expectEquals(-5, mArrJ[i]);
651 }
652 FalseCrossOverLoop4();
653 for (int i = 0; i < mArrD.length; i++) {
654 expectEquals(-6, mArrD[i]);
655 }
656 }
657
658 private static void expectEquals(boolean expected, boolean result) {
659 if (expected != result) {
660 throw new Error("Expected: " + expected + ", found: " + result);
661 }
662 }
663
664 private static void expectEquals(byte expected, byte result) {
665 if (expected != result) {
666 throw new Error("Expected: " + expected + ", found: " + result);
667 }
668 }
669
670 private static void expectEquals(char expected, char result) {
671 if (expected != result) {
672 throw new Error("Expected: " + expected + ", found: " + result);
673 }
674 }
675
676 private static void expectEquals(short expected, short result) {
677 if (expected != result) {
678 throw new Error("Expected: " + expected + ", found: " + result);
679 }
680 }
681
682 private static void expectEquals(int expected, int result) {
683 if (expected != result) {
684 throw new Error("Expected: " + expected + ", found: " + result);
685 }
686 }
687
688 private static void expectEquals(long expected, long result) {
689 if (expected != result) {
690 throw new Error("Expected: " + expected + ", found: " + result);
691 }
692 }
693
694 private static void expectEquals(float expected, float result) {
695 if (expected != result) {
696 throw new Error("Expected: " + expected + ", found: " + result);
697 }
698 }
699
700 private static void expectEquals(double expected, double result) {
701 if (expected != result) {
702 throw new Error("Expected: " + expected + ", found: " + result);
703 }
704 }
705
706 private static void expectEquals(Object expected, Object result) {
707 if (expected != result) {
708 throw new Error("Expected: " + expected + ", found: " + result);
709 }
710 }
711}