< prev index next >
src/hotspot/share/opto/macro.cpp
Print this page
*** 721,730 ****
--- 721,732 ----
} else {
safepoints.append_if_missing(sfpt);
}
} else if (use->is_ValueType() && use->isa_ValueType()->get_oop() == res) {
// ok to eliminate
+ } else if (use->is_Store()) {
+ // store to mark work
} else if (use->Opcode() != Op_CastP2X) { // CastP2X is used by card mark
if (use->is_Phi()) {
if (use->outcnt() == 1 && use->unique_out()->Opcode() == Op_Return) {
NOT_PRODUCT(fail_eliminate = "Object is return value";)
} else {
*** 1060,1069 ****
--- 1062,1073 ----
_igvn._worklist.push(ac);
} else if (use->is_ValueType()) {
assert(use->isa_ValueType()->get_oop() == res, "unexpected value type use");
_igvn.rehash_node_delayed(use);
use->isa_ValueType()->set_oop(_igvn.zerocon(T_VALUETYPE));
+ } else if (use->is_Store()) {
+ _igvn.replace_node(use, use->in(MemNode::Memory));
} else {
eliminate_gc_barrier(use);
}
j -= (oc1 - res->outcnt());
}
*** 1702,1719 ****
Node* control, Node* rawmem, Node* object,
Node* klass_node, Node* length,
Node* size_in_bytes) {
InitializeNode* init = alloc->initialization();
// Store the klass & mark bits
! Node* mark_node = NULL;
! // For now only enable fast locking for non-array types
! if ((EnableValhalla || UseBiasedLocking) && length == NULL) {
! mark_node = make_load(control, rawmem, klass_node, in_bytes(Klass::prototype_header_offset()), TypeRawPtr::BOTTOM, T_ADDRESS);
! } else {
! mark_node = makecon(TypeRawPtr::make((address)markOopDesc::prototype()));
}
! rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, T_ADDRESS);
rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA);
int header_size = alloc->minimum_header_size(); // conservatively small
// Array length
--- 1706,1720 ----
Node* control, Node* rawmem, Node* object,
Node* klass_node, Node* length,
Node* size_in_bytes) {
InitializeNode* init = alloc->initialization();
// Store the klass & mark bits
! Node* mark_node = alloc->make_ideal_mark(&_igvn, object, control, rawmem, klass_node);
! if (!mark_node->is_Con()) {
! transform_later(mark_node);
}
! rawmem = make_store(control, rawmem, object, oopDesc::mark_offset_in_bytes(), mark_node, TypeX_X->basic_type());
rawmem = make_store(control, rawmem, object, oopDesc::klass_offset_in_bytes(), klass_node, T_METADATA);
int header_size = alloc->minimum_header_size(); // conservatively small
// Array length
< prev index next >