提交 5fd9b827 编写于 作者: T thartmann

8218201: Failures when vmIntrinsics::_getClass is not inlined

Summary: Fix BCEscapeAnalyzer to correctly handle _getClass intrinsic.
Reviewed-by: kvn, dlong, redestad, neliasso
上级 f83c5cf5
...@@ -1170,45 +1170,43 @@ void BCEscapeAnalyzer::iterate_blocks(Arena *arena) { ...@@ -1170,45 +1170,43 @@ void BCEscapeAnalyzer::iterate_blocks(Arena *arena) {
} }
} }
bool BCEscapeAnalyzer::do_analysis() { void BCEscapeAnalyzer::do_analysis() {
Arena* arena = CURRENT_ENV->arena(); Arena* arena = CURRENT_ENV->arena();
// identify basic blocks // identify basic blocks
_methodBlocks = _method->get_method_blocks(); _methodBlocks = _method->get_method_blocks();
iterate_blocks(arena); iterate_blocks(arena);
// TEMPORARY
return true;
} }
vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() { vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
vmIntrinsics::ID iid = method()->intrinsic_id(); vmIntrinsics::ID iid = method()->intrinsic_id();
if (iid == vmIntrinsics::_getClass || if (iid == vmIntrinsics::_getClass ||
iid == vmIntrinsics::_fillInStackTrace || iid == vmIntrinsics::_fillInStackTrace ||
iid == vmIntrinsics::_hashCode) iid == vmIntrinsics::_hashCode) {
return iid; return iid;
else } else {
return vmIntrinsics::_none; return vmIntrinsics::_none;
}
} }
bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) { void BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
ArgumentMap arg; ArgumentMap arg;
arg.clear(); arg.clear();
switch (iid) { switch (iid) {
case vmIntrinsics::_getClass: case vmIntrinsics::_getClass:
_return_local = false; _return_local = false;
break; _return_allocated = false;
case vmIntrinsics::_fillInStackTrace: break;
arg.set(0); // 'this' case vmIntrinsics::_fillInStackTrace:
set_returned(arg); arg.set(0); // 'this'
break; set_returned(arg);
case vmIntrinsics::_hashCode: break;
// initialized state is correct case vmIntrinsics::_hashCode:
break; // initialized state is correct
break;
default: default:
assert(false, "unexpected intrinsic"); assert(false, "unexpected intrinsic");
} }
return true;
} }
void BCEscapeAnalyzer::initialize() { void BCEscapeAnalyzer::initialize() {
...@@ -1279,7 +1277,7 @@ void BCEscapeAnalyzer::compute_escape_info() { ...@@ -1279,7 +1277,7 @@ void BCEscapeAnalyzer::compute_escape_info() {
vmIntrinsics::ID iid = known_intrinsic(); vmIntrinsics::ID iid = known_intrinsic();
// check if method can be analyzed // 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 || _level > MaxBCEAEstimateLevel
|| method()->code_size() > MaxBCEAEstimateSize)) { || method()->code_size() > MaxBCEAEstimateSize)) {
if (BCEATraceLevel >= 1) { if (BCEATraceLevel >= 1) {
...@@ -1312,8 +1310,6 @@ void BCEscapeAnalyzer::compute_escape_info() { ...@@ -1312,8 +1310,6 @@ void BCEscapeAnalyzer::compute_escape_info() {
tty->print_cr(" (%d bytes)", method()->code_size()); tty->print_cr(" (%d bytes)", method()->code_size());
} }
bool success;
initialize(); initialize();
// Do not scan method if it has no object parameters and // Do not scan method if it has no object parameters and
...@@ -1329,9 +1325,9 @@ void BCEscapeAnalyzer::compute_escape_info() { ...@@ -1329,9 +1325,9 @@ void BCEscapeAnalyzer::compute_escape_info() {
} }
if (iid != vmIntrinsics::_none) if (iid != vmIntrinsics::_none)
success = compute_escape_for_intrinsic(iid); compute_escape_for_intrinsic(iid);
else { else {
success = do_analysis(); do_analysis();
} }
// don't store interprocedural escape information if it introduces // don't store interprocedural escape information if it introduces
......
...@@ -101,8 +101,8 @@ class BCEscapeAnalyzer : public ResourceObj { ...@@ -101,8 +101,8 @@ class BCEscapeAnalyzer : public ResourceObj {
void clear_escape_info(); void clear_escape_info();
void compute_escape_info(); void compute_escape_info();
vmIntrinsics::ID known_intrinsic(); vmIntrinsics::ID known_intrinsic();
bool compute_escape_for_intrinsic(vmIntrinsics::ID iid); void compute_escape_for_intrinsic(vmIntrinsics::ID iid);
bool do_analysis(); void do_analysis();
void read_escape_info(); void read_escape_info();
......
/*
* 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");
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册