8007270: Make IsMethodCompilable test work with tiered
Summary: Only c2 compiles counts toward cutoff
Reviewed-by: kvn, roland
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Mon Mar 03 08:04:14 2014 +0100
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Tue Jan 28 15:05:46 2014 +0100
@@ -196,6 +196,29 @@
}
/**
+ * Checks, that {@linkplain #method} is not compiled at the given compilation
+ * level or above.
+ *
+ * @param compLevel
+ *
+ * @throws RuntimeException if {@linkplain #method} is in compiler queue or
+ * is compiled, or if {@linkplain #method} has zero
+ * compilation level.
+ */
+
+ protected final void checkNotCompiled(int compLevel) {
+ if (WHITE_BOX.isMethodQueuedForCompilation(method)) {
+ throw new RuntimeException(method + " must not be in queue");
+ }
+ if (WHITE_BOX.getMethodCompilationLevel(method, false) >= compLevel) {
+ throw new RuntimeException(method + " comp_level must be >= maxCompLevel");
+ }
+ if (WHITE_BOX.getMethodCompilationLevel(method, true) >= compLevel) {
+ throw new RuntimeException(method + " osr_comp_level must be >= maxCompLevel");
+ }
+ }
+
+ /**
* Checks, that {@linkplain #method} is not compiled.
*
* @throws RuntimeException if {@linkplain #method} is in compiler queue or
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Mon Mar 03 08:04:14 2014 +0100
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Tue Jan 28 15:05:46 2014 +0100
@@ -24,13 +24,17 @@
/*
* @test IsMethodCompilableTest
* @bug 8007270 8006683 8007288 8022832
- * @library /testlibrary /testlibrary/whitebox
+ * @library /testlibrary /testlibrary/whitebox /testlibrary/com/oracle/java/testlibrary
* @build IsMethodCompilableTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
+ * @run main ClassFileInstaller com.oracle.java.testlibrary.Platform
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
* @summary testing of WB::isMethodCompilable()
* @author igor.ignatyev@oracle.com
*/
+
+import com.oracle.java.testlibrary.Platform;
+
public class IsMethodCompilableTest extends CompilerWhiteBoxTest {
/**
* Value of {@code -XX:PerMethodRecompilationCutoff}
@@ -43,7 +47,7 @@
if (tmp == -1) {
PER_METHOD_RECOMPILATION_CUTOFF = -1 /* Inf */;
} else {
- PER_METHOD_RECOMPILATION_CUTOFF = 1 + (0xFFFFFFFFL & tmp);
+ PER_METHOD_RECOMPILATION_CUTOFF = (0xFFFFFFFFL & tmp);
}
}
@@ -60,19 +64,26 @@
/**
* Tests {@code WB::isMethodCompilable()} by recompilation of tested method
* 'PerMethodRecompilationCutoff' times and checks compilation status. Also
- * checks that WB::clearMethodState() clears no-compilable flags.
+ * checks that WB::clearMethodState() clears no-compilable flags. Only
+ * applicable to c2 compiled methods.
*
* @throws Exception if one of the checks fails.
*/
@Override
protected void test() throws Exception {
+
+ // Only c2 compilations can be disabled through PerMethodRecompilationCutoff
+ if (!Platform.isServer()) {
+ return;
+ }
+
if (testCase.isOsr() && CompilerWhiteBoxTest.MODE.startsWith(
"compiled ")) {
- System.err.printf("Warning: %s is not applicable in %s%n",
- testCase.name(), CompilerWhiteBoxTest.MODE);
- return;
+ System.err.printf("Warning: %s is not applicable in %s%n",
+ testCase.name(), CompilerWhiteBoxTest.MODE);
+ return;
}
- if (!isCompilable()) {
+ if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
throw new RuntimeException(method + " must be compilable");
}
System.out.println("PerMethodRecompilationCutoff = "
@@ -83,39 +94,37 @@
return;
}
- // deoptimize 'PerMethodRecompilationCutoff' times and clear state
- for (long i = 0L, n = PER_METHOD_RECOMPILATION_CUTOFF - 1; i < n; ++i) {
- compileAndDeoptimize();
+ // deoptimize 'PerMethodRecompilationCutoff' times
+ for (long attempts = 0, successes = 0;
+ (successes < PER_METHOD_RECOMPILATION_CUTOFF) &&
+ (attempts < PER_METHOD_RECOMPILATION_CUTOFF*2) &&
+ isCompilable(COMP_LEVEL_FULL_OPTIMIZATION); attempts++) {
+ if (compileAndDeoptimize() == COMP_LEVEL_FULL_OPTIMIZATION) {
+ successes++;
+ }
}
- if (!testCase.isOsr() && !isCompilable()) {
+
+ if (!testCase.isOsr() && !isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
// in osr test case count of deopt maybe more than iterations
throw new RuntimeException(method + " is not compilable after "
- + (PER_METHOD_RECOMPILATION_CUTOFF - 1) + " iterations");
+ + PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
}
- WHITE_BOX.clearMethodState(method);
- // deoptimize 'PerMethodRecompilationCutoff' + 1 times
- long i;
- for (i = 0L; i < PER_METHOD_RECOMPILATION_CUTOFF
- && isCompilable(); ++i) {
- compileAndDeoptimize();
- }
- if (!testCase.isOsr() && i != PER_METHOD_RECOMPILATION_CUTOFF) {
- // in osr test case count of deopt maybe more than iterations
- throw new RuntimeException(method + " is not compilable after "
- + i + " iterations, but must only after "
- + PER_METHOD_RECOMPILATION_CUTOFF);
- }
- if (isCompilable()) {
+ // Now compile once more
+ compileAndDeoptimize();
+
+ if (isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
throw new RuntimeException(method + " is still compilable after "
+ PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
}
+ checkNotCompiled();
compile();
- checkNotCompiled();
+ waitBackgroundCompilation();
+ checkNotCompiled(COMP_LEVEL_FULL_OPTIMIZATION);
// WB.clearMethodState() must reset no-compilable flags
WHITE_BOX.clearMethodState(method);
- if (!isCompilable()) {
+ if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) {
throw new RuntimeException(method
+ " is not compilable after clearMethodState()");
}
@@ -123,9 +132,11 @@
checkCompiled();
}
- private void compileAndDeoptimize() throws Exception {
+ private int compileAndDeoptimize() throws Exception {
compile();
waitBackgroundCompilation();
+ int compLevel = getCompLevel();
deoptimize();
+ return compLevel;
}
}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Mon Mar 03 08:04:14 2014 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Tue Jan 28 15:05:46 2014 +0100
@@ -28,6 +28,15 @@
private static final String dataModel = System.getProperty("sun.arch.data.model");
private static final String vmVersion = System.getProperty("java.vm.version");
private static final String osArch = System.getProperty("os.arch");
+ private static final String vmName = System.getProperty("java.vm.name");
+
+ public static boolean isClient() {
+ return vmName.endsWith(" Client VM");
+ }
+
+ public static boolean isServer() {
+ return vmName.endsWith(" Server VM");
+ }
public static boolean is32bit() {
return dataModel.equals("32");