src/share/vm/opto/parse1.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/parse1.cpp	Thu Feb 25 11:03:56 2010
--- new/src/share/vm/opto/parse1.cpp	Thu Feb 25 11:03:56 2010

*** 1,7 **** --- 1,7 ---- /* ! * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. ! * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 235,245 **** --- 235,244 ---- 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); // find all the locals that the interpreter thinks contain live oops
*** 304,313 **** --- 303,313 ---- // Now that the interpreter state is loaded, make sure it will match // at execution time what the compiler is expecting now: SafePointNode* bad_type_exit = clone_map(); bad_type_exit->set_control(new (C, 1) RegionNode(1)); + assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point"); for (index = 0; index < max_locals; index++) { if (stopped()) break; Node* l = local(index); if (l->is_top()) continue; // nothing here const Type *type = osr_block->local_type_at(index);
*** 315,326 **** --- 315,336 ---- if (!live_oops.at(index)) { // skip type check for dead oops continue; } } - if (type->basic_type() == T_ADDRESS && !raw_live_locals.at(index)) { // Skip type check for dead address locals + // In our current system it's illegal for jsr addresses to be + // live into an OSR entry point because the compiler performs + // inlining of jsrs. ciTypeFlow has a bailout that detect this + // case and aborts the compile if addresses are live into an OSR + // entry point. Because of that we can assume that any address + // locals at the OSR entry point are dead. Method liveness + // isn't precise enought to figure out that they are dead in all + // cases so simply skip checking address locals all + // together. Any type check is guaranteed to fail since the + // interpreter type is the result of a load which might have any + // value and the expected type is a constant. continue; } set_local(index, check_interpreter_type(l, type, bad_type_exit)); }

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