--- old/src/share/vm/opto/graphKit.cpp 2017-06-16 14:34:20.801928416 +0200 +++ new/src/share/vm/opto/graphKit.cpp 2017-06-16 14:34:20.453928432 +0200 @@ -580,7 +580,7 @@ ex_obj = env()->ArrayIndexOutOfBoundsException_instance(); break; case Deoptimization::Reason_class_check: - if (java_bc() == Bytecodes::_aastore) { + if (java_bc() == Bytecodes::_aastore || java_bc() == Bytecodes::_vastore) { ex_obj = env()->ArrayStoreException_instance(); } else { ex_obj = env()->ClassCastException_instance(); @@ -2641,13 +2641,7 @@ Node* *casted_receiver) { const TypeKlassPtr* tklass = TypeKlassPtr::make(klass); Node* recv_klass = load_object_klass(receiver); - Node* want_klass = makecon(tklass); - Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass) ); - Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) ); - IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN); - set_control( _gvn.transform( new IfTrueNode (iff) )); - Node* fail = _gvn.transform( new IfFalseNode(iff) ); - + Node* fail = type_check(recv_klass, tklass, prob); const TypeOopPtr* recv_xtype = tklass->as_instance_type(); assert(recv_xtype->klass_is_exact(), ""); @@ -2660,6 +2654,18 @@ return fail; } +Node* GraphKit::type_check(Node* recv_klass, const TypeKlassPtr* tklass, + float prob) { + //const TypeKlassPtr* tklass = TypeKlassPtr::make(klass); + Node* want_klass = makecon(tklass); + Node* cmp = _gvn.transform( new CmpPNode(recv_klass, want_klass)); + Node* bol = _gvn.transform( new BoolNode(cmp, BoolTest::eq) ); + IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN); + set_control( _gvn.transform( new IfTrueNode (iff))); + Node* fail = _gvn.transform( new IfFalseNode(iff)); + return fail; +} + //------------------------------seems_never_null------------------------------- // Use null_seen information if it is available from the profile. @@ -3397,7 +3403,7 @@ } //-------------------------------new_array------------------------------------- -// helper for newarray, anewarray and vnewarray +// helper for newarray and anewarray // The 'length' parameter is (obviously) the length of the array. // See comments on new_instance for the meaning of the other arguments. Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)