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.TestLongBoxing
31 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox
32 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::dummy
33 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::foo
34 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::foob
35 * compiler.eliminateAutobox.TestLongBoxing
36 * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-EliminateAutoBox
37 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::dummy
38 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::foo
39 * -XX:CompileCommand=exclude,compiler.eliminateAutobox.TestLongBoxing::foob
40 * compiler.eliminateAutobox.TestLongBoxing
41 */
42
43 package compiler.eliminateAutobox;
44
45 public class TestLongBoxing {
46
47 static final Long ibc = new Long(1);
48
49 //===============================================
50 // Non-inlined methods to test deoptimization info
51 static void dummy() { }
52 static long foo(long i) { return i; }
53 static Long foob(long i) { return Long.valueOf(i); }
54
55
56 static long simple(long i) {
57 Long ib = new Long(i);
58 return ib;
59 }
60
61 static long simpleb(long i) {
62 Long ib = Long.valueOf(i);
63 return ib;
64 }
65
66 static long simplec() {
67 Long ib = ibc;
68 return ib;
69 }
70
71 static long simplef(long i) {
72 Long ib = foob(i);
73 return ib;
74 }
75
76 static long simplep(Long ib) {
77 return ib;
78 }
79
80 static long simple2(long i) {
81 Long ib1 = new Long(i);
82 Long ib2 = new Long(i+1);
83 return ib1 + ib2;
84 }
85
86 static long simpleb2(long i) {
87 Long ib1 = Long.valueOf(i);
88 Long ib2 = Long.valueOf(i+1);
89 return ib1 + ib2;
90 }
91
92 static long simplem2(long i) {
93 Long ib1 = new Long(i);
94 Long ib2 = Long.valueOf(i+1);
95 return ib1 + ib2;
96 }
97
98 static long simplep2(long i, Long ib1) {
99 Long ib2 = Long.valueOf(i+1);
100 return ib1 + ib2;
101 }
102
103 static long simplec2(long i) {
104 Long ib1 = ibc;
105 Long ib2 = Long.valueOf(i+1);
106 return ib1 + ib2;
107 }
108
109 //===============================================
110 static long test(long i) {
111 Long ib = new Long(i);
112 if ((i&1) == 0)
113 ib = i+1;
114 return ib;
115 }
116
117 static long testb(long i) {
118 Long ib = i;
119 if ((i&1) == 0)
120 ib = (i+1);
121 return ib;
122 }
123
124 static long testm(long i) {
125 Long ib = i;
126 if ((i&1) == 0)
127 ib = new Long(i+1);
128 return ib;
129 }
130
131 static long testp(long i, Long ib) {
132 if ((i&1) == 0)
133 ib = new Long(i+1);
134 return ib;
135 }
136
137 static long testc(long i) {
138 Long ib = ibc;
139 if ((i&1) == 0)
140 ib = new Long(i+1);
141 return ib;
142 }
143
144 static long test2(long i) {
145 Long ib1 = new Long(i);
146 Long ib2 = new Long(i+1);
147 if ((i&1) == 0) {
148 ib1 = new Long(i+1);
149 ib2 = new Long(i+2);
150 }
151 return ib1+ib2;
152 }
153
154 static long testb2(long i) {
155 Long ib1 = i;
156 Long ib2 = i+1;
157 if ((i&1) == 0) {
158 ib1 = (i+1);
159 ib2 = (i+2);
160 }
161 return ib1+ib2;
162 }
163
164 static long testm2(long i) {
165 Long ib1 = new Long(i);
166 Long ib2 = i+1;
167 if ((i&1) == 0) {
168 ib1 = new Long(i+1);
169 ib2 = (i+2);
170 }
171 return ib1+ib2;
172 }
173
174 static long testp2(long i, Long ib1) {
175 Long ib2 = i+1;
176 if ((i&1) == 0) {
177 ib1 = new Long(i+1);
178 ib2 = (i+2);
179 }
180 return ib1+ib2;
181 }
182
183 static long testc2(long i) {
184 Long ib1 = ibc;
185 Long ib2 = i+1;
186 if ((i&1) == 0) {
187 ib1 = (ibc+1);
188 ib2 = (i+2);
189 }
190 return ib1+ib2;
191 }
192
193 //===============================================
194 static long sum(long[] a) {
195 long result = 1;
196 for (Long i : a)
197 result += i;
198 return result;
199 }
200
201 static long sumb(long[] a) {
202 Long result = 1l;
203 for (Long i : a)
204 result += i;
205 return result;
206 }
207
208 static long sumc(long[] a) {
209 Long result = ibc;
210 for (Long i : a)
211 result += i;
212 return result;
213 }
214
215 static long sumf(long[] a) {
216 Long result = foob(1);
217 for (Long i : a)
218 result += i;
219 return result;
220 }
221
222 static long sump(long[] a, Long result) {
223 for (Long i : a)
224 result += i;
225 return result;
226 }
227
228 static long sum2(long[] a) {
229 long result1 = 1;
230 long result2 = 1;
231 for (Long i : a) {
232 result1 += i;
233 result2 += i + 1;
234 }
235 return result1 + result2;
236 }
237
238 static long sumb2(long[] a) {
239 Long result1 = 1l;
240 Long result2 = 1l;
241 for (Long i : a) {
242 result1 += i;
243 result2 += i + 1;
244 }
245 return result1 + result2;
246 }
247
248 static long summ2(long[] a) {
249 Long result1 = 1l;
250 Long result2 = new Long(1);
251 for (Long i : a) {
252 result1 += i;
253 result2 += new Long(i + 1);
254 }
255 return result1 + result2;
256 }
257
258 static long sump2(long[] a, Long result2) {
259 Long result1 = 1l;
260 for (Long i : a) {
261 result1 += i;
262 result2 += i + 1;
263 }
264 return result1 + result2;
265 }
266
267 static long sumc2(long[] a) {
268 Long result1 = 1l;
269 Long result2 = ibc;
270 for (Long i : a) {
271 result1 += i;
272 result2 += i + ibc;
273 }
274 return result1 + result2;
275 }
276
277 //===============================================
278 static long remi_sum() {
279 Long j = new Long(1);
280 for (int i = 0; i< 1000; i++) {
281 j = new Long(j + 1);
282 }
283 return j;
284 }
285
286 static long remi_sumb() {
287 Long j = Long.valueOf(1);
288 for (int i = 0; i< 1000; i++) {
289 j = j + 1;
290 }
291 return j;
292 }
293
294 static long remi_sumf() {
295 Long j = foob(1);
296 for (int i = 0; i< 1000; i++) {
297 j = j + 1;
298 }
299 return j;
300 }
301
302 static long remi_sump(Long j) {
303 for (int i = 0; i< 1000; i++) {
304 j = new Long(j + 1);
305 }
306 return j;
307 }
308
309 static long remi_sumc() {
310 Long j = ibc;
311 for (int i = 0; i< 1000; i++) {
312 j = j + ibc;
313 }
314 return j;
315 }
316
317 static long remi_sum2() {
318 Long j1 = new Long(1);
319 Long j2 = new Long(1);
320 for (int i = 0; i< 1000; i++) {
321 j1 = new Long(j1 + 1);
322 j2 = new Long(j2 + 2);
323 }
324 return j1 + j2;
325 }
326
327 static long remi_sumb2() {
328 Long j1 = Long.valueOf(1);
329 Long j2 = Long.valueOf(1);
330 for (int i = 0; i< 1000; i++) {
331 j1 = j1 + 1;
332 j2 = j2 + 2;
333 }
334 return j1 + j2;
335 }
336
337 static long remi_summ2() {
338 Long j1 = new Long(1);
339 Long j2 = Long.valueOf(1);
340 for (int i = 0; i< 1000; i++) {
341 j1 = new Long(j1 + 1);
342 j2 = j2 + 2;
343 }
344 return j1 + j2;
345 }
346
347 static long remi_sump2(Long j1) {
348 Long j2 = Long.valueOf(1);
349 for (int i = 0; i< 1000; i++) {
350 j1 = new Long(j1 + 1);
351 j2 = j2 + 2;
352 }
353 return j1 + j2;
354 }
355
356 static long remi_sumc2() {
357 Long j1 = ibc;
358 Long j2 = Long.valueOf(1);
359 for (int i = 0; i< 1000; i++) {
360 j1 = j1 + ibc;
361 j2 = j2 + 2;
362 }
363 return j1 + j2;
364 }
365
366
367 //===============================================
368 // Safepointa and debug info for deoptimization
369 static long simple_deop(long i) {
370 Long ib = new Long(foo(i));
371 dummy();
372 return ib;
373 }
374
375 static long simpleb_deop(long i) {
376 Long ib = Long.valueOf(foo(i));
377 dummy();
378 return ib;
379 }
380
381 static long simplef_deop(long i) {
382 Long ib = foob(i);
383 dummy();
384 return ib;
385 }
386
387 static long simplep_deop(Long ib) {
388 dummy();
389 return ib;
390 }
391
392 static long simplec_deop(long i) {
393 Long ib = ibc;
394 dummy();
395 return ib;
396 }
397
398 static long test_deop(long i) {
399 Long ib = new Long(foo(i));
400 if ((i&1) == 0)
401 ib = foo(i+1);
402 dummy();
403 return ib;
404 }
405
406 static long testb_deop(long i) {
407 Long ib = foo(i);
408 if ((i&1) == 0)
409 ib = foo(i+1);
410 dummy();
411 return ib;
412 }
413
414 static long testf_deop(long i) {
415 Long ib = foob(i);
416 if ((i&1) == 0)
417 ib = foo(i+1);
418 dummy();
419 return ib;
420 }
421
422 static long testp_deop(long i, Long ib) {
423 if ((i&1) == 0)
424 ib = foo(i+1);
425 dummy();
426 return ib;
427 }
428
429 static long testc_deop(long i) {
430 Long ib = ibc;
431 if ((i&1) == 0)
432 ib = foo(i+1);
433 dummy();
434 return ib;
435 }
436
437 static long sum_deop(long[] a) {
438 long result = 1;
439 for (Long i : a)
440 result += foo(i);
441 dummy();
442 return result;
443 }
444
445 static long sumb_deop(long[] a) {
446 Long result = 1l;
447 for (Long i : a)
448 result += foo(i);
449 dummy();
450 return result;
451 }
452
453 static long sumf_deop(long[] a) {
454 Long result = 1l;
455 for (Long i : a)
456 result += foob(i);
457 dummy();
458 return result;
459 }
460
461 static long sump_deop(long[] a, Long result) {
462 for (Long i : a)
463 result += foob(i);
464 dummy();
465 return result;
466 }
467
468 static long sumc_deop(long[] a) {
469 Long result = ibc;
470 for (Long i : a)
471 result += foo(i);
472 dummy();
473 return result;
474 }
475
476 static long remi_sum_deop() {
477 Long j = new Long(foo(1));
478 for (int i = 0; i< 1000; i++) {
479 j = new Long(foo(j + 1));
480 }
481 dummy();
482 return j;
483 }
484
485 static long remi_sumb_deop() {
486 Long j = Long.valueOf(foo(1));
487 for (int i = 0; i< 1000; i++) {
488 j = foo(j + 1);
489 }
490 dummy();
491 return j;
492 }
493
494 static long remi_sumf_deop() {
495 Long j = foob(1);
496 for (int i = 0; i< 1000; i++) {
497 j = foo(j + 1);
498 }
499 dummy();
500 return j;
501 }
502
503 static long remi_sump_deop(Long j) {
504 for (int i = 0; i< 1000; i++) {
505 j = foo(j + 1);
506 }
507 dummy();
508 return j;
509 }
510
511 static long remi_sumc_deop() {
512 Long j = ibc;
513 for (int i = 0; i< 1000; i++) {
514 j = foo(j + 1);
515 }
516 dummy();
517 return j;
518 }
519
520 //===============================================
521 // Conditional increment
522 static long remi_sum_cond() {
523 Long j = new Long(1);
524 for (int i = 0; i< 1000; i++) {
525 if ((i&1) == 0) {
526 j = new Long(j + 1);
527 }
528 }
529 return j;
530 }
531
532 static long remi_sumb_cond() {
533 Long j = Long.valueOf(1);
534 for (int i = 0; i< 1000; i++) {
535 if ((i&1) == 0) {
536 j = j + 1;
537 }
538 }
539 return j;
540 }
541
542 static long remi_sumf_cond() {
543 Long j = foob(1);
544 for (int i = 0; i< 1000; i++) {
545 if ((i&1) == 0) {
546 j = j + 1;
547 }
548 }
549 return j;
550 }
551
552 static long remi_sump_cond(Long j) {
553 for (int i = 0; i< 1000; i++) {
554 if ((i&1) == 0) {
555 j = j + 1;
556 }
557 }
558 return j;
559 }
560
561 static long remi_sumc_cond() {
562 Long j = ibc;
563 for (int i = 0; i< 1000; i++) {
564 if ((i&1) == 0) {
565 j = j + ibc;
566 }
567 }
568 return j;
569 }
570
571 static long remi_sum2_cond() {
572 Long j1 = new Long(1);
573 Long j2 = new Long(1);
574 for (int i = 0; i< 1000; i++) {
575 if ((i&1) == 0) {
576 j1 = new Long(j1 + 1);
577 } else {
578 j2 = new Long(j2 + 2);
579 }
580 }
581 return j1 + j2;
582 }
583
584 static long remi_sumb2_cond() {
585 Long j1 = Long.valueOf(1);
586 Long j2 = Long.valueOf(1);
587 for (int i = 0; i< 1000; i++) {
588 if ((i&1) == 0) {
589 j1 = j1 + 1;
590 } else {
591 j2 = j2 + 2;
592 }
593 }
594 return j1 + j2;
595 }
596
597 static long remi_summ2_cond() {
598 Long j1 = new Long(1);
599 Long j2 = Long.valueOf(1);
600 for (int i = 0; i< 1000; i++) {
601 if ((i&1) == 0) {
602 j1 = new Long(j1 + 1);
603 } else {
604 j2 = j2 + 2;
605 }
606 }
607 return j1 + j2;
608 }
609
610 static long remi_sump2_cond(Long j1) {
611 Long j2 = Long.valueOf(1);
612 for (int i = 0; i< 1000; i++) {
613 if ((i&1) == 0) {
614 j1 = new Long(j1 + 1);
615 } else {
616 j2 = j2 + 2;
617 }
618 }
619 return j1 + j2;
620 }
621
622 static long remi_sumc2_cond() {
623 Long j1 = ibc;
624 Long j2 = Long.valueOf(1);
625 for (int i = 0; i< 1000; i++) {
626 if ((i&1) == 0) {
627 j1 = j1 + ibc;
628 } else {
629 j2 = j2 + 2;
630 }
631 }
632 return 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 long[] val = new long[] {
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 499501, 499501, 499501, 499501, 499501,
664 1000002, 1000002, 1000002, 1000002, 1000002,
665 499501, 499501, 499501, 499501, 499501,
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 long[] res = new long[ntests];
674 for (int i = 0; i < ntests; i++) {
675 res[i] = 0;
676 }
677
678
679 for (long i = 0; i < 12000; i++) {
680 res[0] += simple(i);
681 res[1] += simpleb(i);
682 res[2] += simplec();
683 res[3] += simplef(i);
684 res[4] += simplep(i);
685
686 res[5] += simple2(i);
687 res[6] += simpleb2(i);
688 res[7] += simplec2(i);
689 res[8] += simplem2(i);
690 res[9] += simplep2(i, i);
691
692 res[10] += simple_deop(i);
693 res[11] += simpleb_deop(i);
694 res[12] += simplec_deop(i);
695 res[13] += simplef_deop(i);
696 res[14] += simplep_deop(i);
697
698 res[15] += test(i);
699 res[16] += testb(i);
700 res[17] += testc(i);
701 res[18] += testm(i);
702 res[19] += testp(i, i);
703
704 res[20] += test2(i);
705 res[21] += testb2(i);
706 res[22] += testc2(i);
707 res[23] += testm2(i);
708 res[24] += testp2(i, i);
709
710 res[25] += test_deop(i);
711 res[26] += testb_deop(i);
712 res[27] += testc_deop(i);
713 res[28] += testf_deop(i);
714 res[29] += testp_deop(i, i);
715 }
716
717 long[] ia = new long[1000];
718 for (int i = 0; i < 1000; i++) {
719 ia[i] = 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, (long)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, (long)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, (long)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((long)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((long)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((long)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((long)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((long)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 }