/* * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 6689060 * @summary Escape Analysis does not work with Compressed Oops * * @run main/othervm -Xbatch -XX:+AggressiveOpts * -XX:CompileCommand=exclude,compiler.escapeAnalysis.Test6689060::dummy * compiler.escapeAnalysis.Test6689060 */ package compiler.escapeAnalysis; import java.lang.reflect.Array; public class Test6689060 { static class Point { int x; int y; Point next; int ax[]; int ay[]; Point pax[]; Point pay[]; public Point getNext() { return next; } } void dummy() { // Empty method to verify correctness of DebugInfo. // Use -XX:CompileCommand=exclude,Test.dummy } int ival(int i) { return i * 2; } int test80(int y, int l, int i) { Point p = new Point(); p.ax = new int[2]; p.ay = new int[2]; int x = 3; p.ax[0] = x; p.ay[1] = 3 * x + y; dummy(); return p.ax[0] * p.ay[1]; } int test81(int y, int l, int i) { Point p = new Point(); p.ax = new int[2]; p.ay = new int[2]; int x = 3; p.ax[0] = x; p.ay[1] = 3 * x + y; dummy(); return p.ax[0] * p.ay[1]; } int test44(int y) { Point p1 = new Point(); p1.x = ival(3); dummy(); p1.y = 3 * p1.x + y; return p1.y; } int test43(int y) { Point p1 = new Point(); if ((y & 1) == 1) { p1.x = ival(3); } else { p1.x = ival(5); } dummy(); p1.y = 3 * p1.x + y; return p1.y; } int test42(int y) { Point p1 = new Point(); p1.x = 3; for (int i = 0; i < y; i++) { if ((i & 1) == 1) { p1.x += 4; } } p1.y = 3 * y + p1.x; return p1.y; } int test40(int y) { Point p1 = new Point(); if ((y & 1) == 1) { p1.x = 3; } else { p1.x = 5; } p1.y = 3 * p1.x + y; return p1.y; } int test41(int y) { Point p1 = new Point(); if ((y & 1) == 1) { p1.x += 4; } else { p1.x += 5; } p1.y = 3 * p1.x + y; return p1.y; } Point test00(int y) { int x = 3; Point p = new Point(); p.x = x; p.y = 3 * x + y; return p; } Point test01(int y) { int x = 3; Point p = new Point(); p.x = x; p.y = 3 * x + y; dummy(); return p; } Point test02(int y) { int x = 3; Point p1 = null; for (int i = 0; i < y; i++) { Point p2 = new Point(); p2.x = x; p2.y = 3 * y + x; p2.next = p1; p1 = p2; } return p1; } Point test03(int y) { int x = 3; Point p1 = null; for (int i = 0; i < y; i++) { Point p2 = new Point(); p2.x = x; p2.y = 3 * y + x; p2.next = p1; p1 = p2; } dummy(); return p1; } Point test04(int y) { int x = 3; Point p1 = null; for (int i = 0; i < y; i++) { Point p2 = new Point(); p2.x = x; p2.y = 3 * y + x; p2.next = p1; dummy(); p1 = p2; } return p1; } int test05(int y) { int x = 3; Point p1 = new Point(); for (int i = 0; i < y; i++) { Point p2 = new Point(); p2.x = x; p2.y = 3 * y + x; p1.next = p2; p1 = p2; } return p1.y; } int test0(int y) { int x = 3; Point p = new Point(); p.x = x; p.y = 3 * x + y; dummy(); return p.x * p.y; } int test1(int y) { Point p = new Point(); if ((y & 1) == 1) { p = new Point(); // Kill previous } int x = 3; p.x = x; p.y = 3 * x + y; dummy(); return p.x * p.y; } int test2(int y) { Point p1 = new Point(); Point p2 = new Point(); p1.x = 3; p2.x = 4; p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test3(int y, Point p1) { Point p2 = new Point(); p1.x = 3; p2.x = 4; p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test4(int y) { Point p1 = new Point(); Point p2 = new Point(); if ((y & 1) == 1) { p1.x = 3; p2.x = 4; } else { p1.x = 5; p2.x = 6; } p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test5(int y, Point p1) { Point p2 = new Point(); if ((y & 1) == 1) { p1.x = 3; p2.x = 4; } else { p1.x = 5; p2.x = 6; } p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test6(int y) { Point p1 = new Point(); Point p2 = new Point(); p1.next = p2; if ((y & 1) == 1) { p1.x = 3; p1.getNext().x = 4; } else { p1.x = 5; p1.getNext().x = 6; } p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test7(int y, Point p1) { Point p2 = new Point(); p1.next = p2; if ((y & 1) == 1) { p1.x = 3; p1.getNext().x = 4; } else { p1.x = 5; p1.getNext().x = 6; } p1.y = 3 * p2.x + y; p2.y = 3 * p1.x + y; dummy(); return p1.y * p2.y; } int test8(int y, int l, int i) { Point p = new Point(); p.ax = new int[l]; p.ay = new int[l]; int x = 3; p.ax[i] = x; p.ay[i] = 3 * x + y; dummy(); return p.ax[i] * p.ay[i]; } int test9(int y, int l, int i) { Point p = new Point(); p.pax = new Point[l]; p.pay = new Point[l]; p.pax[i] = new Point(); p.pay[i] = new Point(); p.pax[i].x = 3; p.pay[i].x = 4; p.pax[i].y = 3 * p.pay[i].x + y; p.pay[i].y = 3 * p.pax[i].x + y; dummy(); return p.pax[i].y * p.pay[i].y; } int test10(int y, int l, int i, Class cls) { Point p = new Point(); try { p.pax = (Point[]) Array.newInstance(cls, l); p.pax[i] = (Point) cls.newInstance(); } catch (java.lang.InstantiationException ex) { return 0; } catch (java.lang.IllegalAccessException ex) { return 0; } p.pax[i].x = 3; p.pax[i].y = 3 * p.pax[i].x + y; dummy(); return p.pax[i].x * p.pax[i].y; } int test11(int y) { Point p1 = new Point(); Point p2 = new Point(); p1.next = p2; if ((y & 1) == 1) { p1.x = 3; p1.next.x = 4; } else { p1.x = 5; p1.next.x = 6; } p1.y = 3 * p1.next.x + y; p1.next.y = 3 * p1.x + y; dummy(); return p1.y * p1.next.y; } int test12(int y) { Point p1 = new Point(); p1.next = p1; if ((y & 1) == 1) { p1.x = 3; p1.next.x = 4; } else { p1.x = 5; p1.next.x = 6; } p1.y = 3 * p1.next.x + y; p1.next.y = 3 * p1.x + y; dummy(); return p1.y * p1.next.y; } public static void main(String args[]) { Test6689060 tsr = new Test6689060(); Point p = new Point(); Point ptmp = p; Class cls = Point.class; int y = 0; for (int i = 0; i < 10000; i++) { ptmp.next = tsr.test00(1); ptmp.next = tsr.test01(1); ptmp.next = tsr.test02(1); ptmp.next = tsr.test03(1); ptmp.next = tsr.test04(1); y = tsr.test05(1); y = tsr.test80(y, 1, 0); y = tsr.test81(y, 1, 0); y = tsr.test44(y); y = tsr.test43(y); y = tsr.test42(y); y = tsr.test40(y); y = tsr.test41(y); y = tsr.test0(y); y = tsr.test1(y); y = tsr.test2(y); y = tsr.test3(y, p); y = tsr.test4(y); y = tsr.test5(y, p); y = tsr.test6(y); y = tsr.test7(y, p); y = tsr.test8(y, 1, 0); y = tsr.test9(y, 1, 0); y = tsr.test10(y, 1, 0, cls); y = tsr.test11(y); y = tsr.test12(y); } for (int i = 0; i < 10000; i++) { ptmp.next = tsr.test00(1); ptmp.next = tsr.test01(1); ptmp.next = tsr.test02(1); ptmp.next = tsr.test03(1); ptmp.next = tsr.test04(1); y = tsr.test05(1); y = tsr.test80(y, 1, 0); y = tsr.test81(y, 1, 0); y = tsr.test44(y); y = tsr.test43(y); y = tsr.test42(y); y = tsr.test40(y); y = tsr.test41(y); y = tsr.test0(y); y = tsr.test1(y); y = tsr.test2(y); y = tsr.test3(y, p); y = tsr.test4(y); y = tsr.test5(y, p); y = tsr.test6(y); y = tsr.test7(y, p); y = tsr.test8(y, 1, 0); y = tsr.test9(y, 1, 0); y = tsr.test10(y, 1, 0, cls); y = tsr.test11(y); y = tsr.test12(y); } for (int i = 0; i < 10000; i++) { ptmp.next = tsr.test00(1); ptmp.next = tsr.test01(1); ptmp.next = tsr.test02(1); ptmp.next = tsr.test03(1); ptmp.next = tsr.test04(1); y = tsr.test05(1); y = tsr.test80(y, 1, 0); y = tsr.test81(y, 1, 0); y = tsr.test44(y); y = tsr.test43(y); y = tsr.test42(y); y = tsr.test40(y); y = tsr.test41(y); y = tsr.test0(y); y = tsr.test1(y); y = tsr.test2(y); y = tsr.test3(y, p); y = tsr.test4(y); y = tsr.test5(y, p); y = tsr.test6(y); y = tsr.test7(y, p); y = tsr.test8(y, 1, 0); y = tsr.test9(y, 1, 0); y = tsr.test10(y, 1, 0, cls); y = tsr.test11(y); y = tsr.test12(y); } int z = 0; y = tsr.test80(0, 1, 0); z += y; System.out.println("After 'test80' y=" + y); y = tsr.test81(0, 1, 0); z += y; System.out.println("After 'test81' y=" + y); y = tsr.test44(0); z += y; System.out.println("After 'test44' y=" + y); y = tsr.test43(0); z += y; System.out.println("After 'test43' y=" + y); y = tsr.test42(0); z += y; System.out.println("After 'test42' y=" + y); y = tsr.test40(0); z += y; System.out.println("After 'test40' y=" + y); y = tsr.test41(0); z += y; System.out.println("After 'test41' y=" + y); ptmp.next = tsr.test00(1); z += y; System.out.println("After 'test00' p.y=" + ptmp.next.y); ptmp.next = tsr.test01(1); z += y; System.out.println("After 'test01' p.y=" + ptmp.next.y); ptmp.next = tsr.test02(1); z += y; System.out.println("After 'test02' p.y=" + ptmp.next.y); ptmp.next = tsr.test03(1); z += y; System.out.println("After 'test03' p.y=" + ptmp.next.y); ptmp.next = tsr.test04(1); z += y; System.out.println("After 'test04' p.y=" + ptmp.next.y); y = tsr.test05(1); z += y; System.out.println("After 'test05' y=" + y); y = tsr.test0(0); z += y; System.out.println("After 'test0' y=" + y); y = tsr.test1(0); z += y; System.out.println("After 'test1' y=" + y); y = tsr.test2(0); z += y; System.out.println("After 'test2' y=" + y); y = tsr.test3(0, new Point()); z += y; System.out.println("After 'test3' y=" + y); y = tsr.test4(0); z += y; System.out.println("After 'test4' y=" + y); y = tsr.test5(0, new Point()); z += y; System.out.println("After 'test5' y=" + y); y = tsr.test6(0); z += y; System.out.println("After 'test6' y=" + y); y = tsr.test7(0, new Point()); z += y; System.out.println("After 'test7' y=" + y); y = tsr.test8(0, 1, 0); z += y; System.out.println("After 'test8' y=" + y); y = tsr.test9(0, 1, 0); z += y; System.out.println("After 'test9' y=" + y); y = tsr.test10(0, 1, 0, cls); z += y; System.out.println("After 'test10' y=" + y); y = tsr.test11(0); z += y; System.out.println("After 'test11' y=" + y); y = tsr.test12(0); z += y; System.out.println("After 'test12' y=" + y); System.out.println("Sum of y =" + z); } }