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.RecompilationTest
  30  *        compiler.aot.AotCompiler
  31  * @run main ClassFileInstaller sun.hotspot.WhiteBox
  32  *     sun.hotspot.WhiteBox$WhiteBoxPermission
  33  * @run main compiler.aot.AotCompiler -libname libRecompilationTest1.so
  34  *     -class compiler.whitebox.SimpleTestCaseHelper
  35  *     -extraopt -Dgraal.TieredAOT=true -extraopt -Dgraal.ProfileSimpleMethods=true
  36  *     -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
  37  *     -extraopt -XX:-UseCompressedOops
  38  *     -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::*
  39  * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation
  40  *     -XX:-UseCounterDecay -XX:-UseCompressedOops
  41  *     -XX:-Inline
  42  *     -XX:AOTLibrary=./libRecompilationTest1.so -Xbootclasspath/a:.
  43  *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  44  *     -Dcompiler.aot.RecompilationTest.check_level=1
  45  *     compiler.aot.RecompilationTest
  46  * @run main compiler.aot.AotCompiler -libname libRecompilationTest2.so
  47  *     -class compiler.whitebox.SimpleTestCaseHelper
  48  *     -extraopt -Dgraal.TieredAOT=false
  49  *     -extraopt -XX:+UnlockDiagnosticVMOptions -extraopt -XX:+WhiteBoxAPI -extraopt -Xbootclasspath/a:.
  50  *     -extraopt -XX:-UseCompressedOops
  51  *     -extraopt -XX:CompileCommand=dontinline,compiler.whitebox.SimpleTestCaseHelper::*
  52  * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:+TieredCompilation
  53  *     -XX:-UseCounterDecay -XX:-UseCompressedOops
  54  *     -XX:-Inline
  55  *     -XX:AOTLibrary=./libRecompilationTest2.so -Xbootclasspath/a:.
  56  *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  57  *     -Dcompiler.aot.RecompilationTest.check_level=-1
  58  *     compiler.aot.RecompilationTest
  59  * @run main/othervm -Xmixed -Xbatch -XX:+UseAOT -XX:-TieredCompilation
  60  *     -XX:-UseCounterDecay -XX:-UseCompressedOops
  61  *     -XX:-Inline
  62  *     -XX:AOTLibrary=./libRecompilationTest2.so -Xbootclasspath/a:.
  63  *     -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  64  *     -Dcompiler.aot.RecompilationTest.check_level=-1
  65  *     compiler.aot.RecompilationTest
  66  * @summary check if recompilation after aot goes fine
  67  */
  68 
  69  /* having whitebox-related options for aot compiler is a temporary solution,
  70     because of JDK-8146201
  71  */
  72 
  73 package compiler.aot;
  74 
  75 import compiler.whitebox.CompilerWhiteBoxTest;
  76 import java.lang.reflect.Executable;
  77 import jdk.test.lib.Asserts;
  78 
  79 public final class RecompilationTest extends CompilerWhiteBoxTest {
  80     private static final int CHECK_LEVEL = Integer.getInteger(
  81                 "compiler.aot.RecompilationTest.check_level");
  82 
  83     public static void main(String args[]) {
  84         CompilerWhiteBoxTest.main(RecompilationTest::new, args);
  85     }
  86 
  87     private RecompilationTest(TestCase testCase) {
  88         super(testCase);
  89     }
  90 
  91     @Override
  92     protected void test() throws Exception {
  93         if (testCase.isOsr()) {
  94             /* aot compiler is not using osr compilation */
  95             System.out.println("Skipping OSR case");
  96             return;
  97         }
  98         Executable e = testCase.getExecutable();
  99         Asserts.assertTrue(WHITE_BOX.isMethodCompiled(e),
 100                 testCase.name() +  ": an executable expected to be compiled");
 101         Asserts.assertEQ(WHITE_BOX.getMethodCompilationLevel(e),
 102                 COMP_LEVEL_AOT,
 103                 String.format("%s: unexpected compilation level at start",
 104                         testCase.name()));
 105         compile();
 106         Asserts.assertTrue(WHITE_BOX.isMethodCompiled(e), testCase.name()
 107                 + ": method expected to be compiled");
 108         /* a case with AOT'ed code checks exact compilation level equality
 109            while another case checks minimum level and if method compiled
 110            because there might be different compilation level transitions */
 111         if (CHECK_LEVEL != COMP_LEVEL_AOT) {
 112             Asserts.assertGTE(WHITE_BOX.getMethodCompilationLevel(e),
 113                 CHECK_LEVEL,
 114                 String.format("%s: expected compilation level"
 115                         + " after compilation to be no less than %d for %s",
 116                         testCase.name(), CHECK_LEVEL, testCase.name()));
 117         } else {
 118             Asserts.assertEQ(WHITE_BOX.getMethodCompilationLevel(e),
 119                 COMP_LEVEL_AOT, String.format("%s: expected compilation"
 120                         + " level after compilation to be equal to %d for %s",
 121                         testCase.name(), COMP_LEVEL_AOT, testCase.name()));
 122         }
 123     }
 124 }