I have been following up on some weird compilation skips with Shenandoah, and figured we have the intermittent skip like this:
8376 711 ! java.io.ObjectInputStream::readSerialData (563 bytes) COMPILE SKIPPED: invalid non-klass dependency
But then, printing out the actual dependency that failed yields:
8376 711 ! java.io.ObjectInputStream::readSerialData (563 bytes) COMPILE SKIPPED: invalid non-klass dependency: leaf_type
But leaf_type *is* klass dependency! I think the condition in the logging code is incorrect, and this is actually "concurrent class unloading". This must be the fix:
diff -r 266e6a543eaa src/hotspot/share/ci/ciEnv.cpp
--- a/src/hotspot/share/ci/ciEnv.cpp Mon Jul 09 10:35:29 2018 +0200
+++ b/src/hotspot/share/ci/ciEnv.cpp Mon Jul 09 19:46:56 2018 +0200
@@ -935,12 +935,12 @@
Dependencies::DepType result = dependencies()->validate_dependencies(_task, counter_changed);
if (result != Dependencies::end_marker) {
if (result == Dependencies::call_site_target_value) {
_inc_decompile_count_on_failure = false;
record_failure("call site target change");
- } else if (Dependencies::is_klass_type(result)) {
- record_failure("invalid non-klass dependency");
+ } else if (!Dependencies::is_klass_type(result)) {
+ record_failure(err_msg("invalid non-klass dependency: %s", Dependencies::dep_name(result)));
} else {
record_failure("concurrent class loading");
}
}
}
Would be nice if somebody double-check it.