# HG changeset patch # User cfang # Date 1259092182 28800 # Node ID de44705e6b336c220f461250d48b87b203f7ced8 # Parent fb4c00faa9da72933ea3bf19212ace6a52898381# Parent 7ef1d2e14917a9d9d1a3c6c8d5093beaaa7b9745 Merge diff -r fb4c00faa9da -r de44705e6b33 src/share/vm/interpreter/templateInterpreter.cpp --- a/src/share/vm/interpreter/templateInterpreter.cpp Wed Nov 11 09:13:12 2009 -0500 +++ b/src/share/vm/interpreter/templateInterpreter.cpp Tue Nov 24 11:49:42 2009 -0800 @@ -465,9 +465,11 @@ void TemplateInterpreterGenerator::set_short_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) { assert(t->is_valid(), "template must exist"); switch (t->tos_in()) { - case btos: vep = __ pc(); __ pop(btos); bep = __ pc(); generate_and_dispatch(t); break; - case ctos: vep = __ pc(); __ pop(ctos); sep = __ pc(); generate_and_dispatch(t); break; - case stos: vep = __ pc(); __ pop(stos); sep = __ pc(); generate_and_dispatch(t); break; + case btos: + case ctos: + case stos: + ShouldNotReachHere(); // btos/ctos/stos should use itos. + break; case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break; case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break; case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break; diff -r fb4c00faa9da -r de44705e6b33 src/share/vm/opto/escape.cpp --- a/src/share/vm/opto/escape.cpp Wed Nov 11 09:13:12 2009 -0500 +++ b/src/share/vm/opto/escape.cpp Tue Nov 24 11:49:42 2009 -0800 @@ -1150,7 +1150,6 @@ } else { assert(n->is_Mem(), "memory node required."); Node *addr = n->in(MemNode::Address); - assert(addr->is_AddP(), "AddP required"); const Type *addr_t = igvn->type(addr); if (addr_t == Type::TOP) continue; diff -r fb4c00faa9da -r de44705e6b33 src/share/vm/opto/parse1.cpp --- a/src/share/vm/opto/parse1.cpp Wed Nov 11 09:13:12 2009 -0500 +++ b/src/share/vm/opto/parse1.cpp Tue Nov 24 11:49:42 2009 -0800 @@ -231,12 +231,13 @@ // Use the raw liveness computation to make sure that unexpected // values don't propagate into the OSR frame. - MethodLivenessResult live_locals = method()->raw_liveness_at_bci(osr_bci()); + MethodLivenessResult live_locals = method()->liveness_at_bci(osr_bci()); if (!live_locals.is_valid()) { // Degenerate or breakpointed method. C->record_method_not_compilable("OSR in empty or breakpointed method"); return; } + MethodLivenessResult raw_live_locals = method()->raw_liveness_at_bci(osr_bci()); // Extract the needed locals from the interpreter frame. Node *locals_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals-1)*wordSize); @@ -316,6 +317,10 @@ continue; } } + if (type->basic_type() == T_ADDRESS && !raw_live_locals.at(index)) { + // Skip type check for dead address locals + continue; + } set_local(index, check_interpreter_type(l, type, bad_type_exit)); }