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 //
20 public 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 
SInvLoopZ()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 
SInvLoopB()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 
SInvLoopC()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 
SInvLoopS()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 
SInvLoopI()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 
SInvLoopJ()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 
SInvLoopF()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 
SInvLoopD()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 
SInvLoopL()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 
SVarLoopZ()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 
SVarLoopB()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 
SVarLoopC()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 
SVarLoopS()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 
SVarLoopI()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 
SVarLoopJ()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 
SVarLoopF()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 
SVarLoopD()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 
SVarLoopL()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 
SCrossOverLoopZ()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 
SCrossOverLoopB()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 
SCrossOverLoopC()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 
SCrossOverLoopS()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 
SCrossOverLoopI()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 
SCrossOverLoopJ()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 
SCrossOverLoopF()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 
SCrossOverLoopD()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 
SCrossOverLoopL()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 
InvLoopZ()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 
InvLoopB()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 
InvLoopC()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 
InvLoopS()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 
InvLoopI()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 
InvLoopJ()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 
InvLoopF()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 
InvLoopD()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 
InvLoopL()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 
VarLoopZ()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 
VarLoopB()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 
VarLoopC()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 
VarLoopS()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 
VarLoopI()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 
VarLoopJ()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 
VarLoopF()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 
VarLoopD()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 
VarLoopL()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 
CrossOverLoopZ()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 
CrossOverLoopB()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 
CrossOverLoopC()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 
CrossOverLoopS()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 
CrossOverLoopI()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 
CrossOverLoopJ()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 
CrossOverLoopF()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 
CrossOverLoopD()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 
CrossOverLoopL()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 
main(String[] args)765   public static void main(String[] args) {
766     DoStaticTests();
767     new Main().DoInstanceTests();
768   }
769 
DoStaticTests()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 
DoInstanceTests()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 
expectEquals(boolean expected, boolean result)1046   private static void expectEquals(boolean expected, boolean result) {
1047     if (expected != result) {
1048       throw new Error("Expected: " + expected + ", found: " + result);
1049     }
1050   }
1051 
expectEquals(byte expected, byte result)1052   private static void expectEquals(byte expected, byte result) {
1053     if (expected != result) {
1054       throw new Error("Expected: " + expected + ", found: " + result);
1055     }
1056   }
1057 
expectEquals(char expected, char result)1058   private static void expectEquals(char expected, char result) {
1059     if (expected != result) {
1060       throw new Error("Expected: " + expected + ", found: " + result);
1061     }
1062   }
1063 
expectEquals(short expected, short result)1064   private static void expectEquals(short expected, short result) {
1065     if (expected != result) {
1066       throw new Error("Expected: " + expected + ", found: " + result);
1067     }
1068   }
1069 
expectEquals(int expected, int result)1070   private static void expectEquals(int expected, int result) {
1071     if (expected != result) {
1072       throw new Error("Expected: " + expected + ", found: " + result);
1073     }
1074   }
1075 
expectEquals(long expected, long result)1076   private static void expectEquals(long expected, long result) {
1077     if (expected != result) {
1078       throw new Error("Expected: " + expected + ", found: " + result);
1079     }
1080   }
1081 
expectEquals(float expected, float result)1082   private static void expectEquals(float expected, float result) {
1083     if (expected != result) {
1084       throw new Error("Expected: " + expected + ", found: " + result);
1085     }
1086   }
1087 
expectEquals(double expected, double result)1088   private static void expectEquals(double expected, double result) {
1089     if (expected != result) {
1090       throw new Error("Expected: " + expected + ", found: " + result);
1091     }
1092   }
1093 
expectEquals(Object expected, Object result)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