< prev index next >

src/share/vm/opto/lcm.cpp

Print this page
rev 12685 : 8176518: [9] C2: Invalid ImplicitNullChecks with non-protected heap base
Reviewed-by:

*** 253,264 **** intptr_t offset = 0; 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; if (UseCompressedOops && (Universe::narrow_oop_shift() == 0 || --- 253,265 ---- intptr_t offset = 0; 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) || ! !Universe::narrow_oop_use_implicit_null_checks())) continue; // Give up if offset is beyond page size // cannot reason about it; is probably not implicit null exception } else { const TypePtr* tptr; if (UseCompressedOops && (Universe::narrow_oop_shift() == 0 ||
*** 268,282 **** } else { // only regular oops are expected here tptr = base->bottom_type()->is_ptr(); } // Give up if offset is not a compile-time constant ! if( offset == Type::OffsetBot || tptr->_offset == Type::OffsetBot ) continue; offset += tptr->_offset; // correct if base is offseted ! if( MacroAssembler::needs_explicit_null_check(offset) ) continue; // Give up is reference is beyond 4K page size } } // Check ctrl input to see if the null-check dominates the memory op Block *cb = get_block_for_node(mach); --- 269,287 ---- } else { // only regular oops are expected here tptr = base->bottom_type()->is_ptr(); } // Give up if offset is not a compile-time constant ! if (offset == Type::OffsetBot || tptr->_offset == Type::OffsetBot) continue; offset += tptr->_offset; // correct if base is offseted ! if (MacroAssembler::needs_explicit_null_check(offset)) continue; // Give up is reference is beyond 4K page size + // Access to non-protected heap base + if (base->is_Mach() && base->as_Mach()->ideal_Opcode() == Op_DecodeN && + !Universe::narrow_oop_use_implicit_null_checks()) + continue; } } // Check ctrl input to see if the null-check dominates the memory op Block *cb = get_block_for_node(mach);
< prev index next >