IsMethodCompilableTest.java revision 9300:f81484d852ac
1/*
2 * Copyright (c) 2013, 2015, 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 IsMethodCompilableTest
26 * @bug 8007270 8006683 8007288 8022832
27 * @library /testlibrary /test/lib
28 * @modules java.base/sun.misc
29 *          java.management
30 * @build jdk.test.lib.* sun.hotspot.WhiteBox
31 * @build IsMethodCompilableTest
32 * @run main ClassFileInstaller sun.hotspot.WhiteBox
33 *                              sun.hotspot.WhiteBox$WhiteBoxPermission
34 * @run main ClassFileInstaller jdk.test.lib.Platform
35 * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
36 * @summary testing of WB::isMethodCompilable()
37 * @author igor.ignatyev@oracle.com
38 */
39
40import jdk.test.lib.Platform;
41
42public class IsMethodCompilableTest extends CompilerWhiteBoxTest {
43    /**
44     * Value of {@code -XX:PerMethodRecompilationCutoff}
45     */
46    protected static final long PER_METHOD_RECOMPILATION_CUTOFF;
47
48    static {
49        long tmp = Long.parseLong(
50                getVMOption("PerMethodRecompilationCutoff", "400"));
51        if (tmp == -1) {
52            PER_METHOD_RECOMPILATION_CUTOFF = -1 /* Inf */;
53        } else {
54            PER_METHOD_RECOMPILATION_CUTOFF = (0xFFFFFFFFL & tmp);
55        }
56    }
57
58    public static void main(String[] args) throws Exception {
59        CompilerWhiteBoxTest.main(IsMethodCompilableTest::new, args);
60    }
61
62    private IsMethodCompilableTest(TestCase testCase) {
63        super(testCase);
64        // to prevent inlining of #method
65        WHITE_BOX.testSetDontInlineMethod(method, true);
66    }
67
68    /**
69     * Tests {@code WB::isMethodCompilable()} by recompilation of tested method
70     * 'PerMethodRecompilationCutoff' times and checks compilation status. Also
71     * checks that WB::clearMethodState() clears no-compilable flags. Only
72     * applicable to c2 compiled methods.
73     *
74     * @throws Exception if one of the checks fails.
75     */
76    @Override
77    protected void test() throws Exception {
78
79        // Only c2 compilations can be disabled through PerMethodRecompilationCutoff
80        if (!Platform.isServer()) {
81            return;
82        }
83
84        if (skipXcompOSR()) {
85            return;
86        }
87        if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
88            throw new RuntimeException(method + " must be compilable");
89        }
90        System.out.println("PerMethodRecompilationCutoff = "
91                + PER_METHOD_RECOMPILATION_CUTOFF);
92        if (PER_METHOD_RECOMPILATION_CUTOFF == -1) {
93            System.err.println(
94                    "Warning: test is not applicable if PerMethodRecompilationCutoff == Inf");
95            return;
96        }
97
98        // deoptimize 'PerMethodRecompilationCutoff' times
99        for (long attempts = 0, successes = 0;
100               (successes < PER_METHOD_RECOMPILATION_CUTOFF)  &&
101               (attempts < PER_METHOD_RECOMPILATION_CUTOFF*2) &&
102               isCompilable(COMP_LEVEL_FULL_OPTIMIZATION); attempts++) {
103            if (compileAndDeoptimize() == COMP_LEVEL_FULL_OPTIMIZATION) {
104                successes++;
105            }
106        }
107
108        if (!testCase.isOsr() && !isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
109            // in osr test case count of deopt maybe more than iterations
110            throw new RuntimeException(method + " is not compilable after "
111                    + PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
112        }
113
114        // Now compile once more
115        compileAndDeoptimize();
116
117        if (isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
118            throw new RuntimeException(method + " is still compilable after "
119                    + PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
120        }
121        checkNotCompiled();
122        compile();
123        waitBackgroundCompilation();
124        checkNotCompiled(COMP_LEVEL_FULL_OPTIMIZATION);
125
126        // WB.clearMethodState() must reset no-compilable flags
127        WHITE_BOX.clearMethodState(method);
128        if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
129            throw new RuntimeException(method
130                    + " is not compilable after clearMethodState()");
131        }
132        compile();
133        checkCompiled();
134    }
135
136    private int compileAndDeoptimize() throws Exception {
137        compile();
138        waitBackgroundCompilation();
139        int compLevel = getCompLevel();
140        deoptimize();
141        return compLevel;
142    }
143}
144