提交 f221e543 编写于 作者: K kvn

6746907: Improve implicit null check generation

Summary: add missing implicit null check cases.
Reviewed-by: never
上级 d1e185b7
...@@ -1212,6 +1212,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type, ...@@ -1212,6 +1212,7 @@ Node* GraphKit::null_check_common(Node* value, BasicType type,
Deoptimization::Action_make_not_entrant, Deoptimization::Action_make_not_entrant,
NULL, "assert_null"); NULL, "assert_null");
} else { } else {
replace_in_map(value, zerocon(type));
builtin_throw(reason); builtin_throw(reason);
} }
} }
...@@ -1960,6 +1961,7 @@ Node* GraphKit::null_check_oop(Node* value, Node* *null_control, ...@@ -1960,6 +1961,7 @@ Node* GraphKit::null_check_oop(Node* value, Node* *null_control,
// method will be compiled to handle NULLs. // method will be compiled to handle NULLs.
PreserveJVMState pjvms(this); PreserveJVMState pjvms(this);
set_control(*null_control); set_control(*null_control);
replace_in_map(value, null());
uncommon_trap(Deoptimization::Reason_null_check, uncommon_trap(Deoptimization::Reason_null_check,
Deoptimization::Action_make_not_entrant); Deoptimization::Action_make_not_entrant);
(*null_control) = top(); // NULL path is dead (*null_control) = top(); // NULL path is dead
......
...@@ -58,6 +58,9 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe ...@@ -58,6 +58,9 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe
not_null_block = _succs[0]; not_null_block = _succs[0];
null_block = _succs[1]; 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. // Search the exception block for an uncommon trap.
// (See Parse::do_if and Parse::do_ifnull for the reason // (See Parse::do_if and Parse::do_ifnull for the reason
...@@ -149,6 +152,10 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe ...@@ -149,6 +152,10 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe
const TypePtr *adr_type = NULL; // Do not need this return value here const TypePtr *adr_type = NULL; // Do not need this return value here
const Node* base = mach->get_base_and_disp(offset, adr_type); const Node* base = mach->get_base_and_disp(offset, adr_type);
if (base == NULL || base == NodeSentinel) { 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 // cannot reason about it; is probably not implicit null exception
} else { } else {
const TypePtr* tptr = base->bottom_type()->is_ptr(); const TypePtr* tptr = base->bottom_type()->is_ptr();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册