src/share/vm/opto/escape.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/opto/escape.cpp
src/share/vm/opto/escape.cpp
Print this page
*** 2300,2321 ****
// |
// DecodeN
// | |
// AddP ( base == address )
//
Node *base = addp->in(AddPNode::Base);
! if (base->uncast()->is_top()) { // The AddP case #3 and #6.
base = addp->in(AddPNode::Address);
while (base->is_AddP()) {
// Case #6 (unsafe access) may have several chained AddP nodes.
assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only");
base = base->in(AddPNode::Address);
}
if (base->Opcode() == Op_CheckCastPP &&
base->bottom_type()->isa_rawptr() &&
_igvn->type(base->in(1))->isa_oopptr()) {
! base = base->in(1);
} else {
Node* uncast_base = base->uncast();
int opcode = uncast_base->Opcode();
assert(opcode == Op_ConP || opcode == Op_ThreadLocal ||
opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() ||
--- 2300,2329 ----
// |
// DecodeN
// | |
// AddP ( base == address )
//
+ // case #9. Mixed unsafe access
+ // {instance}
+ // |
+ // CheckCastPP (raw)
+ // top |
+ // \ |
+ // AddP ( base == top )
+ //
Node *base = addp->in(AddPNode::Base);
! if (base->uncast()->is_top()) { // The AddP case #3, #6, and #9.
base = addp->in(AddPNode::Address);
while (base->is_AddP()) {
// Case #6 (unsafe access) may have several chained AddP nodes.
assert(base->in(AddPNode::Base)->uncast()->is_top(), "expected unsafe access address only");
base = base->in(AddPNode::Address);
}
if (base->Opcode() == Op_CheckCastPP &&
base->bottom_type()->isa_rawptr() &&
_igvn->type(base->in(1))->isa_oopptr()) {
! base = base->in(1); // Case #9
} else {
Node* uncast_base = base->uncast();
int opcode = uncast_base->Opcode();
assert(opcode == Op_ConP || opcode == Op_ThreadLocal ||
opcode == Op_CastX2P || uncast_base->is_DecodeNarrowPtr() ||
src/share/vm/opto/escape.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File