8218201: Failures when vmIntrinsics::_getClass is not inlined
Summary: Fix BCEscapeAnalyzer to correctly handle _getClass intrinsic.
Reviewed-by: kvn, dlong, redestad, neliasso
--- a/src/hotspot/share/ci/bcEscapeAnalyzer.cpp Mon Mar 11 14:57:16 2019 +0530
+++ b/src/hotspot/share/ci/bcEscapeAnalyzer.cpp Mon Mar 11 11:42:57 2019 +0100
@@ -1197,38 +1197,36 @@
}
}
-bool BCEscapeAnalyzer::do_analysis() {
+void BCEscapeAnalyzer::do_analysis() {
Arena* arena = CURRENT_ENV->arena();
// identify basic blocks
_methodBlocks = _method->get_method_blocks();
iterate_blocks(arena);
- // TEMPORARY
- return true;
}
vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
vmIntrinsics::ID iid = method()->intrinsic_id();
-
if (iid == vmIntrinsics::_getClass ||
- iid == vmIntrinsics::_hashCode)
+ iid == vmIntrinsics::_hashCode) {
return iid;
- else
+ } else {
return vmIntrinsics::_none;
+ }
}
-bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
+void BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
switch (iid) {
- case vmIntrinsics::_getClass:
- _return_local = false;
- break;
- case vmIntrinsics::_hashCode:
- // initialized state is correct
- break;
+ case vmIntrinsics::_getClass:
+ _return_local = false;
+ _return_allocated = false;
+ break;
+ case vmIntrinsics::_hashCode:
+ // initialized state is correct
+ break;
default:
assert(false, "unexpected intrinsic");
}
- return true;
}
void BCEscapeAnalyzer::initialize() {
@@ -1299,7 +1297,7 @@
vmIntrinsics::ID iid = known_intrinsic();
// check if method can be analyzed
- if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized()
+ if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized()
|| _level > MaxBCEAEstimateLevel
|| method()->code_size() > MaxBCEAEstimateSize)) {
if (BCEATraceLevel >= 1) {
@@ -1332,8 +1330,6 @@
tty->print_cr(" (%d bytes)", method()->code_size());
}
- bool success;
-
initialize();
// Do not scan method if it has no object parameters and
@@ -1349,9 +1345,9 @@
}
if (iid != vmIntrinsics::_none)
- success = compute_escape_for_intrinsic(iid);
+ compute_escape_for_intrinsic(iid);
else {
- success = do_analysis();
+ do_analysis();
}
// don't store interprocedural escape information if it introduces
--- a/src/hotspot/share/ci/bcEscapeAnalyzer.hpp Mon Mar 11 14:57:16 2019 +0530
+++ b/src/hotspot/share/ci/bcEscapeAnalyzer.hpp Mon Mar 11 11:42:57 2019 +0100
@@ -101,8 +101,8 @@
void clear_escape_info();
void compute_escape_info();
vmIntrinsics::ID known_intrinsic();
- bool compute_escape_for_intrinsic(vmIntrinsics::ID iid);
- bool do_analysis();
+ void compute_escape_for_intrinsic(vmIntrinsics::ID iid);
+ void do_analysis();
void read_escape_info();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/escapeAnalysis/TestGetClass.java Mon Mar 11 11:42:57 2019 +0100
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2019, 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
+ * @bug 8218201
+ * @summary BCEscapeAnalyzer assigns wrong escape state to getClass return value.
+ * @run main/othervm -XX:-TieredCompilation -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_getClass
+ * -XX:CompileCommand=quiet -XX:CompileCommand=compileonly,compiler.escapeAnalysis.TestGetClass::test
+ * -XX:+PrintCompilation compiler.escapeAnalysis.TestGetClass
+ */
+
+package compiler.escapeAnalysis;
+
+public class TestGetClass {
+ static Object obj = new Object();
+
+ public static boolean test() {
+ if (obj.getClass() == Object.class) {
+ synchronized (obj) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void main(String[] args) {
+ if (!test()) {
+ throw new RuntimeException("Test failed");
+ }
+ }
+}