< prev index next >

src/hotspot/share/opto/valuetypenode.cpp

Print this page

        

*** 193,203 **** ciField* field = value_klass()->declared_nonstatic_field_at(index); assert(!field->is_flattenable() || field->type()->is_valuetype(), "must be a value type"); return field->is_flattenable(); } ! int ValueTypeBaseNode::make_scalar_in_safepoint(Unique_Node_List& worklist, SafePointNode* sfpt, Node* root, PhaseGVN* gvn) { ciValueKlass* vk = value_klass(); uint nfields = vk->nof_nonstatic_fields(); JVMState* jvms = sfpt->jvms(); int start = jvms->debug_start(); int end = jvms->debug_end(); --- 193,203 ---- ciField* field = value_klass()->declared_nonstatic_field_at(index); assert(!field->is_flattenable() || field->type()->is_valuetype(), "must be a value type"); return field->is_flattenable(); } ! int ValueTypeBaseNode::make_scalar_in_safepoint(PhaseIterGVN* igvn, Unique_Node_List& worklist, SafePointNode* sfpt) { ciValueKlass* vk = value_klass(); uint nfields = vk->nof_nonstatic_fields(); JVMState* jvms = sfpt->jvms(); int start = jvms->debug_start(); int end = jvms->debug_end();
*** 207,258 **** SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(value_ptr(), #ifdef ASSERT NULL, #endif first_ind, nfields); ! sobj->init_req(0, root); // Iterate over the value type fields in order of increasing // offset and add the field values to the safepoint. for (uint j = 0; j < nfields; ++j) { int offset = vk->nonstatic_field_at(j)->offset(); Node* value = field_value_by_offset(offset, true /* include flattened value type fields */); if (value->is_ValueType()) { ! if (value->as_ValueType()->is_allocated(gvn)) { ! value = value->as_ValueType()->get_oop(); ! } else { ! // Add non-flattened value type field to the worklist to process later worklist.push(value); } - } sfpt->add_req(value); } jvms->set_endoff(sfpt->req()); ! if (gvn != NULL) { ! sobj = gvn->transform(sobj)->as_SafePointScalarObject(); ! gvn->igvn_rehash_node_delayed(sfpt); ! } return sfpt->replace_edges_in_range(this, sobj, start, end); } ! void ValueTypeBaseNode::make_scalar_in_safepoints(Node* root, PhaseGVN* gvn) { // Process all safepoint uses and scalarize value type Unique_Node_List worklist; for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { ! Node* u = fast_out(i); ! if (u->is_SafePoint() && !u->is_CallLeaf() && (!u->is_Call() || u->as_Call()->has_debug_use(this))) { ! SafePointNode* sfpt = u->as_SafePoint(); ! Node* in_oop = get_oop(); ! const Type* oop_type = in_oop->bottom_type(); ! assert(Opcode() == Op_ValueTypePtr || !isa_ValueType()->is_allocated(gvn), "already heap allocated value types should be linked directly"); ! int nb = make_scalar_in_safepoint(worklist, sfpt, root, gvn); --i; imax -= nb; } } // Now scalarize non-flattened fields for (uint i = 0; i < worklist.size(); ++i) { Node* vt = worklist.at(i); ! vt->as_ValueType()->make_scalar_in_safepoints(root, gvn); } } void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, uint& base_input, bool in) { assert(base_offset >= 0, "offset in value type must be positive"); --- 207,255 ---- SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(value_ptr(), #ifdef ASSERT NULL, #endif first_ind, nfields); ! sobj->init_req(0, igvn->C->root()); // Iterate over the value type fields in order of increasing // offset and add the field values to the safepoint. for (uint j = 0; j < nfields; ++j) { int offset = vk->nonstatic_field_at(j)->offset(); Node* value = field_value_by_offset(offset, true /* include flattened value type fields */); if (value->is_ValueType()) { ! // Add value type field to the worklist to process later worklist.push(value); } sfpt->add_req(value); } jvms->set_endoff(sfpt->req()); ! sobj = igvn->transform(sobj)->as_SafePointScalarObject(); ! igvn->rehash_node_delayed(sfpt); return sfpt->replace_edges_in_range(this, sobj, start, end); } ! void ValueTypeBaseNode::make_scalar_in_safepoints(PhaseIterGVN* igvn) { // Process all safepoint uses and scalarize value type Unique_Node_List worklist; for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { ! SafePointNode* sfpt = fast_out(i)->isa_SafePoint(); ! if (sfpt != NULL && !sfpt->is_CallLeaf() && (!sfpt->is_Call() || sfpt->as_Call()->has_debug_use(this))) { ! int nb = 0; ! if (is_allocated(igvn) && get_oop()->is_Con()) { ! // Value type is allocated with a constant oop, link it directly ! nb = sfpt->replace_edges_in_range(this, get_oop(), sfpt->jvms()->debug_start(), sfpt->jvms()->debug_end()); ! igvn->rehash_node_delayed(sfpt); ! } else { ! nb = make_scalar_in_safepoint(igvn, worklist, sfpt); ! } --i; imax -= nb; } } // Now scalarize non-flattened fields for (uint i = 0; i < worklist.size(); ++i) { Node* vt = worklist.at(i); ! vt->as_ValueType()->make_scalar_in_safepoints(igvn); } } void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, uint& base_input, bool in) { assert(base_offset >= 0, "offset in value type must be positive");
*** 808,824 **** if (addp != NULL) { for (DUIterator_Fast kmax, k = addp->fast_outs(kmax); k < kmax; k++) { StoreNode* store = addp->fast_out(k)->isa_Store(); if (store != NULL && store->outcnt() != 0) { // Remove the useless store ! Node* mem = store->in(MemNode::Memory); ! Node* val = store->in(MemNode::ValueIn); ! val = val->is_EncodeP() ? val->in(1) : val; ! const Type* val_type = igvn->type(val); ! assert(val_type->is_zero_type() || (val->is_Con() && val_type->make_ptr()->is_valuetypeptr()), ! "must be zero-type or default value store"); ! igvn->replace_in_uses(store, mem); } } } } // Replace allocation by pre-allocated oop --- 805,815 ---- if (addp != NULL) { for (DUIterator_Fast kmax, k = addp->fast_outs(kmax); k < kmax; k++) { StoreNode* store = addp->fast_out(k)->isa_Store(); if (store != NULL && store->outcnt() != 0) { // Remove the useless store ! igvn->replace_in_uses(store, store->in(MemNode::Memory)); } } } } // Replace allocation by pre-allocated oop
< prev index next >