# HG changeset patch # User kvn # Date 1221104687 25200 # Node ID c792b641b8bd3d33946950b8034eabbad11f25d6 # Parent cecd8eb4e0ca022e666bbbed6c3a49b8ac81757f 6746907: Improve implicit null check generation Summary: add missing implicit null check cases. Reviewed-by: never diff -r cecd8eb4e0ca -r c792b641b8bd src/share/vm/opto/graphKit.cpp --- 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 @@ Deoptimization::Action_make_not_entrant, NULL, "assert_null"); } else { + replace_in_map(value, zerocon(type)); builtin_throw(reason); } } @@ -1960,6 +1961,7 @@ // 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 diff -r cecd8eb4e0ca -r c792b641b8bd src/share/vm/opto/lcm.cpp --- 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 @@ -58,6 +58,9 @@ 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. // (See Parse::do_if and Parse::do_ifnull for the reason @@ -149,6 +152,10 @@ 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();