hotspot/test/compiler/stable/StableConfiguration.java
author bpb
Wed, 19 Aug 2015 13:11:24 -0700
changeset 32232 8d58fc5a0349
parent 30859 76147e537436
child 36604 e9c073b0c19e
child 36508 5f9eee6b383b
permissions -rw-r--r--
8074821: Resolve disabled warnings for libnio Summary: Enable the indicated warnings and correct the code which provoked them. Reviewed-by: alanb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25641
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     1
/*
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     2
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     4
 *
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    10
 *
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    15
 * accompanied this code).
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    16
 *
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    20
 *
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    23
 * questions.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    24
 */
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    25
package java.lang.invoke;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    26
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    27
import java.lang.reflect.Method;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    28
import java.util.Properties;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    29
import sun.hotspot.WhiteBox;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    30
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    31
public class StableConfiguration {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    32
    static final WhiteBox WB = WhiteBox.getWhiteBox();
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    33
    static final boolean isStableEnabled;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    34
    static final boolean isServerWithStable;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    35
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    36
    static {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    37
        Boolean value = WB.getBooleanVMFlag("FoldStableValues");
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    38
        isStableEnabled = (value == null ? false : value);
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    39
        isServerWithStable = isStableEnabled && get();
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    40
        System.out.println("@Stable:         " + (isStableEnabled ? "enabled" : "disabled"));
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    41
        System.out.println("Server Compiler: " + get());
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    42
    }
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    43
30859
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    44
    // The method 'get' below returns true if the method is server compiled
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    45
    // and is used by the Stable tests to determine whether methods in
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    46
    // general are being server compiled or not as the -XX:+FoldStableValues
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    47
    // option is only applicable to -server.
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    48
    //
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    49
    // On aarch64 we DeOptimize when patching. This means that when the
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    50
    // method is compiled as a result of -Xcomp it DeOptimizes immediately.
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    51
    // The result is that getMethodCompilationLevel returns 0. This means
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    52
    // the method returns true based on java.vm.name.
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    53
    //
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    54
    // However when the tests are run with -XX:+TieredCompilation and
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    55
    // -XX:TieredStopAtLevel=1 this fails because methods will always
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    56
    // be client compiled.
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    57
    //
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    58
    // Solution is to add a simple method 'get1' which should never be
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    59
    // DeOpted and use that to determine the compilation level instead.
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    60
    static void get1() {
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    61
    }
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    62
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    63
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    64
25641
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    65
    // ::get() is among immediately compiled methods.
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    66
    static boolean get() {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    67
        try {
30859
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    68
            get1();
76147e537436 8081669: aarch64: JTreg TestStable tests failing
enevill
parents: 25641
diff changeset
    69
            Method m = StableConfiguration.class.getDeclaredMethod("get1");
25641
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    70
            int level = WB.getMethodCompilationLevel(m);
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    71
            if (level > 0) {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    72
              return (level == 4);
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    73
            } else {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    74
              String javaVM = System.getProperty("java.vm.name", "");
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    75
              if (javaVM.contains("Server")) return true;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    76
              if (javaVM.contains("Client")) return false;
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    77
              throw new Error("Unknown VM type: "+javaVM);
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    78
            }
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    79
        } catch (NoSuchMethodException e) {
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    80
            throw new Error(e);
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    81
        }
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    82
    }
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    83
d99065e4572b 8043546: C1 optimizes @Stable instance fields with default values
vlivanov
parents:
diff changeset
    84
}