1/*
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 static and 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  // Static fields.
27  //
28
29  private static boolean sZ;
30  private static byte sB;
31  private static char sC;
32  private static short sS;
33  private static int sI;
34  private static long sJ;
35  private static float sF;
36  private static double sD;
37  private static Object sL;
38
39  //
40  // Static arrays.
41  //
42
43  private static boolean[] sArrZ;
44  private static byte[] sArrB;
45  private static char[] sArrC;
46  private static short[] sArrS;
47  private static int[] sArrI;
48  private static long[] sArrJ;
49  private static float[] sArrF;
50  private static double[] sArrD;
51  private static Object[] sArrL;
52
53  //
54  // Instance fields.
55  //
56
57  private boolean mZ;
58  private byte mB;
59  private char mC;
60  private short mS;
61  private int mI;
62  private long mJ;
63  private float mF;
64  private double mD;
65  private Object mL;
66
67  //
68  // Instance arrays.
69  //
70
71  private boolean[] mArrZ;
72  private byte[] mArrB;
73  private char[] mArrC;
74  private short[] mArrS;
75  private int[] mArrI;
76  private long[] mArrJ;
77  private float[] mArrF;
78  private double[] mArrD;
79  private Object[] mArrL;
80
81  //
82  // Loops on static arrays with invariant static field references.
83  // The checker is used to ensure hoisting occurred.
84  //
85
86  /// CHECK-START: void Main.SInvLoopZ() licm (before)
87  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
88  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
89
90  /// CHECK-START: void Main.SInvLoopZ() licm (after)
91  /// CHECK-DAG: StaticFieldGet loop:none
92  /// CHECK-DAG: StaticFieldGet loop:none
93
94  private static void SInvLoopZ() {
95    for (int i = 0; i < sArrZ.length; i++) {
96      sArrZ[i] = sZ;
97    }
98  }
99
100  /// CHECK-START: void Main.SInvLoopB() licm (before)
101  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
102  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
103
104  /// CHECK-START: void Main.SInvLoopB() licm (after)
105  /// CHECK-DAG: StaticFieldGet loop:none
106  /// CHECK-DAG: StaticFieldGet loop:none
107
108  private static void SInvLoopB() {
109    for (int i = 0; i < sArrB.length; i++) {
110      sArrB[i] = sB;
111    }
112  }
113
114  /// CHECK-START: void Main.SInvLoopC() licm (before)
115  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
116  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
117
118  /// CHECK-START: void Main.SInvLoopC() licm (after)
119  /// CHECK-DAG: StaticFieldGet loop:none
120  /// CHECK-DAG: StaticFieldGet loop:none
121
122  private static void SInvLoopC() {
123    for (int i = 0; i < sArrC.length; i++) {
124      sArrC[i] = sC;
125    }
126  }
127
128  /// CHECK-START: void Main.SInvLoopS() licm (before)
129  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
130  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
131
132  /// CHECK-START: void Main.SInvLoopS() licm (after)
133  /// CHECK-DAG: StaticFieldGet loop:none
134  /// CHECK-DAG: StaticFieldGet loop:none
135
136  private static void SInvLoopS() {
137    for (int i = 0; i < sArrS.length; i++) {
138      sArrS[i] = sS;
139    }
140  }
141
142  /// CHECK-START: void Main.SInvLoopI() licm (before)
143  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
144  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
145
146  /// CHECK-START: void Main.SInvLoopI() licm (after)
147  /// CHECK-DAG: StaticFieldGet loop:none
148  /// CHECK-DAG: StaticFieldGet loop:none
149
150  private static void SInvLoopI() {
151    for (int i = 0; i < sArrI.length; i++) {
152      sArrI[i] = sI;
153    }
154  }
155
156  /// CHECK-START: void Main.SInvLoopJ() licm (before)
157  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
158  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
159
160  /// CHECK-START: void Main.SInvLoopJ() licm (after)
161  /// CHECK-DAG: StaticFieldGet loop:none
162  /// CHECK-DAG: StaticFieldGet loop:none
163
164  private static void SInvLoopJ() {
165    for (int i = 0; i < sArrJ.length; i++) {
166      sArrJ[i] = sJ;
167    }
168  }
169
170  /// CHECK-START: void Main.SInvLoopF() licm (before)
171  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
172  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
173
174  /// CHECK-START: void Main.SInvLoopF() licm (after)
175  /// CHECK-DAG: StaticFieldGet loop:none
176  /// CHECK-DAG: StaticFieldGet loop:none
177
178  private static void SInvLoopF() {
179    for (int i = 0; i < sArrF.length; i++) {
180      sArrF[i] = sF;
181    }
182  }
183
184  /// CHECK-START: void Main.SInvLoopD() licm (before)
185  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
186  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
187
188  /// CHECK-START: void Main.SInvLoopD() licm (after)
189  /// CHECK-DAG: StaticFieldGet loop:none
190  /// CHECK-DAG: StaticFieldGet loop:none
191
192  private static void SInvLoopD() {
193    for (int i = 0; i < sArrD.length; i++) {
194      sArrD[i] = sD;
195    }
196  }
197
198  /// CHECK-START: void Main.SInvLoopL() licm (before)
199  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
200  /// CHECK-DAG: StaticFieldGet loop:{{B\d+}}
201
202  /// CHECK-START: void Main.SInvLoopL() licm (after)
203  /// CHECK-DAG: StaticFieldGet loop:none
204  /// CHECK-DAG: StaticFieldGet loop:none
205
206  private static void SInvLoopL() {
207    for (int i = 0; i < sArrL.length; i++) {
208      sArrL[i] = sL;
209    }
210  }
211
212  //
213  // Loops on static arrays with variant static field references.
214  // Incorrect hoisting is detected by incorrect outcome.
215  //
216
217  private static void SVarLoopZ() {
218    for (int i = 0; i < sArrZ.length; i++) {
219      sArrZ[i] = sZ;
220      if (i == 10)
221        sZ = !sZ;
222    }
223  }
224
225  private static void SVarLoopB() {
226    for (int i = 0; i < sArrB.length; i++) {
227      sArrB[i] = sB;
228      if (i == 10)
229        sB++;
230    }
231  }
232
233  private static void SVarLoopC() {
234    for (int i = 0; i < sArrC.length; i++) {
235      sArrC[i] = sC;
236      if (i == 10)
237        sC++;
238    }
239  }
240
241  private static void SVarLoopS() {
242    for (int i = 0; i < sArrS.length; i++) {
243      sArrS[i] = sS;
244      if (i == 10)
245        sS++;
246    }
247  }
248
249  private static void SVarLoopI() {
250    for (int i = 0; i < sArrI.length; i++) {
251      sArrI[i] = sI;
252      if (i == 10)
253        sI++;
254    }
255  }
256
257  private static void SVarLoopJ() {
258    for (int i = 0; i < sArrJ.length; i++) {
259      sArrJ[i] = sJ;
260      if (i == 10)
261        sJ++;
262    }
263  }
264
265  private static void SVarLoopF() {
266    for (int i = 0; i < sArrF.length; i++) {
267      sArrF[i] = sF;
268      if (i == 10)
269        sF++;
270    }
271  }
272
273  private static void SVarLoopD() {
274    for (int i = 0; i < sArrD.length; i++) {
275      sArrD[i] = sD;
276      if (i == 10)
277        sD++;
278    }
279  }
280
281  private static void SVarLoopL() {
282    for (int i = 0; i < sArrL.length; i++) {
283      sArrL[i] = sL;
284      if (i == 10)
285        sL = anotherObject;
286    }
287  }
288
289  //
290  // Loops on static arrays with a cross-over reference.
291  // Incorrect hoisting is detected by incorrect outcome.
292  // In addition, the checker is used to detect no hoisting.
293  //
294
295  /// CHECK-START: void Main.SCrossOverLoopZ() licm (before)
296  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
297  /// CHECK-DAG: ArraySet loop:{{B\d+}}
298
299  /// CHECK-START: void Main.SCrossOverLoopZ() licm (after)
300  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
301  /// CHECK-DAG: ArraySet loop:{{B\d+}}
302
303  private static void SCrossOverLoopZ() {
304    for (int i = 0; i < sArrZ.length; i++) {
305      sArrZ[i] = !sArrZ[20];
306    }
307  }
308
309  /// CHECK-START: void Main.SCrossOverLoopB() licm (before)
310  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
311  /// CHECK-DAG: ArraySet loop:{{B\d+}}
312
313  /// CHECK-START: void Main.SCrossOverLoopB() licm (after)
314  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
315  /// CHECK-DAG: ArraySet loop:{{B\d+}}
316
317  private static void SCrossOverLoopB() {
318    for (int i = 0; i < sArrB.length; i++) {
319      sArrB[i] = (byte)(sArrB[20] + 2);
320    }
321  }
322
323  /// CHECK-START: void Main.SCrossOverLoopC() licm (before)
324  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
325  /// CHECK-DAG: ArraySet loop:{{B\d+}}
326
327  /// CHECK-START: void Main.SCrossOverLoopC() licm (after)
328  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
329  /// CHECK-DAG: ArraySet loop:{{B\d+}}
330
331  private static void SCrossOverLoopC() {
332    for (int i = 0; i < sArrC.length; i++) {
333      sArrC[i] = (char)(sArrC[20] + 2);
334    }
335  }
336
337  /// CHECK-START: void Main.SCrossOverLoopS() licm (before)
338  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
339  /// CHECK-DAG: ArraySet loop:{{B\d+}}
340
341  /// CHECK-START: void Main.SCrossOverLoopS() licm (after)
342  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
343  /// CHECK-DAG: ArraySet loop:{{B\d+}}
344
345  private static void SCrossOverLoopS() {
346    for (int i = 0; i < sArrS.length; i++) {
347      sArrS[i] = (short)(sArrS[20] + 2);
348    }
349  }
350
351  /// CHECK-START: void Main.SCrossOverLoopI() licm (before)
352  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
353  /// CHECK-DAG: ArraySet loop:{{B\d+}}
354
355  /// CHECK-START: void Main.SCrossOverLoopI() licm (after)
356  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
357  /// CHECK-DAG: ArraySet loop:{{B\d+}}
358
359  private static void SCrossOverLoopI() {
360    for (int i = 0; i < sArrI.length; i++) {
361      sArrI[i] = sArrI[20] + 2;
362    }
363  }
364
365  /// CHECK-START: void Main.SCrossOverLoopJ() licm (before)
366  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
367  /// CHECK-DAG: ArraySet loop:{{B\d+}}
368
369  /// CHECK-START: void Main.SCrossOverLoopJ() licm (after)
370  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
371  /// CHECK-DAG: ArraySet loop:{{B\d+}}
372
373  private static void SCrossOverLoopJ() {
374    for (int i = 0; i < sArrJ.length; i++) {
375      sArrJ[i] = sArrJ[20] + 2;
376    }
377  }
378
379  /// CHECK-START: void Main.SCrossOverLoopF() licm (before)
380  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
381  /// CHECK-DAG: ArraySet loop:{{B\d+}}
382
383  /// CHECK-START: void Main.SCrossOverLoopF() licm (after)
384  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
385  /// CHECK-DAG: ArraySet loop:{{B\d+}}
386
387  private static void SCrossOverLoopF() {
388    for (int i = 0; i < sArrF.length; i++) {
389      sArrF[i] = sArrF[20] + 2;
390    }
391  }
392
393  /// CHECK-START: void Main.SCrossOverLoopD() licm (before)
394  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
395  /// CHECK-DAG: ArraySet loop:{{B\d+}}
396
397  /// CHECK-START: void Main.SCrossOverLoopD() licm (after)
398  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
399  /// CHECK-DAG: ArraySet loop:{{B\d+}}
400
401  private static void SCrossOverLoopD() {
402    for (int i = 0; i < sArrD.length; i++) {
403      sArrD[i] = sArrD[20] + 2;
404    }
405  }
406
407  /// CHECK-START: void Main.SCrossOverLoopL() licm (before)
408  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
409  /// CHECK-DAG: ArraySet loop:{{B\d+}}
410
411  /// CHECK-START: void Main.SCrossOverLoopL() licm (after)
412  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
413  /// CHECK-DAG: ArraySet loop:{{B\d+}}
414
415  private static void SCrossOverLoopL() {
416    for (int i = 0; i < sArrL.length; i++) {
417      sArrL[i] = (sArrL[20] == anObject) ? anotherObject : anObject;
418    }
419  }
420
421  //
422  // Loops on instance arrays with invariant instance field references.
423  // The checker is used to ensure hoisting occurred.
424  //
425
426  /// CHECK-START: void Main.InvLoopZ() licm (before)
427  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
428  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
429
430  /// CHECK-START: void Main.InvLoopZ() licm (after)
431  /// CHECK-DAG: InstanceFieldGet loop:none
432  /// CHECK-DAG: InstanceFieldGet loop:none
433
434  private void InvLoopZ() {
435    for (int i = 0; i < mArrZ.length; i++) {
436      mArrZ[i] = mZ;
437    }
438  }
439
440  /// CHECK-START: void Main.InvLoopB() licm (before)
441  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
442  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
443
444  /// CHECK-START: void Main.InvLoopB() licm (after)
445  /// CHECK-DAG: InstanceFieldGet loop:none
446  /// CHECK-DAG: InstanceFieldGet loop:none
447
448  private void InvLoopB() {
449    for (int i = 0; i < mArrB.length; i++) {
450      mArrB[i] = mB;
451    }
452  }
453
454  /// CHECK-START: void Main.InvLoopC() licm (before)
455  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
456  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
457
458  /// CHECK-START: void Main.InvLoopC() licm (after)
459  /// CHECK-DAG: InstanceFieldGet loop:none
460  /// CHECK-DAG: InstanceFieldGet loop:none
461
462  private void InvLoopC() {
463    for (int i = 0; i < mArrC.length; i++) {
464      mArrC[i] = mC;
465    }
466  }
467
468  /// CHECK-START: void Main.InvLoopS() licm (before)
469  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
470  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
471
472  /// CHECK-START: void Main.InvLoopS() licm (after)
473  /// CHECK-DAG: InstanceFieldGet loop:none
474  /// CHECK-DAG: InstanceFieldGet loop:none
475
476  private void InvLoopS() {
477    for (int i = 0; i < mArrS.length; i++) {
478      mArrS[i] = mS;
479    }
480  }
481
482  /// CHECK-START: void Main.InvLoopI() licm (before)
483  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
484  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
485
486  /// CHECK-START: void Main.InvLoopI() licm (after)
487  /// CHECK-DAG: InstanceFieldGet loop:none
488  /// CHECK-DAG: InstanceFieldGet loop:none
489
490  private void InvLoopI() {
491    for (int i = 0; i < mArrI.length; i++) {
492      mArrI[i] = mI;
493    }
494  }
495
496  /// CHECK-START: void Main.InvLoopJ() licm (before)
497  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
498  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
499
500  /// CHECK-START: void Main.InvLoopJ() licm (after)
501  /// CHECK-DAG: InstanceFieldGet loop:none
502  /// CHECK-DAG: InstanceFieldGet loop:none
503
504  private void InvLoopJ() {
505    for (int i = 0; i < mArrJ.length; i++) {
506      mArrJ[i] = mJ;
507    }
508  }
509
510  /// CHECK-START: void Main.InvLoopF() licm (before)
511  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
512  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
513
514  /// CHECK-START: void Main.InvLoopF() licm (after)
515  /// CHECK-DAG: InstanceFieldGet loop:none
516  /// CHECK-DAG: InstanceFieldGet loop:none
517
518  private void InvLoopF() {
519    for (int i = 0; i < mArrF.length; i++) {
520      mArrF[i] = mF;
521    }
522  }
523
524  /// CHECK-START: void Main.InvLoopD() licm (before)
525  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
526  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
527
528  /// CHECK-START: void Main.InvLoopD() licm (after)
529  /// CHECK-DAG: InstanceFieldGet loop:none
530  /// CHECK-DAG: InstanceFieldGet loop:none
531
532  private void InvLoopD() {
533    for (int i = 0; i < mArrD.length; i++) {
534      mArrD[i] = mD;
535    }
536  }
537
538  /// CHECK-START: void Main.InvLoopL() licm (before)
539  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
540  /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}}
541
542  /// CHECK-START: void Main.InvLoopL() licm (after)
543  /// CHECK-DAG: InstanceFieldGet loop:none
544  /// CHECK-DAG: InstanceFieldGet loop:none
545
546  private void InvLoopL() {
547    for (int i = 0; i < mArrL.length; i++) {
548      mArrL[i] = mL;
549    }
550  }
551
552  //
553  // Loops on instance arrays with variant instance field references.
554  // Incorrect hoisting is detected by incorrect outcome.
555  //
556
557  private void VarLoopZ() {
558    for (int i = 0; i < mArrZ.length; i++) {
559      mArrZ[i] = mZ;
560      if (i == 10)
561        mZ = !mZ;
562    }
563  }
564
565  private void VarLoopB() {
566    for (int i = 0; i < mArrB.length; i++) {
567      mArrB[i] = mB;
568      if (i == 10)
569        mB++;
570    }
571  }
572
573  private void VarLoopC() {
574    for (int i = 0; i < mArrC.length; i++) {
575      mArrC[i] = mC;
576      if (i == 10)
577        mC++;
578    }
579  }
580
581  private void VarLoopS() {
582    for (int i = 0; i < mArrS.length; i++) {
583      mArrS[i] = mS;
584      if (i == 10)
585        mS++;
586    }
587  }
588
589  private void VarLoopI() {
590    for (int i = 0; i < mArrI.length; i++) {
591      mArrI[i] = mI;
592      if (i == 10)
593        mI++;
594    }
595  }
596
597  private void VarLoopJ() {
598    for (int i = 0; i < mArrJ.length; i++) {
599      mArrJ[i] = mJ;
600      if (i == 10)
601        mJ++;
602    }
603  }
604
605  private void VarLoopF() {
606    for (int i = 0; i < mArrF.length; i++) {
607      mArrF[i] = mF;
608      if (i == 10)
609        mF++;
610    }
611  }
612
613  private void VarLoopD() {
614    for (int i = 0; i < mArrD.length; i++) {
615      mArrD[i] = mD;
616      if (i == 10)
617        mD++;
618    }
619  }
620
621  private void VarLoopL() {
622    for (int i = 0; i < mArrL.length; i++) {
623      mArrL[i] = mL;
624      if (i == 10)
625        mL = anotherObject;
626    }
627  }
628
629  //
630  // Loops on instance arrays with a cross-over reference.
631  // Incorrect hoisting is detected by incorrect outcome.
632  // In addition, the checker is used to detect no hoisting.
633  //
634
635  /// CHECK-START: void Main.CrossOverLoopZ() licm (before)
636  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
637  /// CHECK-DAG: ArraySet loop:{{B\d+}}
638
639  /// CHECK-START: void Main.CrossOverLoopZ() licm (after)
640  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
641  /// CHECK-DAG: ArraySet loop:{{B\d+}}
642
643  private void CrossOverLoopZ() {
644    for (int i = 0; i < mArrZ.length; i++) {
645      mArrZ[i] = !mArrZ[20];
646    }
647  }
648
649  /// CHECK-START: void Main.CrossOverLoopB() licm (before)
650  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
651  /// CHECK-DAG: ArraySet loop:{{B\d+}}
652
653  /// CHECK-START: void Main.CrossOverLoopB() licm (after)
654  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
655  /// CHECK-DAG: ArraySet loop:{{B\d+}}
656
657  private void CrossOverLoopB() {
658    for (int i = 0; i < mArrB.length; i++) {
659      mArrB[i] = (byte)(mArrB[20] + 2);
660    }
661  }
662
663  /// CHECK-START: void Main.CrossOverLoopC() licm (before)
664  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
665  /// CHECK-DAG: ArraySet loop:{{B\d+}}
666
667  /// CHECK-START: void Main.CrossOverLoopC() licm (after)
668  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
669  /// CHECK-DAG: ArraySet loop:{{B\d+}}
670
671  private void CrossOverLoopC() {
672    for (int i = 0; i < mArrC.length; i++) {
673      mArrC[i] = (char)(mArrC[20] + 2);
674    }
675  }
676
677  /// CHECK-START: void Main.CrossOverLoopS() licm (before)
678  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
679  /// CHECK-DAG: ArraySet loop:{{B\d+}}
680
681  /// CHECK-START: void Main.CrossOverLoopS() licm (after)
682  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
683  /// CHECK-DAG: ArraySet loop:{{B\d+}}
684
685  private void CrossOverLoopS() {
686    for (int i = 0; i < mArrS.length; i++) {
687      mArrS[i] = (short)(mArrS[20] + 2);
688    }
689  }
690
691  /// CHECK-START: void Main.CrossOverLoopI() licm (before)
692  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
693  /// CHECK-DAG: ArraySet loop:{{B\d+}}
694
695  /// CHECK-START: void Main.CrossOverLoopI() licm (after)
696  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
697  /// CHECK-DAG: ArraySet loop:{{B\d+}}
698
699  private void CrossOverLoopI() {
700    for (int i = 0; i < mArrI.length; i++) {
701      mArrI[i] = mArrI[20] + 2;
702    }
703  }
704
705  /// CHECK-START: void Main.CrossOverLoopJ() licm (before)
706  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
707  /// CHECK-DAG: ArraySet loop:{{B\d+}}
708
709  /// CHECK-START: void Main.CrossOverLoopJ() licm (after)
710  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
711  /// CHECK-DAG: ArraySet loop:{{B\d+}}
712
713  private void CrossOverLoopJ() {
714    for (int i = 0; i < mArrJ.length; i++) {
715      mArrJ[i] = mArrJ[20] + 2;
716    }
717  }
718
719  /// CHECK-START: void Main.CrossOverLoopF() licm (before)
720  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
721  /// CHECK-DAG: ArraySet loop:{{B\d+}}
722
723  /// CHECK-START: void Main.CrossOverLoopF() licm (after)
724  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
725  /// CHECK-DAG: ArraySet loop:{{B\d+}}
726
727  private void CrossOverLoopF() {
728    for (int i = 0; i < mArrF.length; i++) {
729      mArrF[i] = mArrF[20] + 2;
730    }
731  }
732
733  /// CHECK-START: void Main.CrossOverLoopD() licm (before)
734  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
735  /// CHECK-DAG: ArraySet loop:{{B\d+}}
736
737  /// CHECK-START: void Main.CrossOverLoopD() licm (after)
738  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
739  /// CHECK-DAG: ArraySet loop:{{B\d+}}
740
741  private void CrossOverLoopD() {
742    for (int i = 0; i < mArrD.length; i++) {
743      mArrD[i] = mArrD[20] + 2;
744    }
745  }
746
747  /// CHECK-START: void Main.CrossOverLoopL() licm (before)
748  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
749  /// CHECK-DAG: ArraySet loop:{{B\d+}}
750
751  /// CHECK-START: void Main.CrossOverLoopL() licm (after)
752  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
753  /// CHECK-DAG: ArraySet loop:{{B\d+}}
754
755  private void CrossOverLoopL() {
756    for (int i = 0; i < mArrL.length; i++) {
757      mArrL[i] = (mArrL[20] == anObject) ? anotherObject : anObject;
758    }
759  }
760
761  //
762  // Driver and testers.
763  //
764
765  public static void main(String[] args) {
766    DoStaticTests();
767    new Main().DoInstanceTests();
768  }
769
770  private static void DoStaticTests() {
771    // Type Z.
772    sZ = true;
773    sArrZ = new boolean[100];
774    SInvLoopZ();
775    for (int i = 0; i < sArrZ.length; i++) {
776      expectEquals(true, sArrZ[i]);
777    }
778    SVarLoopZ();
779    for (int i = 0; i < sArrZ.length; i++) {
780      expectEquals(i <= 10, sArrZ[i]);
781    }
782    SCrossOverLoopZ();
783    for (int i = 0; i < sArrZ.length; i++) {
784      expectEquals(i <= 20, sArrZ[i]);
785    }
786    // Type B.
787    sB = 1;
788    sArrB = new byte[100];
789    SInvLoopB();
790    for (int i = 0; i < sArrB.length; i++) {
791      expectEquals(1, sArrB[i]);
792    }
793    SVarLoopB();
794    for (int i = 0; i < sArrB.length; i++) {
795      expectEquals(i <= 10 ? 1 : 2, sArrB[i]);
796    }
797    SCrossOverLoopB();
798    for (int i = 0; i < sArrB.length; i++) {
799      expectEquals(i <= 20 ? 4 : 6, sArrB[i]);
800    }
801    // Type C.
802    sC = 2;
803    sArrC = new char[100];
804    SInvLoopC();
805    for (int i = 0; i < sArrC.length; i++) {
806      expectEquals(2, sArrC[i]);
807    }
808    SVarLoopC();
809    for (int i = 0; i < sArrC.length; i++) {
810      expectEquals(i <= 10 ? 2 : 3, sArrC[i]);
811    }
812    SCrossOverLoopC();
813    for (int i = 0; i < sArrC.length; i++) {
814      expectEquals(i <= 20 ? 5 : 7, sArrC[i]);
815    }
816    // Type S.
817    sS = 3;
818    sArrS = new short[100];
819    SInvLoopS();
820    for (int i = 0; i < sArrS.length; i++) {
821      expectEquals(3, sArrS[i]);
822    }
823    SVarLoopS();
824    for (int i = 0; i < sArrS.length; i++) {
825      expectEquals(i <= 10 ? 3 : 4, sArrS[i]);
826    }
827    SCrossOverLoopS();
828    for (int i = 0; i < sArrS.length; i++) {
829      expectEquals(i <= 20 ? 6 : 8, sArrS[i]);
830    }
831    // Type I.
832    sI = 4;
833    sArrI = new int[100];
834    SInvLoopI();
835    for (int i = 0; i < sArrI.length; i++) {
836      expectEquals(4, sArrI[i]);
837    }
838    SVarLoopI();
839    for (int i = 0; i < sArrI.length; i++) {
840      expectEquals(i <= 10 ? 4 : 5, sArrI[i]);
841    }
842    SCrossOverLoopI();
843    for (int i = 0; i < sArrI.length; i++) {
844      expectEquals(i <= 20 ? 7 : 9, sArrI[i]);
845    }
846    // Type J.
847    sJ = 5;
848    sArrJ = new long[100];
849    SInvLoopJ();
850    for (int i = 0; i < sArrJ.length; i++) {
851      expectEquals(5, sArrJ[i]);
852    }
853    SVarLoopJ();
854    for (int i = 0; i < sArrJ.length; i++) {
855      expectEquals(i <= 10 ? 5 : 6, sArrJ[i]);
856    }
857    SCrossOverLoopJ();
858    for (int i = 0; i < sArrJ.length; i++) {
859      expectEquals(i <= 20 ? 8 : 10, sArrJ[i]);
860    }
861    // Type F.
862    sF = 6.0f;
863    sArrF = new float[100];
864    SInvLoopF();
865    for (int i = 0; i < sArrF.length; i++) {
866      expectEquals(6, sArrF[i]);
867    }
868    SVarLoopF();
869    for (int i = 0; i < sArrF.length; i++) {
870      expectEquals(i <= 10 ? 6 : 7, sArrF[i]);
871    }
872    SCrossOverLoopF();
873    for (int i = 0; i < sArrF.length; i++) {
874      expectEquals(i <= 20 ? 9 : 11, sArrF[i]);
875    }
876    // Type D.
877    sD = 7.0;
878    sArrD = new double[100];
879    SInvLoopD();
880    for (int i = 0; i < sArrD.length; i++) {
881      expectEquals(7.0, sArrD[i]);
882    }
883    SVarLoopD();
884    for (int i = 0; i < sArrD.length; i++) {
885      expectEquals(i <= 10 ? 7 : 8, sArrD[i]);
886    }
887    SCrossOverLoopD();
888    for (int i = 0; i < sArrD.length; i++) {
889      expectEquals(i <= 20 ? 10 : 12, sArrD[i]);
890    }
891    // Type L.
892    sL = anObject;
893    sArrL = new Object[100];
894    SInvLoopL();
895    for (int i = 0; i < sArrL.length; i++) {
896      expectEquals(anObject, sArrL[i]);
897    }
898    SVarLoopL();
899    for (int i = 0; i < sArrL.length; i++) {
900      expectEquals(i <= 10 ? anObject : anotherObject, sArrL[i]);
901    }
902    SCrossOverLoopL();
903    for (int i = 0; i < sArrL.length; i++) {
904      expectEquals(i <= 20 ? anObject : anotherObject, sArrL[i]);
905    }
906  }
907
908  private void DoInstanceTests() {
909    // Type Z.
910    mZ = true;
911    mArrZ = new boolean[100];
912    InvLoopZ();
913    for (int i = 0; i < mArrZ.length; i++) {
914      expectEquals(true, mArrZ[i]);
915    }
916    VarLoopZ();
917    for (int i = 0; i < mArrZ.length; i++) {
918      expectEquals(i <= 10, mArrZ[i]);
919    }
920    CrossOverLoopZ();
921    for (int i = 0; i < mArrZ.length; i++) {
922      expectEquals(i <= 20, mArrZ[i]);
923    }
924    // Type B.
925    mB = 1;
926    mArrB = new byte[100];
927    InvLoopB();
928    for (int i = 0; i < mArrB.length; i++) {
929      expectEquals(1, mArrB[i]);
930    }
931    VarLoopB();
932    for (int i = 0; i < mArrB.length; i++) {
933      expectEquals(i <= 10 ? 1 : 2, mArrB[i]);
934    }
935    CrossOverLoopB();
936    for (int i = 0; i < mArrB.length; i++) {
937      expectEquals(i <= 20 ? 4 : 6, mArrB[i]);
938    }
939    // Type C.
940    mC = 2;
941    mArrC = new char[100];
942    InvLoopC();
943    for (int i = 0; i < mArrC.length; i++) {
944      expectEquals(2, mArrC[i]);
945    }
946    VarLoopC();
947    for (int i = 0; i < mArrC.length; i++) {
948      expectEquals(i <= 10 ? 2 : 3, mArrC[i]);
949    }
950    CrossOverLoopC();
951    for (int i = 0; i < mArrC.length; i++) {
952      expectEquals(i <= 20 ? 5 : 7, mArrC[i]);
953    }
954    // Type S.
955    mS = 3;
956    mArrS = new short[100];
957    InvLoopS();
958    for (int i = 0; i < mArrS.length; i++) {
959      expectEquals(3, mArrS[i]);
960    }
961    VarLoopS();
962    for (int i = 0; i < mArrS.length; i++) {
963      expectEquals(i <= 10 ? 3 : 4, mArrS[i]);
964    }
965    CrossOverLoopS();
966    for (int i = 0; i < mArrS.length; i++) {
967      expectEquals(i <= 20 ? 6 : 8, mArrS[i]);
968    }
969    // Type I.
970    mI = 4;
971    mArrI = new int[100];
972    InvLoopI();
973    for (int i = 0; i < mArrI.length; i++) {
974      expectEquals(4, mArrI[i]);
975    }
976    VarLoopI();
977    for (int i = 0; i < mArrI.length; i++) {
978      expectEquals(i <= 10 ? 4 : 5, mArrI[i]);
979    }
980    CrossOverLoopI();
981    for (int i = 0; i < mArrI.length; i++) {
982      expectEquals(i <= 20 ? 7 : 9, mArrI[i]);
983    }
984    // Type J.
985    mJ = 5;
986    mArrJ = new long[100];
987    InvLoopJ();
988    for (int i = 0; i < mArrJ.length; i++) {
989      expectEquals(5, mArrJ[i]);
990    }
991    VarLoopJ();
992    for (int i = 0; i < mArrJ.length; i++) {
993      expectEquals(i <= 10 ? 5 : 6, mArrJ[i]);
994    }
995    CrossOverLoopJ();
996    for (int i = 0; i < mArrJ.length; i++) {
997      expectEquals(i <= 20 ? 8 : 10, mArrJ[i]);
998    }
999    // Type F.
1000    mF = 6.0f;
1001    mArrF = new float[100];
1002    InvLoopF();
1003    for (int i = 0; i < mArrF.length; i++) {
1004      expectEquals(6, mArrF[i]);
1005    }
1006    VarLoopF();
1007    for (int i = 0; i < mArrF.length; i++) {
1008      expectEquals(i <= 10 ? 6 : 7, mArrF[i]);
1009    }
1010    CrossOverLoopF();
1011    for (int i = 0; i < mArrF.length; i++) {
1012      expectEquals(i <= 20 ? 9 : 11, mArrF[i]);
1013    }
1014    // Type D.
1015    mD = 7.0;
1016    mArrD = new double[100];
1017    InvLoopD();
1018    for (int i = 0; i < mArrD.length; i++) {
1019      expectEquals(7.0, mArrD[i]);
1020    }
1021    VarLoopD();
1022    for (int i = 0; i < mArrD.length; i++) {
1023      expectEquals(i <= 10 ? 7 : 8, mArrD[i]);
1024    }
1025    CrossOverLoopD();
1026    for (int i = 0; i < mArrD.length; i++) {
1027      expectEquals(i <= 20 ? 10 : 12, mArrD[i]);
1028    }
1029    // Type L.
1030    mL = anObject;
1031    mArrL = new Object[100];
1032    InvLoopL();
1033    for (int i = 0; i < mArrL.length; i++) {
1034      expectEquals(anObject, mArrL[i]);
1035    }
1036    VarLoopL();
1037    for (int i = 0; i < mArrL.length; i++) {
1038      expectEquals(i <= 10 ? anObject : anotherObject, mArrL[i]);
1039    }
1040    CrossOverLoopL();
1041    for (int i = 0; i < mArrL.length; i++) {
1042      expectEquals(i <= 20 ? anObject : anotherObject, mArrL[i]);
1043    }
1044  }
1045
1046  private static void expectEquals(boolean expected, boolean result) {
1047    if (expected != result) {
1048      throw new Error("Expected: " + expected + ", found: " + result);
1049    }
1050  }
1051
1052  private static void expectEquals(byte expected, byte result) {
1053    if (expected != result) {
1054      throw new Error("Expected: " + expected + ", found: " + result);
1055    }
1056  }
1057
1058  private static void expectEquals(char expected, char result) {
1059    if (expected != result) {
1060      throw new Error("Expected: " + expected + ", found: " + result);
1061    }
1062  }
1063
1064  private static void expectEquals(short expected, short result) {
1065    if (expected != result) {
1066      throw new Error("Expected: " + expected + ", found: " + result);
1067    }
1068  }
1069
1070  private static void expectEquals(int expected, int result) {
1071    if (expected != result) {
1072      throw new Error("Expected: " + expected + ", found: " + result);
1073    }
1074  }
1075
1076  private static void expectEquals(long expected, long result) {
1077    if (expected != result) {
1078      throw new Error("Expected: " + expected + ", found: " + result);
1079    }
1080  }
1081
1082  private static void expectEquals(float expected, float result) {
1083    if (expected != result) {
1084      throw new Error("Expected: " + expected + ", found: " + result);
1085    }
1086  }
1087
1088  private static void expectEquals(double expected, double result) {
1089    if (expected != result) {
1090      throw new Error("Expected: " + expected + ", found: " + result);
1091    }
1092  }
1093
1094  private static void expectEquals(Object expected, Object result) {
1095    if (expected != result) {
1096      throw new Error("Expected: " + expected + ", found: " + result);
1097    }
1098  }
1099}
1100