src/share/vm/opto/doCall.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/doCall.cpp	Thu Oct  2 10:57:23 2014
--- new/src/share/vm/opto/doCall.cpp	Thu Oct  2 10:57:23 2014

*** 800,813 **** --- 800,819 ---- // Obvious solution is to simple do a LoadKlass from the 'ex_node'. // However, if the ex_node is a PhiNode, I'm going to do a LoadKlass for // each arm of the Phi. If I know something clever about the exceptions // I'm loading the class from, I can replace the LoadKlass with the // klass constant for the exception oop. ! if( ex_node->is_Phi() ) { ! ex_klass_node = new PhiNode( ex_node->in(0), TypeKlassPtr::OBJECT ); ! for( uint i = 1; i < ex_node->req(); i++ ) { ! Node* p = basic_plus_adr( ex_node->in(i), ex_node->in(i), oopDesc::klass_offset_in_bytes() ); ! if (ex_node->is_Phi()) { ! ex_klass_node = new PhiNode(ex_node->in(0), TypeKlassPtr::OBJECT); ! for (uint i = 1; i < ex_node->req(); i++) { ! Node* ex_in = ex_node->in(i); + if (ex_in == top() || ex_in == NULL) { + // This path was not taken. + ex_klass_node->init_req(i, top()); + continue; + } + Node* p = basic_plus_adr(ex_in, ex_in, oopDesc::klass_offset_in_bytes()); Node* k = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), p, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT) ); ex_klass_node->init_req( i, k ); } _gvn.set_type(ex_klass_node, TypeKlassPtr::OBJECT);

src/share/vm/opto/doCall.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File