hotspot/test/compiler/aot/RecompilationTest.java
changeset 42650 1f304d0c888b
child 42657 9e1850986b28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/aot/RecompilationTest.java	Sun Dec 11 19:07:04 2016 -0800
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2016, 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
+ * @library /test/lib /testlibrary /
+ * @requires vm.bits == "64" & os.arch == "amd64" & os.family == "linux"
+ * @modules java.base/jdk.internal.misc
+ * @build compiler.aot.RecompilationTest
+ *        compiler.aot.AotCompiler
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *     sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main compiler.aot.AotCompiler -libname libRecompilationTest.so
+ *     -class compiler.whitebox.SimpleTestCaseHelper
+ *     -extraopt -Dgraal.TieredAOT=true -extraopt -Dgraal.ProfileSimpleMethods=true
+ *     -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
+ * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation -XX:-UseCounterDecay
+ *     -XX:CompileCommand=dontinline,*.*
+ *     -XX:AOTLibrary=./libRecompilationTest.so -Xbootclasspath/a:.
+ *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *     -Dcompiler.aot.RecompilationTest.check_level=1
+ *     compiler.aot.RecompilationTest
+ * @run main compiler.aot.AotCompiler -libname libRecompilationTest.so
+ *     -class compiler.whitebox.SimpleTestCaseHelper
+ *     -extraopt -Dgraal.TieredAOT=false
+ *     -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
+ * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation -XX:-UseCounterDecay
+ *     -XX:CompileCommand=dontinline,*.*
+ *     -XX:AOTLibrary=./libRecompilationTest.so -Xbootclasspath/a:.
+ *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *     -Dcompiler.aot.RecompilationTest.check_level=-1
+ *     compiler.aot.RecompilationTest
+ * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:-TieredCompilation -XX:-UseCounterDecay
+ *     -XX:CompileCommand=dontinline,*.*
+ *     -XX:AOTLibrary=./libRecompilationTest.so -Xbootclasspath/a:.
+ *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ *     -Dcompiler.aot.RecompilationTest.check_level=-1
+ *     compiler.aot.RecompilationTest
+ * @summary check if recompilation after aot goes fine
+ */
+
+ /* having whitebox-related options for aot compiler is a temporary solution,
+    because of JDK-8146201
+ */
+
+package compiler.aot;
+
+import compiler.whitebox.CompilerWhiteBoxTest;
+import java.lang.reflect.Executable;
+import jdk.test.lib.Asserts;
+
+public final class RecompilationTest extends CompilerWhiteBoxTest {
+    private static final int CHECK_LEVEL = Integer.getInteger(
+                "compiler.aot.RecompilationTest.check_level");
+
+    public static void main(String args[]) {
+        CompilerWhiteBoxTest.main(RecompilationTest::new, args);
+    }
+
+    private RecompilationTest(TestCase testCase) {
+        super(testCase);
+    }
+
+    @Override
+    protected void test() throws Exception {
+        if (testCase.isOsr()) {
+            /* aot compiler is not using osr compilation */
+            System.out.println("Skipping OSR case");
+            return;
+        }
+        Executable e = testCase.getExecutable();
+        Asserts.assertTrue(WHITE_BOX.isMethodCompiled(e),
+                testCase.name() +  ": an executable expected to be compiled");
+        Asserts.assertEQ(WHITE_BOX.getMethodCompilationLevel(e),
+                COMP_LEVEL_AOT,
+                String.format("%s: unexpected compilation level at start",
+                        testCase.name()));
+        compile();
+        Asserts.assertTrue(WHITE_BOX.isMethodCompiled(e), testCase.name()
+                + ": method expected to be compiled");
+        /* a case with AOT'ed code checks exact compilation level equality
+           while another case checks minimum level and if method compiled
+           because there might be different compilation level transitions */
+        if (CHECK_LEVEL != COMP_LEVEL_AOT) {
+            Asserts.assertGTE(WHITE_BOX.getMethodCompilationLevel(e),
+                CHECK_LEVEL,
+                String.format("%s: expected compilation level"
+                        + " after compilation to be no less than %d for %s",
+                        testCase.name(), CHECK_LEVEL, testCase.name()));
+        } else {
+            Asserts.assertEQ(WHITE_BOX.getMethodCompilationLevel(e),
+                COMP_LEVEL_AOT, String.format("%s: expected compilation"
+                        + " level after compilation to be equal to %d for %s",
+                        testCase.name(), COMP_LEVEL_AOT, testCase.name()));
+        }
+    }
+}