< prev index next >
src/share/vm/opto/memnode.cpp
Print this page
*** 1110,1125 ****
Node* addr = in(Address);
intptr_t offset;
Node* base = AddPNode::Ideal_base_and_offset(addr, phase, offset);
if (base != NULL && base->is_ValueTypePtr()) {
Node* value = base->as_ValueTypePtr()->field_value_by_offset((int)offset, true);
! if (bottom_type()->isa_narrowoop()) {
assert(!phase->type(value)->isa_narrowoop(), "should already be decoded");
value = phase->transform(new EncodePNode(value, bottom_type()));
}
return value;
}
// If the previous store-maker is the right kind of Store, and the store is
// to the same address, then we are equal to the value stored.
Node* mem = in(Memory);
Node* value = can_see_stored_value(mem, phase);
--- 1110,1138 ----
Node* addr = in(Address);
intptr_t offset;
Node* base = AddPNode::Ideal_base_and_offset(addr, phase, offset);
if (base != NULL && base->is_ValueTypePtr()) {
Node* value = base->as_ValueTypePtr()->field_value_by_offset((int)offset, true);
! if (value->is_ValueType()) {
! // Non-flattened value type field
! ValueTypeNode* vt = value->as_ValueType();
! if (vt->is_allocated(phase)) {
! value = vt->get_oop();
! } else {
! // Not yet allocated, bail out
! value = NULL;
! }
! }
! if (value != NULL) {
! if (Opcode() == Op_LoadN) {
! // Encode oop value if we are loading a narrow oop
assert(!phase->type(value)->isa_narrowoop(), "should already be decoded");
value = phase->transform(new EncodePNode(value, bottom_type()));
}
return value;
}
+ }
// If the previous store-maker is the right kind of Store, and the store is
// to the same address, then we are equal to the value stored.
Node* mem = in(Memory);
Node* value = can_see_stored_value(mem, phase);
< prev index next >