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