403 #endif 404 first_ind, nfields); 405 sobj->init_req(0, C->root()); 406 // Iterate over the value type fields in order of increasing 407 // offset and add the field values to the safepoint. 408 for (uint j = 0; j < nfields; ++j) { 409 int offset = vk->nonstatic_field_at(j)->offset(); 410 Node* value = field_value_by_offset(offset, true /* include flattened value type fields */); 411 sfpt->add_req(value); 412 } 413 jvms->set_endoff(sfpt->req()); 414 int nb = sfpt->replace_edges_in_range(this, sobj, start, end); 415 --i; imax -= nb; 416 } 417 } 418 } 419 420 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) { 421 ciValueKlass* vk = value_klass(); 422 const TypeKlassPtr* tk = TypeKlassPtr::make(vk); 423 Node* arg = kit.makecon(tk); 424 n->init_req(pos, arg); 425 } 426 427 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) { 428 ciValueKlass* vk = value_klass(); 429 if (base_vk == NULL) { 430 base_vk = vk; 431 } 432 uint edges = 0; 433 for (uint i = 0; i < field_count(); i++) { 434 ciType* f_type = field_type(i); 435 int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 436 Node* arg = field_value(i); 437 if (f_type->is_valuetype()) { 438 ciValueKlass* embedded_vk = f_type->as_value_klass(); 439 edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset); 440 } else { 441 int j = 0; int extra = 0; 442 for (; j < base_vk->nof_nonstatic_fields(); j++) { 443 ciField* f = base_vk->nonstatic_field_at(j); 444 if (offset == f->offset()) { | 403 #endif 404 first_ind, nfields); 405 sobj->init_req(0, C->root()); 406 // Iterate over the value type fields in order of increasing 407 // offset and add the field values to the safepoint. 408 for (uint j = 0; j < nfields; ++j) { 409 int offset = vk->nonstatic_field_at(j)->offset(); 410 Node* value = field_value_by_offset(offset, true /* include flattened value type fields */); 411 sfpt->add_req(value); 412 } 413 jvms->set_endoff(sfpt->req()); 414 int nb = sfpt->replace_edges_in_range(this, sobj, start, end); 415 --i; imax -= nb; 416 } 417 } 418 } 419 420 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) { 421 ciValueKlass* vk = value_klass(); 422 const TypeKlassPtr* tk = TypeKlassPtr::make(vk); 423 intptr_t bits = tk->get_con(); 424 bits |= 1; 425 Node* klass_tagged = kit.MakeConX(bits); 426 n->init_req(pos, klass_tagged); 427 } 428 429 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) { 430 ciValueKlass* vk = value_klass(); 431 if (base_vk == NULL) { 432 base_vk = vk; 433 } 434 uint edges = 0; 435 for (uint i = 0; i < field_count(); i++) { 436 ciType* f_type = field_type(i); 437 int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 438 Node* arg = field_value(i); 439 if (f_type->is_valuetype()) { 440 ciValueKlass* embedded_vk = f_type->as_value_klass(); 441 edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset); 442 } else { 443 int j = 0; int extra = 0; 444 for (; j < base_vk->nof_nonstatic_fields(); j++) { 445 ciField* f = base_vk->nonstatic_field_at(j); 446 if (offset == f->offset()) { |