blob: a635a5157f837e116c95d89b77efab6ef2230018 [file] [log] [blame]
Aart Bikd141f452015-07-16 17:40:44 -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 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.
Aart Bik6738ed92015-07-23 14:15:22 -070083 // The checker is used to ensure hoisting occurred.
Aart Bikd141f452015-07-16 17:40:44 -070084 //
85
Aart Bik6738ed92015-07-23 14:15:22 -070086 /// 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
Aart Bikd141f452015-07-16 17:40:44 -070094 private static void SInvLoopZ() {
95 for (int i = 0; i < sArrZ.length; i++) {
96 sArrZ[i] = sZ;
97 }
98 }
99
Aart Bik6738ed92015-07-23 14:15:22 -0700100 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700108 private static void SInvLoopB() {
109 for (int i = 0; i < sArrB.length; i++) {
110 sArrB[i] = sB;
111 }
112 }
113
Aart Bik6738ed92015-07-23 14:15:22 -0700114 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700122 private static void SInvLoopC() {
123 for (int i = 0; i < sArrC.length; i++) {
124 sArrC[i] = sC;
125 }
126 }
127
Aart Bik6738ed92015-07-23 14:15:22 -0700128 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700136 private static void SInvLoopS() {
137 for (int i = 0; i < sArrS.length; i++) {
138 sArrS[i] = sS;
139 }
140 }
141
Aart Bik6738ed92015-07-23 14:15:22 -0700142 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700150 private static void SInvLoopI() {
151 for (int i = 0; i < sArrI.length; i++) {
152 sArrI[i] = sI;
153 }
154 }
155
Aart Bik6738ed92015-07-23 14:15:22 -0700156 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700164 private static void SInvLoopJ() {
165 for (int i = 0; i < sArrJ.length; i++) {
166 sArrJ[i] = sJ;
167 }
168 }
169
Aart Bik6738ed92015-07-23 14:15:22 -0700170 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700178 private static void SInvLoopF() {
179 for (int i = 0; i < sArrF.length; i++) {
180 sArrF[i] = sF;
181 }
182 }
183
Aart Bik6738ed92015-07-23 14:15:22 -0700184 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700192 private static void SInvLoopD() {
193 for (int i = 0; i < sArrD.length; i++) {
194 sArrD[i] = sD;
195 }
196 }
197
Aart Bik6738ed92015-07-23 14:15:22 -0700198 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700206 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.
Aart Bik6738ed92015-07-23 14:15:22 -0700214 // Incorrect hoisting is detected by incorrect outcome.
Aart Bikd141f452015-07-16 17:40:44 -0700215 //
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 //
Aart Bik5ef79942015-07-17 10:21:15 -0700290 // Loops on static arrays with a cross-over reference.
Aart Bik6738ed92015-07-23 14:15:22 -0700291 // Incorrect hoisting is detected by incorrect outcome.
292 // In addition, the checker is used to detect no hoisting.
Aart Bik5ef79942015-07-17 10:21:15 -0700293 //
294
Aart Bik6738ed92015-07-23 14:15:22 -0700295 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700303 private static void SCrossOverLoopZ() {
304 for (int i = 0; i < sArrZ.length; i++) {
305 sArrZ[i] = !sArrZ[20];
306 }
307 }
308
Aart Bik6738ed92015-07-23 14:15:22 -0700309 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700317 private static void SCrossOverLoopB() {
318 for (int i = 0; i < sArrB.length; i++) {
319 sArrB[i] = (byte)(sArrB[20] + 2);
320 }
321 }
322
Aart Bik6738ed92015-07-23 14:15:22 -0700323 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700331 private static void SCrossOverLoopC() {
332 for (int i = 0; i < sArrC.length; i++) {
333 sArrC[i] = (char)(sArrC[20] + 2);
334 }
335 }
336
Aart Bik6738ed92015-07-23 14:15:22 -0700337 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700345 private static void SCrossOverLoopS() {
346 for (int i = 0; i < sArrS.length; i++) {
347 sArrS[i] = (short)(sArrS[20] + 2);
348 }
349 }
350
Aart Bik6738ed92015-07-23 14:15:22 -0700351 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700359 private static void SCrossOverLoopI() {
360 for (int i = 0; i < sArrI.length; i++) {
361 sArrI[i] = sArrI[20] + 2;
362 }
363 }
364
Aart Bik6738ed92015-07-23 14:15:22 -0700365 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700373 private static void SCrossOverLoopJ() {
374 for (int i = 0; i < sArrJ.length; i++) {
375 sArrJ[i] = sArrJ[20] + 2;
376 }
377 }
378
Aart Bik6738ed92015-07-23 14:15:22 -0700379 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700387 private static void SCrossOverLoopF() {
388 for (int i = 0; i < sArrF.length; i++) {
389 sArrF[i] = sArrF[20] + 2;
390 }
391 }
392
Aart Bik6738ed92015-07-23 14:15:22 -0700393 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700401 private static void SCrossOverLoopD() {
402 for (int i = 0; i < sArrD.length; i++) {
403 sArrD[i] = sArrD[20] + 2;
404 }
405 }
406
Aart Bik6738ed92015-07-23 14:15:22 -0700407 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700415 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 //
Aart Bikd141f452015-07-16 17:40:44 -0700422 // Loops on instance arrays with invariant instance field references.
Aart Bik6738ed92015-07-23 14:15:22 -0700423 // The checker is used to ensure hoisting occurred.
Aart Bikd141f452015-07-16 17:40:44 -0700424 //
425
Aart Bik6738ed92015-07-23 14:15:22 -0700426 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700434 private void InvLoopZ() {
435 for (int i = 0; i < mArrZ.length; i++) {
436 mArrZ[i] = mZ;
437 }
438 }
439
Aart Bik6738ed92015-07-23 14:15:22 -0700440 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700448 private void InvLoopB() {
449 for (int i = 0; i < mArrB.length; i++) {
450 mArrB[i] = mB;
451 }
452 }
453
Aart Bik6738ed92015-07-23 14:15:22 -0700454 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700462 private void InvLoopC() {
463 for (int i = 0; i < mArrC.length; i++) {
464 mArrC[i] = mC;
465 }
466 }
467
Aart Bik6738ed92015-07-23 14:15:22 -0700468 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700476 private void InvLoopS() {
477 for (int i = 0; i < mArrS.length; i++) {
478 mArrS[i] = mS;
479 }
480 }
481
Aart Bik6738ed92015-07-23 14:15:22 -0700482 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700490 private void InvLoopI() {
491 for (int i = 0; i < mArrI.length; i++) {
492 mArrI[i] = mI;
493 }
494 }
495
Aart Bik6738ed92015-07-23 14:15:22 -0700496 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700504 private void InvLoopJ() {
505 for (int i = 0; i < mArrJ.length; i++) {
506 mArrJ[i] = mJ;
507 }
508 }
509
Aart Bik6738ed92015-07-23 14:15:22 -0700510 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700518 private void InvLoopF() {
519 for (int i = 0; i < mArrF.length; i++) {
520 mArrF[i] = mF;
521 }
522 }
523
Aart Bik6738ed92015-07-23 14:15:22 -0700524 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700532 private void InvLoopD() {
533 for (int i = 0; i < mArrD.length; i++) {
534 mArrD[i] = mD;
535 }
536 }
537
Aart Bik6738ed92015-07-23 14:15:22 -0700538 /// 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
Aart Bikd141f452015-07-16 17:40:44 -0700546 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.
Aart Bik6738ed92015-07-23 14:15:22 -0700554 // Incorrect hoisting is detected by incorrect outcome.
Aart Bikd141f452015-07-16 17:40:44 -0700555 //
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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700628
629 //
630 // Loops on instance arrays with a cross-over reference.
Aart Bik6738ed92015-07-23 14:15:22 -0700631 // Incorrect hoisting is detected by incorrect outcome.
632 // In addition, the checker is used to detect no hoisting.
Aart Bik5ef79942015-07-17 10:21:15 -0700633 //
634
Aart Bik6738ed92015-07-23 14:15:22 -0700635 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700643 private void CrossOverLoopZ() {
644 for (int i = 0; i < mArrZ.length; i++) {
645 mArrZ[i] = !mArrZ[20];
646 }
647 }
648
Aart Bik6738ed92015-07-23 14:15:22 -0700649 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700657 private void CrossOverLoopB() {
658 for (int i = 0; i < mArrB.length; i++) {
659 mArrB[i] = (byte)(mArrB[20] + 2);
660 }
661 }
662
Aart Bik6738ed92015-07-23 14:15:22 -0700663 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700671 private void CrossOverLoopC() {
672 for (int i = 0; i < mArrC.length; i++) {
673 mArrC[i] = (char)(mArrC[20] + 2);
674 }
675 }
676
Aart Bik6738ed92015-07-23 14:15:22 -0700677 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700685 private void CrossOverLoopS() {
686 for (int i = 0; i < mArrS.length; i++) {
687 mArrS[i] = (short)(mArrS[20] + 2);
688 }
689 }
690
Aart Bik6738ed92015-07-23 14:15:22 -0700691 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700699 private void CrossOverLoopI() {
700 for (int i = 0; i < mArrI.length; i++) {
701 mArrI[i] = mArrI[20] + 2;
702 }
703 }
704
Aart Bik6738ed92015-07-23 14:15:22 -0700705 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700713 private void CrossOverLoopJ() {
714 for (int i = 0; i < mArrJ.length; i++) {
715 mArrJ[i] = mArrJ[20] + 2;
716 }
717 }
718
Aart Bik6738ed92015-07-23 14:15:22 -0700719 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700727 private void CrossOverLoopF() {
728 for (int i = 0; i < mArrF.length; i++) {
729 mArrF[i] = mArrF[20] + 2;
730 }
731 }
732
Aart Bik6738ed92015-07-23 14:15:22 -0700733 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700741 private void CrossOverLoopD() {
742 for (int i = 0; i < mArrD.length; i++) {
743 mArrD[i] = mArrD[20] + 2;
744 }
745 }
746
Aart Bik6738ed92015-07-23 14:15:22 -0700747 /// 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
Aart Bik5ef79942015-07-17 10:21:15 -0700755 private void CrossOverLoopL() {
756 for (int i = 0; i < mArrL.length; i++) {
757 mArrL[i] = (mArrL[20] == anObject) ? anotherObject : anObject;
758 }
759 }
760
Aart Bikd141f452015-07-16 17:40:44 -0700761 //
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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700782 SCrossOverLoopZ();
783 for (int i = 0; i < sArrZ.length; i++) {
784 expectEquals(i <= 20, sArrZ[i]);
785 }
Aart Bikd141f452015-07-16 17:40:44 -0700786 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700797 SCrossOverLoopB();
798 for (int i = 0; i < sArrB.length; i++) {
799 expectEquals(i <= 20 ? 4 : 6, sArrB[i]);
800 }
Aart Bikd141f452015-07-16 17:40:44 -0700801 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700812 SCrossOverLoopC();
813 for (int i = 0; i < sArrC.length; i++) {
814 expectEquals(i <= 20 ? 5 : 7, sArrC[i]);
815 }
Aart Bikd141f452015-07-16 17:40:44 -0700816 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700827 SCrossOverLoopS();
828 for (int i = 0; i < sArrS.length; i++) {
829 expectEquals(i <= 20 ? 6 : 8, sArrS[i]);
830 }
Aart Bikd141f452015-07-16 17:40:44 -0700831 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700842 SCrossOverLoopI();
843 for (int i = 0; i < sArrI.length; i++) {
844 expectEquals(i <= 20 ? 7 : 9, sArrI[i]);
845 }
Aart Bikd141f452015-07-16 17:40:44 -0700846 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700857 SCrossOverLoopJ();
858 for (int i = 0; i < sArrJ.length; i++) {
859 expectEquals(i <= 20 ? 8 : 10, sArrJ[i]);
860 }
Aart Bikd141f452015-07-16 17:40:44 -0700861 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700872 SCrossOverLoopF();
873 for (int i = 0; i < sArrF.length; i++) {
874 expectEquals(i <= 20 ? 9 : 11, sArrF[i]);
875 }
Aart Bikd141f452015-07-16 17:40:44 -0700876 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700887 SCrossOverLoopD();
888 for (int i = 0; i < sArrD.length; i++) {
889 expectEquals(i <= 20 ? 10 : 12, sArrD[i]);
890 }
Aart Bikd141f452015-07-16 17:40:44 -0700891 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700902 SCrossOverLoopL();
903 for (int i = 0; i < sArrL.length; i++) {
904 expectEquals(i <= 20 ? anObject : anotherObject, sArrL[i]);
905 }
Aart Bikd141f452015-07-16 17:40:44 -0700906 }
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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700920 CrossOverLoopZ();
921 for (int i = 0; i < mArrZ.length; i++) {
922 expectEquals(i <= 20, mArrZ[i]);
923 }
Aart Bikd141f452015-07-16 17:40:44 -0700924 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700935 CrossOverLoopB();
936 for (int i = 0; i < mArrB.length; i++) {
937 expectEquals(i <= 20 ? 4 : 6, mArrB[i]);
938 }
Aart Bikd141f452015-07-16 17:40:44 -0700939 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700950 CrossOverLoopC();
951 for (int i = 0; i < mArrC.length; i++) {
952 expectEquals(i <= 20 ? 5 : 7, mArrC[i]);
953 }
Aart Bikd141f452015-07-16 17:40:44 -0700954 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700965 CrossOverLoopS();
966 for (int i = 0; i < mArrS.length; i++) {
967 expectEquals(i <= 20 ? 6 : 8, mArrS[i]);
968 }
Aart Bikd141f452015-07-16 17:40:44 -0700969 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700980 CrossOverLoopI();
981 for (int i = 0; i < mArrI.length; i++) {
982 expectEquals(i <= 20 ? 7 : 9, mArrI[i]);
983 }
Aart Bikd141f452015-07-16 17:40:44 -0700984 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -0700995 CrossOverLoopJ();
996 for (int i = 0; i < mArrJ.length; i++) {
997 expectEquals(i <= 20 ? 8 : 10, mArrJ[i]);
998 }
Aart Bikd141f452015-07-16 17:40:44 -0700999 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -07001010 CrossOverLoopF();
1011 for (int i = 0; i < mArrF.length; i++) {
1012 expectEquals(i <= 20 ? 9 : 11, mArrF[i]);
1013 }
Aart Bikd141f452015-07-16 17:40:44 -07001014 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -07001025 CrossOverLoopD();
1026 for (int i = 0; i < mArrD.length; i++) {
1027 expectEquals(i <= 20 ? 10 : 12, mArrD[i]);
1028 }
Aart Bikd141f452015-07-16 17:40:44 -07001029 // 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 }
Aart Bik5ef79942015-07-17 10:21:15 -07001040 CrossOverLoopL();
1041 for (int i = 0; i < mArrL.length; i++) {
1042 expectEquals(i <= 20 ? anObject : anotherObject, mArrL[i]);
1043 }
Aart Bikd141f452015-07-16 17:40:44 -07001044 }
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}