< prev index next >
src/hotspot/share/opto/valuetypenode.cpp
Print this page
*** 346,356 ****
}
value = kit->access_load_at(base, adr, adr_type, val_type, bt, decorators);
}
if (ft->is_valuetype()) {
// Loading a non-flattened value type from memory
! value = ValueTypeNode::make_from_oop(kit, value, ft->as_value_klass(), /* buffer_check */ false, /* null2default */ field_is_flattenable(i), trap_bci);
}
}
set_field_value(i, value);
}
}
--- 346,356 ----
}
value = kit->access_load_at(base, adr, adr_type, val_type, bt, decorators);
}
if (ft->is_valuetype()) {
// Loading a non-flattened value type from memory
! value = ValueTypeNode::make_from_oop(kit, value, ft->as_value_klass(), /* null2default */ field_is_flattenable(i), trap_bci);
}
}
set_field_value(i, value);
}
}
*** 521,531 ****
}
}
return true;
}
! ValueTypeNode* ValueTypeNode::make_from_oop(GraphKit* kit, Node* oop, ciValueKlass* vk, bool buffer_check, bool null2default, int trap_bci) {
PhaseGVN& gvn = kit->gvn();
const TypePtr* oop_type = gvn.type(oop)->is_ptr();
bool null_check = oop_type->maybe_null();
// Create and initialize a ValueTypeNode by loading all field
--- 521,531 ----
}
}
return true;
}
! ValueTypeNode* ValueTypeNode::make_from_oop(GraphKit* kit, Node* oop, ciValueKlass* vk, bool null2default, int trap_bci) {
PhaseGVN& gvn = kit->gvn();
const TypePtr* oop_type = gvn.type(oop)->is_ptr();
bool null_check = oop_type->maybe_null();
// Create and initialize a ValueTypeNode by loading all field
*** 587,620 ****
vt->load(kit, oop, oop, vk, /* holder_offset */ 0, trap_bci);
assert(init_ctl != kit->control() || oop->is_Con() || oop->is_CheckCastPP() || oop->Opcode() == Op_ValueTypePtr ||
vt->is_loaded(&gvn) == oop, "value type should be loaded");
}
- if (buffer_check && vk->is_bufferable()) {
- // Check if oop is in heap bounds or if it points into the vtBuffer:
- // base <= oop < (base + size) <=> (oop - base) <U size
- // Discard buffer oops to avoid storing them into fields or arrays.
- assert(!gvn.type(oop)->isa_narrowoop(), "should not be a narrow oop");
- Node* heap_base = gvn.MakeConX((intptr_t)Universe::heap()->base());
- Node* heap_size = gvn.MakeConX(Universe::heap()->max_capacity());
- Node* sub = gvn.transform(new SubXNode(gvn.transform(new CastP2XNode(NULL, oop)), heap_base));
- Node* chk = gvn.transform(new CmpUXNode(sub, heap_size));
- Node* tst = gvn.transform(new BoolNode(chk, BoolTest::lt));
- IfNode* iff = gvn.transform(new IfNode(kit->control(), tst, PROB_MAX, COUNT_UNKNOWN))->as_If();
-
- Node* region = new RegionNode(3);
- region->init_req(1, gvn.transform(new IfTrueNode(iff)));
- region->init_req(2, gvn.transform(new IfFalseNode(iff)));
- Node* new_oop = new PhiNode(region, vt->value_ptr());
- new_oop->init_req(1, oop);
- new_oop->init_req(2, gvn.zerocon(T_VALUETYPE));
-
- gvn.hash_delete(vt);
- vt->set_oop(gvn.transform(new_oop));
- kit->set_control(gvn.transform(region));
- }
-
assert(vt->is_allocated(&gvn), "value type should be allocated");
return gvn.transform(vt)->as_ValueType();
}
// GraphKit wrapper for the 'make_from_flattened' method
--- 587,596 ----
*** 767,777 ****
// Use the pre-allocated oop for default value types
set_oop(default_oop(*phase, value_klass()));
return this;
}
! if (!is_allocated(phase) && !value_klass()->is_bufferable()) {
// Save base oop if fields are loaded from memory and the value
// type is not buffered (in this case we should not use the oop).
Node* base = is_loaded(phase);
if (base != NULL) {
set_oop(base);
--- 743,753 ----
// Use the pre-allocated oop for default value types
set_oop(default_oop(*phase, value_klass()));
return this;
}
! if (!is_allocated(phase)) {
// Save base oop if fields are loaded from memory and the value
// type is not buffered (in this case we should not use the oop).
Node* base = is_loaded(phase);
if (base != NULL) {
set_oop(base);
< prev index next >