--- a/src/share/vm/opto/graphKit.cpp Wed Sep 10 18:23:32 2008 -0700
+++ b/src/share/vm/opto/graphKit.cpp Wed Sep 10 20:44:47 2008 -0700
@@ -1212,6 +1212,7 @@ Node* GraphKit::null_check_common(Node*
Deoptimization::Action_make_not_entrant,
NULL, "assert_null");
} else {
+ replace_in_map(value, zerocon(type));
builtin_throw(reason);
}
}
@@ -1960,6 +1961,7 @@ Node* GraphKit::null_check_oop(Node* val
// method will be compiled to handle NULLs.
PreserveJVMState pjvms(this);
set_control(*null_control);
+ replace_in_map(value, null());
uncommon_trap(Deoptimization::Reason_null_check,
Deoptimization::Action_make_not_entrant);
(*null_control) = top(); // NULL path is dead
--- a/src/share/vm/opto/lcm.cpp Wed Sep 10 18:23:32 2008 -0700
+++ b/src/share/vm/opto/lcm.cpp Wed Sep 10 20:44:47 2008 -0700
@@ -57,6 +57,9 @@ void Block::implicit_null_check(PhaseCFG
assert(_nodes[_nodes.size()-2] == proj, "proj is one or the other");
not_null_block = _succs[0];
null_block = _succs[1];
+ }
+ while (null_block->is_Empty() == Block::empty_with_goto) {
+ null_block = null_block->_succs[0];
}
// Search the exception block for an uncommon trap.
@@ -149,6 +152,10 @@ void Block::implicit_null_check(PhaseCFG
const TypePtr *adr_type = NULL; // Do not need this return value here
const Node* base = mach->get_base_and_disp(offset, adr_type);
if (base == NULL || base == NodeSentinel) {
+ // Narrow oop address doesn't have base, only index
+ if( val->bottom_type()->isa_narrowoop() &&
+ MacroAssembler::needs_explicit_null_check(offset) )
+ continue; // Give up if offset is beyond page size
// cannot reason about it; is probably not implicit null exception
} else {
const TypePtr* tptr = base->bottom_type()->is_ptr();