--- old/src/share/vm/opto/parse1.cpp 2014-12-19 14:44:46.938240381 +0100 +++ new/src/share/vm/opto/parse1.cpp 2014-12-19 14:44:46.765926684 +0100 @@ -986,7 +986,16 @@ if (tf()->range()->cnt() > TypeFunc::Parms) { const Type* ret_type = tf()->range()->field_at(TypeFunc::Parms); Node* ret_phi = _gvn.transform( _exits.argument(0) ); - assert(_exits.control()->is_top() || !_gvn.type(ret_phi)->empty(), "return value must be well defined"); +#ifdef ASSERT + { + // In case of concurrent class loading, the type we set for the + // ret_phi in build_exits() may have been too optimistic and the + // ret_phi may be top now. + MutexLockerEx ml(Compile_lock, Mutex::_no_safepoint_check_flag); + assert(_exits.control()->is_top() || !_gvn.type(ret_phi)->empty() || + (ret_type->isa_ptr() && C->env()->system_dictionary_modification_counter_changed()), "return value must be well defined"); + } +#endif _exits.push_node(ret_type->basic_type(), ret_phi); }