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