1 /*
2  * Copyright (c) 2008, 2018, 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 6689060
27  * @summary Escape Analysis does not work with Compressed Oops
28  *
29  * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:+EliminateAutoBox -XX:AutoBoxCacheMax=20000
30  *                   -XX:CompileCommand=exclude,compiler.escapeAnalysis.Test6689060::dummy
31  *                   compiler.escapeAnalysis.Test6689060
32  */
33 
34 package compiler.escapeAnalysis;
35 
36 import java.lang.reflect.Array;
37 
38 public class Test6689060 {
39     static class Point {
40         int x;
41         int y;
42         Point next;
43         int ax[];
44         int ay[];
45         Point pax[];
46         Point pay[];
47 
getNext()48         public Point getNext() {
49             return next;
50         }
51     }
52 
dummy()53     void dummy() {
54         // Empty method to verify correctness of DebugInfo.
55         // Use -XX:CompileCommand=exclude,Test.dummy
56     }
57 
ival(int i)58     int ival(int i) {
59         return i * 2;
60     }
61 
test80(int y, int l, int i)62     int test80(int y, int l, int i) {
63         Point p = new Point();
64         p.ax = new int[2];
65         p.ay = new int[2];
66         int x = 3;
67         p.ax[0] = x;
68         p.ay[1] = 3 * x + y;
69         dummy();
70         return p.ax[0] * p.ay[1];
71     }
72 
test81(int y, int l, int i)73     int test81(int y, int l, int i) {
74         Point p = new Point();
75         p.ax = new int[2];
76         p.ay = new int[2];
77         int x = 3;
78         p.ax[0] = x;
79         p.ay[1] = 3 * x + y;
80         dummy();
81         return p.ax[0] * p.ay[1];
82     }
83 
84 
test44(int y)85     int test44(int y) {
86         Point p1 = new Point();
87         p1.x = ival(3);
88         dummy();
89         p1.y = 3 * p1.x + y;
90         return p1.y;
91     }
92 
test43(int y)93     int test43(int y) {
94         Point p1 = new Point();
95         if ((y & 1) == 1) {
96             p1.x = ival(3);
97         } else {
98             p1.x = ival(5);
99         }
100         dummy();
101         p1.y = 3 * p1.x + y;
102         return p1.y;
103     }
104 
test42(int y)105     int test42(int y) {
106         Point p1 = new Point();
107         p1.x = 3;
108         for (int i = 0; i < y; i++) {
109             if ((i & 1) == 1) {
110                 p1.x += 4;
111             }
112         }
113         p1.y = 3 * y + p1.x;
114         return p1.y;
115     }
116 
test40(int y)117     int test40(int y) {
118         Point p1 = new Point();
119         if ((y & 1) == 1) {
120             p1.x = 3;
121         } else {
122             p1.x = 5;
123         }
124         p1.y = 3 * p1.x + y;
125         return p1.y;
126     }
127 
test41(int y)128     int test41(int y) {
129         Point p1 = new Point();
130         if ((y & 1) == 1) {
131             p1.x += 4;
132         } else {
133             p1.x += 5;
134         }
135         p1.y = 3 * p1.x + y;
136         return p1.y;
137     }
138 
test00(int y)139     Point test00(int y) {
140         int x = 3;
141         Point p = new Point();
142         p.x = x;
143         p.y = 3 * x + y;
144         return p;
145     }
146 
test01(int y)147     Point test01(int y) {
148         int x = 3;
149         Point p = new Point();
150         p.x = x;
151         p.y = 3 * x + y;
152         dummy();
153         return p;
154     }
155 
test02(int y)156     Point test02(int y) {
157         int x = 3;
158         Point p1 = null;
159         for (int i = 0; i < y; i++) {
160             Point p2 = new Point();
161             p2.x = x;
162             p2.y = 3 * y + x;
163             p2.next = p1;
164             p1 = p2;
165         }
166         return p1;
167     }
168 
test03(int y)169     Point test03(int y) {
170         int x = 3;
171         Point p1 = null;
172         for (int i = 0; i < y; i++) {
173             Point p2 = new Point();
174             p2.x = x;
175             p2.y = 3 * y + x;
176             p2.next = p1;
177             p1 = p2;
178         }
179         dummy();
180         return p1;
181     }
182 
test04(int y)183     Point test04(int y) {
184         int x = 3;
185         Point p1 = null;
186         for (int i = 0; i < y; i++) {
187             Point p2 = new Point();
188             p2.x = x;
189             p2.y = 3 * y + x;
190             p2.next = p1;
191             dummy();
192             p1 = p2;
193         }
194         return p1;
195     }
196 
test05(int y)197     int test05(int y) {
198         int x = 3;
199         Point p1 = new Point();
200         for (int i = 0; i < y; i++) {
201             Point p2 = new Point();
202             p2.x = x;
203             p2.y = 3 * y + x;
204             p1.next = p2;
205             p1 = p2;
206         }
207         return p1.y;
208     }
209 
test0(int y)210     int test0(int y) {
211         int x = 3;
212         Point p = new Point();
213         p.x = x;
214         p.y = 3 * x + y;
215         dummy();
216         return p.x * p.y;
217     }
218 
test1(int y)219     int test1(int y) {
220         Point p = new Point();
221         if ((y & 1) == 1) {
222             p = new Point(); // Kill previous
223         }
224         int x = 3;
225         p.x = x;
226         p.y = 3 * x + y;
227         dummy();
228         return p.x * p.y;
229     }
230 
test2(int y)231     int test2(int y) {
232         Point p1 = new Point();
233         Point p2 = new Point();
234         p1.x = 3;
235         p2.x = 4;
236         p1.y = 3 * p2.x + y;
237         p2.y = 3 * p1.x + y;
238         dummy();
239         return p1.y * p2.y;
240     }
241 
test3(int y, Point p1)242     int test3(int y, Point p1) {
243         Point p2 = new Point();
244         p1.x = 3;
245         p2.x = 4;
246         p1.y = 3 * p2.x + y;
247         p2.y = 3 * p1.x + y;
248         dummy();
249         return p1.y * p2.y;
250     }
251 
test4(int y)252     int test4(int y) {
253         Point p1 = new Point();
254         Point p2 = new Point();
255         if ((y & 1) == 1) {
256             p1.x = 3;
257             p2.x = 4;
258         } else {
259             p1.x = 5;
260             p2.x = 6;
261         }
262         p1.y = 3 * p2.x + y;
263         p2.y = 3 * p1.x + y;
264         dummy();
265         return p1.y * p2.y;
266     }
267 
test5(int y, Point p1)268     int test5(int y, Point p1) {
269         Point p2 = new Point();
270         if ((y & 1) == 1) {
271             p1.x = 3;
272             p2.x = 4;
273         } else {
274             p1.x = 5;
275             p2.x = 6;
276         }
277         p1.y = 3 * p2.x + y;
278         p2.y = 3 * p1.x + y;
279         dummy();
280         return p1.y * p2.y;
281     }
282 
test6(int y)283     int test6(int y) {
284         Point p1 = new Point();
285         Point p2 = new Point();
286         p1.next = p2;
287         if ((y & 1) == 1) {
288             p1.x = 3;
289             p1.getNext().x = 4;
290         } else {
291             p1.x = 5;
292             p1.getNext().x = 6;
293         }
294         p1.y = 3 * p2.x + y;
295         p2.y = 3 * p1.x + y;
296         dummy();
297         return p1.y * p2.y;
298     }
299 
test7(int y, Point p1)300     int test7(int y, Point p1) {
301         Point p2 = new Point();
302         p1.next = p2;
303         if ((y & 1) == 1) {
304             p1.x = 3;
305             p1.getNext().x = 4;
306         } else {
307             p1.x = 5;
308             p1.getNext().x = 6;
309         }
310         p1.y = 3 * p2.x + y;
311         p2.y = 3 * p1.x + y;
312         dummy();
313         return p1.y * p2.y;
314     }
315 
test8(int y, int l, int i)316     int test8(int y, int l, int i) {
317         Point p = new Point();
318         p.ax = new int[l];
319         p.ay = new int[l];
320         int x = 3;
321         p.ax[i] = x;
322         p.ay[i] = 3 * x + y;
323         dummy();
324         return p.ax[i] * p.ay[i];
325     }
326 
test9(int y, int l, int i)327     int test9(int y, int l, int i) {
328         Point p = new Point();
329         p.pax = new Point[l];
330         p.pay = new Point[l];
331         p.pax[i] = new Point();
332         p.pay[i] = new Point();
333         p.pax[i].x = 3;
334         p.pay[i].x = 4;
335         p.pax[i].y = 3 * p.pay[i].x + y;
336         p.pay[i].y = 3 * p.pax[i].x + y;
337         dummy();
338         return p.pax[i].y * p.pay[i].y;
339     }
340 
test10(int y, int l, int i, Class cls)341     int test10(int y, int l, int i, Class cls) {
342         Point p = new Point();
343         try {
344             p.pax = (Point[]) Array.newInstance(cls, l);
345             p.pax[i] = (Point) cls.newInstance();
346         } catch (java.lang.InstantiationException ex) {
347             return 0;
348         } catch (java.lang.IllegalAccessException ex) {
349             return 0;
350         }
351         p.pax[i].x = 3;
352         p.pax[i].y = 3 * p.pax[i].x + y;
353         dummy();
354         return p.pax[i].x * p.pax[i].y;
355     }
356 
test11(int y)357     int test11(int y) {
358         Point p1 = new Point();
359         Point p2 = new Point();
360         p1.next = p2;
361         if ((y & 1) == 1) {
362             p1.x = 3;
363             p1.next.x = 4;
364         } else {
365             p1.x = 5;
366             p1.next.x = 6;
367         }
368         p1.y = 3 * p1.next.x + y;
369         p1.next.y = 3 * p1.x + y;
370         dummy();
371         return p1.y * p1.next.y;
372     }
373 
test12(int y)374     int test12(int y) {
375         Point p1 = new Point();
376         p1.next = p1;
377         if ((y & 1) == 1) {
378             p1.x = 3;
379             p1.next.x = 4;
380         } else {
381             p1.x = 5;
382             p1.next.x = 6;
383         }
384         p1.y = 3 * p1.next.x + y;
385         p1.next.y = 3 * p1.x + y;
386         dummy();
387         return p1.y * p1.next.y;
388     }
389 
390 
main(String args[])391     public static void main(String args[]) {
392         Test6689060 tsr = new Test6689060();
393         Point p = new Point();
394         Point ptmp = p;
395         Class cls = Point.class;
396         int y = 0;
397         for (int i = 0; i < 10000; i++) {
398             ptmp.next = tsr.test00(1);
399             ptmp.next = tsr.test01(1);
400             ptmp.next = tsr.test02(1);
401             ptmp.next = tsr.test03(1);
402             ptmp.next = tsr.test04(1);
403 
404             y = tsr.test05(1);
405 
406             y = tsr.test80(y, 1, 0);
407             y = tsr.test81(y, 1, 0);
408 
409             y = tsr.test44(y);
410             y = tsr.test43(y);
411             y = tsr.test42(y);
412             y = tsr.test40(y);
413             y = tsr.test41(y);
414 
415             y = tsr.test0(y);
416             y = tsr.test1(y);
417             y = tsr.test2(y);
418             y = tsr.test3(y, p);
419             y = tsr.test4(y);
420             y = tsr.test5(y, p);
421             y = tsr.test6(y);
422             y = tsr.test7(y, p);
423             y = tsr.test8(y, 1, 0);
424             y = tsr.test9(y, 1, 0);
425             y = tsr.test10(y, 1, 0, cls);
426             y = tsr.test11(y);
427             y = tsr.test12(y);
428         }
429         for (int i = 0; i < 10000; i++) {
430             ptmp.next = tsr.test00(1);
431             ptmp.next = tsr.test01(1);
432             ptmp.next = tsr.test02(1);
433             ptmp.next = tsr.test03(1);
434             ptmp.next = tsr.test04(1);
435 
436             y = tsr.test05(1);
437 
438             y = tsr.test80(y, 1, 0);
439             y = tsr.test81(y, 1, 0);
440 
441             y = tsr.test44(y);
442             y = tsr.test43(y);
443             y = tsr.test42(y);
444             y = tsr.test40(y);
445             y = tsr.test41(y);
446 
447             y = tsr.test0(y);
448             y = tsr.test1(y);
449             y = tsr.test2(y);
450             y = tsr.test3(y, p);
451             y = tsr.test4(y);
452             y = tsr.test5(y, p);
453             y = tsr.test6(y);
454             y = tsr.test7(y, p);
455             y = tsr.test8(y, 1, 0);
456             y = tsr.test9(y, 1, 0);
457             y = tsr.test10(y, 1, 0, cls);
458             y = tsr.test11(y);
459             y = tsr.test12(y);
460         }
461         for (int i = 0; i < 10000; i++) {
462             ptmp.next = tsr.test00(1);
463             ptmp.next = tsr.test01(1);
464             ptmp.next = tsr.test02(1);
465             ptmp.next = tsr.test03(1);
466             ptmp.next = tsr.test04(1);
467 
468             y = tsr.test05(1);
469 
470             y = tsr.test80(y, 1, 0);
471             y = tsr.test81(y, 1, 0);
472 
473             y = tsr.test44(y);
474             y = tsr.test43(y);
475             y = tsr.test42(y);
476             y = tsr.test40(y);
477             y = tsr.test41(y);
478 
479             y = tsr.test0(y);
480             y = tsr.test1(y);
481             y = tsr.test2(y);
482             y = tsr.test3(y, p);
483             y = tsr.test4(y);
484             y = tsr.test5(y, p);
485             y = tsr.test6(y);
486             y = tsr.test7(y, p);
487             y = tsr.test8(y, 1, 0);
488             y = tsr.test9(y, 1, 0);
489             y = tsr.test10(y, 1, 0, cls);
490             y = tsr.test11(y);
491             y = tsr.test12(y);
492         }
493 
494         int z = 0;
495         y = tsr.test80(0, 1, 0);
496         z += y;
497         System.out.println("After 'test80' y=" + y);
498         y = tsr.test81(0, 1, 0);
499         z += y;
500         System.out.println("After 'test81' y=" + y);
501 
502         y = tsr.test44(0);
503         z += y;
504         System.out.println("After 'test44' y=" + y);
505         y = tsr.test43(0);
506         z += y;
507         System.out.println("After 'test43' y=" + y);
508         y = tsr.test42(0);
509         z += y;
510         System.out.println("After 'test42' y=" + y);
511         y = tsr.test40(0);
512         z += y;
513         System.out.println("After 'test40' y=" + y);
514         y = tsr.test41(0);
515         z += y;
516         System.out.println("After 'test41' y=" + y);
517 
518         ptmp.next = tsr.test00(1);
519         z += y;
520         System.out.println("After 'test00' p.y=" + ptmp.next.y);
521         ptmp.next = tsr.test01(1);
522         z += y;
523         System.out.println("After 'test01' p.y=" + ptmp.next.y);
524         ptmp.next = tsr.test02(1);
525         z += y;
526         System.out.println("After 'test02' p.y=" + ptmp.next.y);
527         ptmp.next = tsr.test03(1);
528         z += y;
529         System.out.println("After 'test03' p.y=" + ptmp.next.y);
530         ptmp.next = tsr.test04(1);
531         z += y;
532         System.out.println("After 'test04' p.y=" + ptmp.next.y);
533 
534         y = tsr.test05(1);
535         z += y;
536         System.out.println("After 'test05' y=" + y);
537 
538         y = tsr.test0(0);
539         z += y;
540         System.out.println("After 'test0' y=" + y);
541         y = tsr.test1(0);
542         z += y;
543         System.out.println("After 'test1' y=" + y);
544         y = tsr.test2(0);
545         z += y;
546         System.out.println("After 'test2' y=" + y);
547         y = tsr.test3(0, new Point());
548         z += y;
549         System.out.println("After 'test3' y=" + y);
550         y = tsr.test4(0);
551         z += y;
552         System.out.println("After 'test4' y=" + y);
553         y = tsr.test5(0, new Point());
554         z += y;
555         System.out.println("After 'test5' y=" + y);
556         y = tsr.test6(0);
557         z += y;
558         System.out.println("After 'test6' y=" + y);
559         y = tsr.test7(0, new Point());
560         z += y;
561         System.out.println("After 'test7' y=" + y);
562         y = tsr.test8(0, 1, 0);
563         z += y;
564         System.out.println("After 'test8' y=" + y);
565         y = tsr.test9(0, 1, 0);
566         z += y;
567         System.out.println("After 'test9' y=" + y);
568         y = tsr.test10(0, 1, 0, cls);
569         z += y;
570         System.out.println("After 'test10' y=" + y);
571         y = tsr.test11(0);
572         z += y;
573         System.out.println("After 'test11' y=" + y);
574         y = tsr.test12(0);
575         z += y;
576         System.out.println("After 'test12' y=" + y);
577         System.out.println("Sum of y =" + z);
578     }
579 }
580