214 } else {
215 // Add non-flattened value type field to the worklist to process later
216 worklist.push(value);
217 }
218 }
219 sfpt->add_req(value);
220 }
221 jvms->set_endoff(sfpt->req());
222 if (gvn != NULL) {
223 sobj = gvn->transform(sobj)->as_SafePointScalarObject();
224 gvn->igvn_rehash_node_delayed(sfpt);
225 }
226 return sfpt->replace_edges_in_range(this, sobj, start, end);
227 }
228
229 void ValueTypeBaseNode::make_scalar_in_safepoints(Node* root, PhaseGVN* gvn) {
230 // Process all safepoint uses and scalarize value type
231 Unique_Node_List worklist;
232 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
233 Node* u = fast_out(i);
234 if (u->is_SafePoint() && (!u->is_Call() || u->as_Call()->has_debug_use(this))) {
235 SafePointNode* sfpt = u->as_SafePoint();
236 Node* in_oop = get_oop();
237 const Type* oop_type = in_oop->bottom_type();
238 assert(Opcode() == Op_ValueTypePtr || !isa_ValueType()->is_allocated(gvn), "already heap allocated value types should be linked directly");
239 int nb = make_scalar_in_safepoint(worklist, sfpt, root, gvn);
240 --i; imax -= nb;
241 }
242 }
243 // Now scalarize non-flattened fields
244 for (uint i = 0; i < worklist.size(); ++i) {
245 Node* vt = worklist.at(i);
246 vt->as_ValueType()->make_scalar_in_safepoints(root, gvn);
247 }
248 }
249
250 void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, int base_input, bool in) {
251 assert(base_offset >= 0, "offset in value type must be positive");
252 PhaseGVN& gvn = kit->gvn();
253 for (uint i = 0; i < field_count(); i++) {
254 ciType* ft = field_type(i);
|
214 } else {
215 // Add non-flattened value type field to the worklist to process later
216 worklist.push(value);
217 }
218 }
219 sfpt->add_req(value);
220 }
221 jvms->set_endoff(sfpt->req());
222 if (gvn != NULL) {
223 sobj = gvn->transform(sobj)->as_SafePointScalarObject();
224 gvn->igvn_rehash_node_delayed(sfpt);
225 }
226 return sfpt->replace_edges_in_range(this, sobj, start, end);
227 }
228
229 void ValueTypeBaseNode::make_scalar_in_safepoints(Node* root, PhaseGVN* gvn) {
230 // Process all safepoint uses and scalarize value type
231 Unique_Node_List worklist;
232 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
233 Node* u = fast_out(i);
234 if (u->is_SafePoint() && !u->is_CallLeaf() && (!u->is_Call() || u->as_Call()->has_debug_use(this))) {
235 SafePointNode* sfpt = u->as_SafePoint();
236 Node* in_oop = get_oop();
237 const Type* oop_type = in_oop->bottom_type();
238 assert(Opcode() == Op_ValueTypePtr || !isa_ValueType()->is_allocated(gvn), "already heap allocated value types should be linked directly");
239 int nb = make_scalar_in_safepoint(worklist, sfpt, root, gvn);
240 --i; imax -= nb;
241 }
242 }
243 // Now scalarize non-flattened fields
244 for (uint i = 0; i < worklist.size(); ++i) {
245 Node* vt = worklist.at(i);
246 vt->as_ValueType()->make_scalar_in_safepoints(root, gvn);
247 }
248 }
249
250 void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, int base_input, bool in) {
251 assert(base_offset >= 0, "offset in value type must be positive");
252 PhaseGVN& gvn = kit->gvn();
253 for (uint i = 0; i < field_count(); i++) {
254 ciType* ft = field_type(i);
|