DeoptimizationTest.java revision 12408:777aaa19c4b1
1/*
2 * Copyright (c) 2016, 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 * @library /test/lib /testlibrary /
27 * @requires vm.bits == "64" & os.arch == "amd64" & os.family == "linux"
28 * @modules java.base/jdk.internal.misc
29 * @build compiler.aot.DeoptimizationTest
30 *        compiler.aot.AotCompiler
31 * @run main ClassFileInstaller sun.hotspot.WhiteBox
32 *     sun.hotspot.WhiteBox$WhiteBoxPermission
33 * @run main compiler.aot.AotCompiler -libname libDeoptimizationTest.so
34 *     -class compiler.aot.DeoptimizationTest
35 *     -compile compiler.aot.DeoptimizationTest.testMethod()D
36 * @run main/othervm -Xmixed -XX:+UseAOT -XX:+TieredCompilation
37 *     -XX:CompileCommand=dontinline,compiler.aot.DeoptimizationTest::*
38 *     -XX:AOTLibrary=./libDeoptimizationTest.so -Xbootclasspath/a:.
39 *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
40 *     compiler.aot.DeoptimizationTest
41 * @summary check if aot code can be deoptimized
42 */
43
44package compiler.aot;
45
46import java.lang.reflect.Method;
47import jdk.test.lib.Asserts;
48import jdk.test.lib.Utils;
49import sun.hotspot.WhiteBox;
50import compiler.whitebox.CompilerWhiteBoxTest;
51
52public final class DeoptimizationTest {
53    private static final String TEST_METHOD = "testMethod";
54    private static final WhiteBox WB = WhiteBox.getWhiteBox();
55    private final Method testMethod;
56
57    private DeoptimizationTest() {
58        try {
59            testMethod = getClass().getDeclaredMethod(TEST_METHOD);
60        } catch (NoSuchMethodException e) {
61            throw new Error("TEST BUG: no test method found", e);
62        }
63    }
64
65    public static void main(String args[]) {
66        new DeoptimizationTest().test();
67    }
68
69    private double testMethod() {
70        return 42 / 0;
71    }
72
73    private void test() {
74        Asserts.assertTrue(WB.isMethodCompiled(testMethod),
75                "Method expected to be compiled");
76        Asserts.assertEQ(WB.getMethodCompilationLevel(testMethod),
77                CompilerWhiteBoxTest.COMP_LEVEL_AOT,
78                "Unexpected compilation level at start");
79        Utils.runAndCheckException(() -> testMethod(), ArithmeticException.class);
80        Asserts.assertFalse(WB.isMethodCompiled(testMethod),
81                "Method is unexpectedly compiled after deoptimization");
82        Asserts.assertEQ(WB.getMethodCompilationLevel(testMethod), 0,
83                "Unexpected compilation level after deoptimization");
84    }
85}
86