1/* 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @bug 6934604 27 * @summary enable parts of EliminateAutoBox by default 28 * 29 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox 30 * compiler.eliminateAutobox.TestShortBoxing 31 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox 32 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::dummy 33 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::foo 34 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::foob 35 * compiler.eliminateAutobox.TestShortBoxing 36 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-EliminateAutoBox 37 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::dummy 38 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::foo 39 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestShortBoxing::foob 40 * compiler.eliminateAutobox.TestShortBoxing 41 */ 42 43package compiler.eliminateAutobox; 44 45public class TestShortBoxing { 46 47 static final Short ibc = new Short((short)1); 48 49 //=============================================== 50 // Non-inlined methods to test deoptimization info 51 static void dummy() { } 52 static short foo(short i) { return i; } 53 static Short foob(short i) { return Short.valueOf(i); } 54 55 56 static short simple(short i) { 57 Short ib = new Short(i); 58 return ib; 59 } 60 61 static short simpleb(short i) { 62 Short ib = Short.valueOf(i); 63 return ib; 64 } 65 66 static short simplec() { 67 Short ib = ibc; 68 return ib; 69 } 70 71 static short simplef(short i) { 72 Short ib = foob(i); 73 return ib; 74 } 75 76 static short simplep(Short ib) { 77 return ib; 78 } 79 80 static short simple2(short i) { 81 Short ib1 = new Short(i); 82 Short ib2 = new Short((short)(i+1)); 83 return (short)(ib1 + ib2); 84 } 85 86 static short simpleb2(short i) { 87 Short ib1 = Short.valueOf(i); 88 Short ib2 = Short.valueOf((short)(i+1)); 89 return (short)(ib1 + ib2); 90 } 91 92 static short simplem2(short i) { 93 Short ib1 = new Short(i); 94 Short ib2 = Short.valueOf((short)(i+1)); 95 return (short)(ib1 + ib2); 96 } 97 98 static short simplep2(short i, Short ib1) { 99 Short ib2 = Short.valueOf((short)(i+1)); 100 return (short)(ib1 + ib2); 101 } 102 103 static short simplec2(short i) { 104 Short ib1 = ibc; 105 Short ib2 = Short.valueOf((short)(i+1)); 106 return (short)(ib1 + ib2); 107 } 108 109 //=============================================== 110 static short test(short i) { 111 Short ib = new Short(i); 112 if ((i&1) == 0) 113 ib = (short)(i+1); 114 return ib; 115 } 116 117 static short testb(short i) { 118 Short ib = i; 119 if ((i&1) == 0) 120 ib = (short)(i+1); 121 return ib; 122 } 123 124 static short testm(short i) { 125 Short ib = i; 126 if ((i&1) == 0) 127 ib = new Short((short)(i+1)); 128 return ib; 129 } 130 131 static short testp(short i, Short ib) { 132 if ((i&1) == 0) 133 ib = new Short((short)(i+1)); 134 return ib; 135 } 136 137 static short testc(short i) { 138 Short ib = ibc; 139 if ((i&1) == 0) 140 ib = new Short((short)(i+1)); 141 return ib; 142 } 143 144 static short test2(short i) { 145 Short ib1 = new Short(i); 146 Short ib2 = new Short((short)(i+1)); 147 if ((i&1) == 0) { 148 ib1 = new Short((short)(i+1)); 149 ib2 = new Short((short)(i+2)); 150 } 151 return (short)(ib1+ib2); 152 } 153 154 static short testb2(short i) { 155 Short ib1 = i; 156 Short ib2 = (short)(i+1); 157 if ((i&1) == 0) { 158 ib1 = (short)(i+1); 159 ib2 = (short)(i+2); 160 } 161 return (short)(ib1 + ib2); 162 } 163 164 static short testm2(short i) { 165 Short ib1 = new Short(i); 166 Short ib2 = (short)(i+1); 167 if ((i&1) == 0) { 168 ib1 = new Short((short)(i+1)); 169 ib2 = (short)(i+2); 170 } 171 return (short)(ib1 + ib2); 172 } 173 174 static short testp2(short i, Short ib1) { 175 Short ib2 = (short)(i+1); 176 if ((i&1) == 0) { 177 ib1 = new Short((short)(i+1)); 178 ib2 = (short)(i+2); 179 } 180 return (short)(ib1 + ib2); 181 } 182 183 static short testc2(short i) { 184 Short ib1 = ibc; 185 Short ib2 = (short)(i+1); 186 if ((i&1) == 0) { 187 ib1 = (short)(ibc+1); 188 ib2 = (short)(i+2); 189 } 190 return (short)(ib1 + ib2); 191 } 192 193 //=============================================== 194 static short sum(short[] a) { 195 short result = 1; 196 for (Short i : a) 197 result += i; 198 return result; 199 } 200 201 static short sumb(short[] a) { 202 Short result = 1; 203 for (Short i : a) 204 result = (short)(result + i); 205 return result; 206 } 207 208 static short sumc(short[] a) { 209 Short result = ibc; 210 for (Short i : a) 211 result = (short)(result + i); 212 return result; 213 } 214 215 static short sumf(short[] a) { 216 Short result = foob((short)1); 217 for (Short i : a) 218 result = (short)(result + i); 219 return result; 220 } 221 222 static short sump(short[] a, Short result) { 223 for (Short i : a) 224 result = (short)(result + i); 225 return result; 226 } 227 228 static short sum2(short[] a) { 229 short result1 = 1; 230 short result2 = 1; 231 for (Short i : a) { 232 result1 += i; 233 result2 += i + 1; 234 } 235 return (short)(result1 + result2); 236 } 237 238 static short sumb2(short[] a) { 239 Short result1 = 1; 240 Short result2 = 1; 241 for (Short i : a) { 242 result1 = (short)(result1 + i); 243 result2 = (short)(result2 + i + 1); 244 } 245 return (short)(result1 + result2); 246 } 247 248 static short summ2(short[] a) { 249 Short result1 = 1; 250 Short result2 = new Short((short)1); 251 for (Short i : a) { 252 result1 = (short)(result1 + i); 253 result2 = (short)(result2 + new Short((short)(i + 1))); 254 } 255 return (short)(result1 + result2); 256 } 257 258 static short sump2(short[] a, Short result2) { 259 Short result1 = 1; 260 for (Short i : a) { 261 result1 = (short)(result1 + i); 262 result2 = (short)(result2 + i + 1); 263 } 264 return (short)(result1 + result2); 265 } 266 267 static short sumc2(short[] a) { 268 Short result1 = 1; 269 Short result2 = ibc; 270 for (Short i : a) { 271 result1 = (short)(result1 + i); 272 result2 = (short)(result2 + i + ibc); 273 } 274 return (short)(result1 + result2); 275 } 276 277 //=============================================== 278 static short remi_sum() { 279 Short j = new Short((short)1); 280 for (int i = 0; i< 1000; i++) { 281 j = new Short((short)(j + 1)); 282 } 283 return j; 284 } 285 286 static short remi_sumb() { 287 Short j = Short.valueOf((short)1); 288 for (int i = 0; i< 1000; i++) { 289 j = (short)(j + 1); 290 } 291 return j; 292 } 293 294 static short remi_sumf() { 295 Short j = foob((short)1); 296 for (int i = 0; i< 1000; i++) { 297 j = (short)(j + 1); 298 } 299 return j; 300 } 301 302 static short remi_sump(Short j) { 303 for (int i = 0; i< 1000; i++) { 304 j = new Short((short)(j + 1)); 305 } 306 return j; 307 } 308 309 static short remi_sumc() { 310 Short j = ibc; 311 for (int i = 0; i< 1000; i++) { 312 j = (short)(j + ibc); 313 } 314 return j; 315 } 316 317 static short remi_sum2() { 318 Short j1 = new Short((short)1); 319 Short j2 = new Short((short)1); 320 for (int i = 0; i< 1000; i++) { 321 j1 = new Short((short)(j1 + 1)); 322 j2 = new Short((short)(j2 + 2)); 323 } 324 return (short)(j1 + j2); 325 } 326 327 static short remi_sumb2() { 328 Short j1 = Short.valueOf((short)1); 329 Short j2 = Short.valueOf((short)1); 330 for (int i = 0; i< 1000; i++) { 331 j1 = (short)(j1 + 1); 332 j2 = (short)(j2 + 2); 333 } 334 return (short)(j1 + j2); 335 } 336 337 static short remi_summ2() { 338 Short j1 = new Short((short)1); 339 Short j2 = Short.valueOf((short)1); 340 for (int i = 0; i< 1000; i++) { 341 j1 = new Short((short)(j1 + 1)); 342 j2 = (short)(j2 + 2); 343 } 344 return (short)(j1 + j2); 345 } 346 347 static short remi_sump2(Short j1) { 348 Short j2 = Short.valueOf((short)1); 349 for (int i = 0; i< 1000; i++) { 350 j1 = new Short((short)(j1 + 1)); 351 j2 = (short)(j2 + 2); 352 } 353 return (short)(j1 + j2); 354 } 355 356 static short remi_sumc2() { 357 Short j1 = ibc; 358 Short j2 = Short.valueOf((short)1); 359 for (int i = 0; i< 1000; i++) { 360 j1 = (short)(j1 + ibc); 361 j2 = (short)(j2 + 2); 362 } 363 return (short)(j1 + j2); 364 } 365 366 367 //=============================================== 368 // Safepointa and debug info for deoptimization 369 static short simple_deop(short i) { 370 Short ib = new Short(foo(i)); 371 dummy(); 372 return ib; 373 } 374 375 static short simpleb_deop(short i) { 376 Short ib = Short.valueOf(foo(i)); 377 dummy(); 378 return ib; 379 } 380 381 static short simplef_deop(short i) { 382 Short ib = foob(i); 383 dummy(); 384 return ib; 385 } 386 387 static short simplep_deop(Short ib) { 388 dummy(); 389 return ib; 390 } 391 392 static short simplec_deop(short i) { 393 Short ib = ibc; 394 dummy(); 395 return ib; 396 } 397 398 static short test_deop(short i) { 399 Short ib = new Short(foo(i)); 400 if ((i&1) == 0) 401 ib = foo((short)(i+1)); 402 dummy(); 403 return ib; 404 } 405 406 static short testb_deop(short i) { 407 Short ib = foo(i); 408 if ((i&1) == 0) 409 ib = foo((short)(i+1)); 410 dummy(); 411 return ib; 412 } 413 414 static short testf_deop(short i) { 415 Short ib = foob(i); 416 if ((i&1) == 0) 417 ib = foo((short)(i+1)); 418 dummy(); 419 return ib; 420 } 421 422 static short testp_deop(short i, Short ib) { 423 if ((i&1) == 0) 424 ib = foo((short)(i+1)); 425 dummy(); 426 return ib; 427 } 428 429 static short testc_deop(short i) { 430 Short ib = ibc; 431 if ((i&1) == 0) 432 ib = foo((short)(i+1)); 433 dummy(); 434 return ib; 435 } 436 437 static short sum_deop(short[] a) { 438 short result = 1; 439 for (Short i : a) 440 result += foo(i); 441 dummy(); 442 return result; 443 } 444 445 static short sumb_deop(short[] a) { 446 Short result = 1; 447 for (Short i : a) 448 result = (short)(result + foo(i)); 449 dummy(); 450 return result; 451 } 452 453 static short sumf_deop(short[] a) { 454 Short result = 1; 455 for (Short i : a) 456 result = (short)(result + foob(i)); 457 dummy(); 458 return result; 459 } 460 461 static short sump_deop(short[] a, Short result) { 462 for (Short i : a) 463 result = (short)(result + foob(i)); 464 dummy(); 465 return result; 466 } 467 468 static short sumc_deop(short[] a) { 469 Short result = ibc; 470 for (Short i : a) 471 result = (short)(result + foo(i)); 472 dummy(); 473 return result; 474 } 475 476 static short remi_sum_deop() { 477 Short j = new Short(foo((short)1)); 478 for (int i = 0; i< 1000; i++) { 479 j = new Short(foo((short)(j + 1))); 480 } 481 dummy(); 482 return j; 483 } 484 485 static short remi_sumb_deop() { 486 Short j = Short.valueOf(foo((short)1)); 487 for (int i = 0; i< 1000; i++) { 488 j = foo((short)(j + 1)); 489 } 490 dummy(); 491 return j; 492 } 493 494 static short remi_sumf_deop() { 495 Short j = foob((short)1); 496 for (int i = 0; i< 1000; i++) { 497 j = foo((short)(j + 1)); 498 } 499 dummy(); 500 return j; 501 } 502 503 static short remi_sump_deop(Short j) { 504 for (int i = 0; i< 1000; i++) { 505 j = foo((short)(j + 1)); 506 } 507 dummy(); 508 return j; 509 } 510 511 static short remi_sumc_deop() { 512 Short j = ibc; 513 for (int i = 0; i< 1000; i++) { 514 j = foo((short)(j + 1)); 515 } 516 dummy(); 517 return j; 518 } 519 520 //=============================================== 521 // Conditional increment 522 static short remi_sum_cond() { 523 Short j = new Short((short)1); 524 for (int i = 0; i< 1000; i++) { 525 if ((i&1) == 0) { 526 j = new Short((short)(j + 1)); 527 } 528 } 529 return j; 530 } 531 532 static short remi_sumb_cond() { 533 Short j = Short.valueOf((short)1); 534 for (int i = 0; i< 1000; i++) { 535 if ((i&1) == 0) { 536 j = (short)(j + 1); 537 } 538 } 539 return j; 540 } 541 542 static short remi_sumf_cond() { 543 Short j = foob((short)1); 544 for (int i = 0; i< 1000; i++) { 545 if ((i&1) == 0) { 546 j = (short)(j + 1); 547 } 548 } 549 return j; 550 } 551 552 static short remi_sump_cond(Short j) { 553 for (int i = 0; i< 1000; i++) { 554 if ((i&1) == 0) { 555 j = (short)(j + 1); 556 } 557 } 558 return j; 559 } 560 561 static short remi_sumc_cond() { 562 Short j = ibc; 563 for (int i = 0; i< 1000; i++) { 564 if ((i&1) == 0) { 565 j = (short)(j + ibc); 566 } 567 } 568 return j; 569 } 570 571 static short remi_sum2_cond() { 572 Short j1 = new Short((short)1); 573 Short j2 = new Short((short)1); 574 for (int i = 0; i< 1000; i++) { 575 if ((i&1) == 0) { 576 j1 = new Short((short)(j1 + 1)); 577 } else { 578 j2 = new Short((short)(j2 + 2)); 579 } 580 } 581 return (short)(j1 + j2); 582 } 583 584 static short remi_sumb2_cond() { 585 Short j1 = Short.valueOf((short)1); 586 Short j2 = Short.valueOf((short)1); 587 for (int i = 0; i< 1000; i++) { 588 if ((i&1) == 0) { 589 j1 = (short)(j1 + 1); 590 } else { 591 j2 = (short)(j2 + 2); 592 } 593 } 594 return (short)(j1 + j2); 595 } 596 597 static short remi_summ2_cond() { 598 Short j1 = new Short((short)1); 599 Short j2 = Short.valueOf((short)1); 600 for (int i = 0; i< 1000; i++) { 601 if ((i&1) == 0) { 602 j1 = new Short((short)(j1 + 1)); 603 } else { 604 j2 = (short)(j2 + 2); 605 } 606 } 607 return (short)(j1 + j2); 608 } 609 610 static short remi_sump2_cond(Short j1) { 611 Short j2 = Short.valueOf((short)1); 612 for (int i = 0; i< 1000; i++) { 613 if ((i&1) == 0) { 614 j1 = new Short((short)(j1 + 1)); 615 } else { 616 j2 = (short)(j2 + 2); 617 } 618 } 619 return (short)(j1 + j2); 620 } 621 622 static short remi_sumc2_cond() { 623 Short j1 = ibc; 624 Short j2 = Short.valueOf((short)1); 625 for (int i = 0; i< 1000; i++) { 626 if ((i&1) == 0) { 627 j1 = (short)(j1 + ibc); 628 } else { 629 j2 = (short)(j2 + 2); 630 } 631 } 632 return (short)(j1 + j2); 633 } 634 635 636 public static void main(String[] args) { 637 final int ntests = 70; 638 639 String[] test_name = new String[] { 640 "simple", "simpleb", "simplec", "simplef", "simplep", 641 "simple2", "simpleb2", "simplec2", "simplem2", "simplep2", 642 "simple_deop", "simpleb_deop", "simplec_deop", "simplef_deop", "simplep_deop", 643 "test", "testb", "testc", "testm", "testp", 644 "test2", "testb2", "testc2", "testm2", "testp2", 645 "test_deop", "testb_deop", "testc_deop", "testf_deop", "testp_deop", 646 "sum", "sumb", "sumc", "sumf", "sump", 647 "sum2", "sumb2", "sumc2", "summ2", "sump2", 648 "sum_deop", "sumb_deop", "sumc_deop", "sumf_deop", "sump_deop", 649 "remi_sum", "remi_sumb", "remi_sumc", "remi_sumf", "remi_sump", 650 "remi_sum2", "remi_sumb2", "remi_sumc2", "remi_summ2", "remi_sump2", 651 "remi_sum_deop", "remi_sumb_deop", "remi_sumc_deop", "remi_sumf_deop", "remi_sump_deop", 652 "remi_sum_cond", "remi_sumb_cond", "remi_sumc_cond", "remi_sumf_cond", "remi_sump_cond", 653 "remi_sum2_cond", "remi_sumb2_cond", "remi_sumc2_cond", "remi_summ2_cond", "remi_sump2_cond" 654 }; 655 656 final int[] val = new int[] { 657 71994000, 71994000, 12000, 71994000, 71994000, 658 144000000, 144000000, 72018000, 144000000, 144000000, 659 71994000, 71994000, 12000, 71994000, 71994000, 660 72000000, 72000000, 36006000, 72000000, 72000000, 661 144012000, 144012000, 72030000, 144012000, 144012000, 662 72000000, 72000000, 36006000, 72000000, 72000000, 663 -24787, -24787, -24787, -24787, -24787, 664 16962, 16962, 16962, 16962, 16962, 665 -24787, -24787, -24787, -24787, -24787, 666 1001, 1001, 1001, 1001, 1001, 667 3002, 3002, 3002, 3002, 3002, 668 1001, 1001, 1001, 1001, 1001, 669 501, 501, 501, 501, 501, 670 1502, 1502, 1502, 1502, 1502 671 }; 672 673 int[] res = new int[ntests]; 674 for (int i = 0; i < ntests; i++) { 675 res[i] = 0; 676 } 677 678 679 for (int i = 0; i < 12000; i++) { 680 res[0] += simple((short)i); 681 res[1] += simpleb((short)i); 682 res[2] += simplec(); 683 res[3] += simplef((short)i); 684 res[4] += simplep((short)i); 685 686 res[5] += simple2((short)i); 687 res[6] += simpleb2((short)i); 688 res[7] += simplec2((short)i); 689 res[8] += simplem2((short)i); 690 res[9] += simplep2((short)i, (short)i); 691 692 res[10] += simple_deop((short)i); 693 res[11] += simpleb_deop((short)i); 694 res[12] += simplec_deop((short)i); 695 res[13] += simplef_deop((short)i); 696 res[14] += simplep_deop((short)i); 697 698 res[15] += test((short)i); 699 res[16] += testb((short)i); 700 res[17] += testc((short)i); 701 res[18] += testm((short)i); 702 res[19] += testp((short)i, (short)i); 703 704 res[20] += test2((short)i); 705 res[21] += testb2((short)i); 706 res[22] += testc2((short)i); 707 res[23] += testm2((short)i); 708 res[24] += testp2((short)i, (short)i); 709 710 res[25] += test_deop((short)i); 711 res[26] += testb_deop((short)i); 712 res[27] += testc_deop((short)i); 713 res[28] += testf_deop((short)i); 714 res[29] += testp_deop((short)i, (short)i); 715 } 716 717 short[] ia = new short[1000]; 718 for (int i = 0; i < 1000; i++) { 719 ia[i] = (short)i; 720 } 721 722 for (int i = 0; i < 100; i++) { 723 res[30] = sum(ia); 724 res[31] = sumb(ia); 725 res[32] = sumc(ia); 726 res[33] = sumf(ia); 727 res[34] = sump(ia, (short)1); 728 729 res[35] = sum2(ia); 730 res[36] = sumb2(ia); 731 res[37] = sumc2(ia); 732 res[38] = summ2(ia); 733 res[39] = sump2(ia, (short)1); 734 735 res[40] = sum_deop(ia); 736 res[41] = sumb_deop(ia); 737 res[42] = sumc_deop(ia); 738 res[43] = sumf_deop(ia); 739 res[44] = sump_deop(ia, (short)1); 740 741 res[45] = remi_sum(); 742 res[46] = remi_sumb(); 743 res[47] = remi_sumc(); 744 res[48] = remi_sumf(); 745 res[49] = remi_sump((short)1); 746 747 res[50] = remi_sum2(); 748 res[51] = remi_sumb2(); 749 res[52] = remi_sumc2(); 750 res[53] = remi_summ2(); 751 res[54] = remi_sump2((short)1); 752 753 res[55] = remi_sum_deop(); 754 res[56] = remi_sumb_deop(); 755 res[57] = remi_sumc_deop(); 756 res[58] = remi_sumf_deop(); 757 res[59] = remi_sump_deop((short)1); 758 759 res[60] = remi_sum_cond(); 760 res[61] = remi_sumb_cond(); 761 res[62] = remi_sumc_cond(); 762 res[63] = remi_sumf_cond(); 763 res[64] = remi_sump_cond((short)1); 764 765 res[65] = remi_sum2_cond(); 766 res[66] = remi_sumb2_cond(); 767 res[67] = remi_sumc2_cond(); 768 res[68] = remi_summ2_cond(); 769 res[69] = remi_sump2_cond((short)1); 770 } 771 772 int failed = 0; 773 for (int i = 0; i < ntests; i++) { 774 if (res[i] != val[i]) { 775 System.err.println(test_name[i] + ": " + res[i] + " != " + val[i]); 776 failed++; 777 } 778 } 779 if (failed > 0) { 780 System.err.println("Failed " + failed + " tests."); 781 throw new InternalError(); 782 } else { 783 System.out.println("Passed."); 784 } 785 } 786} 787