< prev index next >

src/share/vm/opto/valuetypenode.cpp

Print this page

        

*** 58,68 **** // values from a heap-allocated version and also save the oop. const TypeValueType* type = gvn.type(oop)->is_valuetypeptr()->value_type(); ValueTypeNode* vt = new ValueTypeNode(type, oop); vt->load(gvn, mem, oop, oop, type->value_klass()); assert(vt->is_allocated(&gvn), "value type should be allocated"); ! assert(oop->is_Con() || oop->is_CheckCastPP() || vt->is_loaded(&gvn, type) != NULL, "value type should be loaded"); return gvn.transform(vt); } Node* ValueTypeNode::make(PhaseGVN& gvn, ciValueKlass* vk, Node* mem, Node* obj, Node* ptr, ciInstanceKlass* holder, int holder_offset) { // Create and initialize a ValueTypeNode by loading all field values from --- 58,68 ---- // values from a heap-allocated version and also save the oop. const TypeValueType* type = gvn.type(oop)->is_valuetypeptr()->value_type(); ValueTypeNode* vt = new ValueTypeNode(type, oop); vt->load(gvn, mem, oop, oop, type->value_klass()); assert(vt->is_allocated(&gvn), "value type should be allocated"); ! assert(oop->is_Con() || oop->is_CheckCastPP() || vt->is_loaded(&gvn, type) == oop, "value type should be loaded"); return gvn.transform(vt); } Node* ValueTypeNode::make(PhaseGVN& gvn, ciValueKlass* vk, Node* mem, Node* obj, Node* ptr, ciInstanceKlass* holder, int holder_offset) { // Create and initialize a ValueTypeNode by loading all field values from
*** 70,82 **** ValueTypeNode* vt = make(gvn, vk); // The value type is flattened into the object without an oop header. Subtract the // offset of the first field to account for the missing header when loading the values. holder_offset -= vk->first_field_offset(); vt->load(gvn, mem, obj, ptr, holder, holder_offset); ! vt = gvn.transform(vt)->as_ValueType(); ! assert(!vt->is_allocated(&gvn), "value type should not be allocated"); ! return vt; } void ValueTypeNode::load(PhaseGVN& gvn, Node* mem, Node* base, Node* ptr, ciInstanceKlass* holder, int holder_offset) { // Initialize the value type by loading its field values from // memory and adding the values as input edges to the node. --- 70,81 ---- ValueTypeNode* vt = make(gvn, vk); // The value type is flattened into the object without an oop header. Subtract the // offset of the first field to account for the missing header when loading the values. holder_offset -= vk->first_field_offset(); vt->load(gvn, mem, obj, ptr, holder, holder_offset); ! assert(vt->is_loaded(&gvn, vt->type()->isa_valuetype()) != obj, "holder oop should not be used as flattened value type oop"); ! return gvn.transform(vt)->as_ValueType(); } void ValueTypeNode::load(PhaseGVN& gvn, Node* mem, Node* base, Node* ptr, ciInstanceKlass* holder, int holder_offset) { // Initialize the value type by loading its field values from // memory and adding the values as input edges to the node.
*** 121,130 **** --- 120,134 ---- set_field_value(i, gvn.transform(value)); } } Node* ValueTypeNode::is_loaded(PhaseGVN* phase, const TypeValueType* t, Node* base, int holder_offset) { + if (field_count() == 0) { + assert(t->value_klass() == phase->C->env()->___Value_klass(), "unexpected value type klass"); + assert(is_allocated(phase), "must be allocated"); + return get_oop(); + } for (uint i = 0; i < field_count(); ++i) { int offset = holder_offset + field_offset(i); Node* value = field_value(i); if (value->isa_DecodeN()) { // Skip DecodeN
*** 464,473 **** --- 468,478 ---- Node* base = is_loaded(phase, type()->is_valuetype()); if (base != NULL) { // Save the oop set_oop(base); assert(is_allocated(phase), "should now be allocated"); + return this; } } if (can_reshape) { PhaseIterGVN* igvn = phase->is_IterGVN();
< prev index next >