test/compiler/whitebox/IsMethodCompilableTest.java

Wed, 13 Feb 2013 08:29:04 -0800

author
iignatyev
date
Wed, 13 Feb 2013 08:29:04 -0800
changeset 4592
12e01444ca2d
child 4637
1b0dc9f87e75
permissions
-rw-r--r--

8006683: Add WhiteBox API to testing of compiler
Reviewed-by: kvn, vlivanov

     1 /*
     2  * Copyright (c) 2013, 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  */
    24 /*
    25  * @test IsMethodCompilableTest
    26  * @bug 8007270
    27  * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
    28  * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI IsMethodCompilableTest.java
    29  * @run main/othervm/timeout=600 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI IsMethodCompilableTest
    30  * @author igor.ignatyev@oracle.com
    31  */
    32 public class IsMethodCompilableTest extends CompilerWhiteBoxTest {
    33     protected static final long PER_METHOD_RECOMPILATION_CUTOFF;
    35     static {
    36         long tmp = Long.parseLong(
    37                 getVMOption("PerMethodRecompilationCutoff", "400"));
    38         if (tmp == -1) {
    39             PER_METHOD_RECOMPILATION_CUTOFF = -1 /* Inf */;
    40         } else {
    41             PER_METHOD_RECOMPILATION_CUTOFF = 1 + (0xFFFFFFFFL & tmp);
    42         }
    43     }
    45     public static void main(String[] args) throws Exception {
    46         new IsMethodCompilableTest().runTest();
    47     }
    49     protected void test() throws Exception {
    50         if (!WHITE_BOX.isMethodCompilable(METHOD)) {
    51             throw new RuntimeException(METHOD + " must be compilable");
    52         }
    53         System.out.println("PerMethodRecompilationCutoff = "
    54                 + PER_METHOD_RECOMPILATION_CUTOFF);
    55         if (PER_METHOD_RECOMPILATION_CUTOFF == -1) {
    56             System.err.println(
    57                     "Warning: test is not applicable if PerMethodRecompilationCutoff == Inf");
    58             return;
    59         }
    60         // to prevent inlining #method into #compile()
    61         WHITE_BOX.setDontInlineMethod(METHOD, true);
    62         boolean madeNotCompilable = false;
    64         for (long i = 0; i < PER_METHOD_RECOMPILATION_CUTOFF; ++i) {
    65             compile();
    66             waitBackgroundCompilation(METHOD);
    67             WHITE_BOX.deoptimizeMethod(METHOD);
    68             if (!WHITE_BOX.isMethodCompilable(METHOD)) {
    69                 madeNotCompilable = true;
    70                 break;
    71             }
    72         }
    73         if (!madeNotCompilable) {
    74             throw new RuntimeException(METHOD + " is still compilable after "
    75                     + PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
    76         }
    77         compile();
    78         if (WHITE_BOX.isMethodCompiled(METHOD)) {
    79             printInfo(METHOD);
    80             throw new RuntimeException(
    81                     METHOD + " is not compilable but compiled");
    82         }
    83     }
    84 }

mercurial