< prev index next >
src/hotspot/share/opto/memnode.cpp
Print this page
*** 1530,1543 ****
Node* ctrl = in(MemNode::Control);
Node* address = in(MemNode::Address);
bool progress = false;
// Skip up past a SafePoint control. Cannot do this for Stores because
// pointer stores & cardmarks must stay on the same side of a SafePoint.
if( ctrl != NULL && ctrl->Opcode() == Op_SafePoint &&
! phase->C->get_alias_index(phase->type(address)->is_ptr()) != Compile::AliasIdxRaw ) {
ctrl = ctrl->in(0);
set_req(MemNode::Control,ctrl);
progress = true;
}
--- 1530,1547 ----
Node* ctrl = in(MemNode::Control);
Node* address = in(MemNode::Address);
bool progress = false;
+ bool addr_mark = ((phase->type(address)->isa_oopptr() || phase->type(address)->isa_narrowoop()) &&
+ phase->type(address)->is_ptr()->offset() == oopDesc::mark_offset_in_bytes());
+
// Skip up past a SafePoint control. Cannot do this for Stores because
// pointer stores & cardmarks must stay on the same side of a SafePoint.
if( ctrl != NULL && ctrl->Opcode() == Op_SafePoint &&
! phase->C->get_alias_index(phase->type(address)->is_ptr()) != Compile::AliasIdxRaw &&
! !addr_mark ) {
ctrl = ctrl->in(0);
set_req(MemNode::Control,ctrl);
progress = true;
}
< prev index next >