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 }