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