RFR(XS) 8191688: Assert failed in > 200 tests: failed dependencies, but counter didn't change
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Wed Nov 22 12:13:32 UTC 2017
> https://bugs.openjdk.java.net/browse/JDK-8191688
> http://cr.openjdk.java.net/~dlong/8191688/webrev/
The fix looks good.
An observation not related to the bug:
+ if (env->jvmti_can_hotswap_or_post_breakpoint()) {
// 6328518 check hotswap conditions under the right lock.
MutexLocker locker(Compile_lock);
if (Dependencies::check_evol_method(h_m()) != NULL) {
_is_c1_compilable = false;
_is_c2_compilable = false;
+ _can_be_parsed = false;
}
} else {
Klass* Dependencies::check_evol_method(Method* m) {
...
if (m->is_old()
|| m->number_of_breakpoints() > 0) {
return m->method_holder();
It seems once there's a breakpoint set in a method, it will never be
compiled again. (I looked in the code couldn't find where
_is_c1_compilable/_is_c2_compilable are reset once all breakpoints are
cleared). If that's the case, it has severe performance consequences, so
better to fix it.
Also, some nitpicking follows:
+ bool _can_be_parsed;
+ bool can_be_parsed() const { return _can_be_parsed; }
The name confuses me. I'd presume it signals there are some problems
with parsing the method, so don't even try. It seems the choice was
affected by InlineTree::check_can_parse(), but the latter looks justified:
const char* InlineTree::check_can_parse(ciMethod* callee) {
// Certain methods cannot be parsed at all:
if ( callee->is_native()) return "native method";
if ( callee->is_abstract()) return "abstract method";
if (!callee->has_balanced_monitors()) return "not compilable
(unbalanced monitors)";
if ( callee->get_flow_analysis()->failing()) return "not compilable
(flow analysis failed)";
Why doesn't it stress it's all about inlining? E.g.,
ciMethod::can_be_inlined looks more descriptive in that context.
Best regards,
Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list