597 kit->set_i_o(kit->gvn().transform(io)); 598 kit->set_all_memory(kit->gvn().transform(mem)); 599 kit->record_for_igvn(region); 600 kit->record_for_igvn(oop); 601 kit->record_for_igvn(io); 602 kit->record_for_igvn(mem); 603 604 // Use cloned ValueTypeNode to propagate oop from now on 605 Node* res_oop = kit->gvn().transform(oop); 606 ValueTypeNode* vt = clone()->as_ValueType(); 607 vt->set_oop(res_oop); 608 kit->replace_in_map(this, kit->gvn().transform(vt)); 609 return res_oop; 610 } 611 612 bool ValueTypeNode::is_allocated(PhaseGVN* phase) const { 613 const Type* oop_type = phase->type(get_oop()); 614 return oop_type->meet(TypePtr::NULL_PTR) != oop_type; 615 } 616 617 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) { 618 ciValueKlass* vk = value_klass(); 619 const TypeKlassPtr* tk = TypeKlassPtr::make(vk); 620 intptr_t bits = tk->get_con(); 621 set_nth_bit(bits, 0); 622 Node* klass_tagged = kit.MakeConX(bits); 623 n->init_req(pos, klass_tagged); 624 } 625 626 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) { 627 ciValueKlass* vk = value_klass(); 628 if (base_vk == NULL) { 629 base_vk = vk; 630 } 631 uint edges = 0; 632 for (uint i = 0; i < field_count(); i++) { 633 ciType* f_type = field_type(i); 634 int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 635 Node* arg = field_value(i); 636 if (f_type->is_valuetype()) { 637 ciValueKlass* embedded_vk = f_type->as_value_klass(); 638 edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset); 639 } else { 640 int j = 0; int extra = 0; 641 for (; j < base_vk->nof_nonstatic_fields(); j++) { 642 ciField* f = base_vk->nonstatic_field_at(j); 643 if (offset == f->offset()) { | 597 kit->set_i_o(kit->gvn().transform(io)); 598 kit->set_all_memory(kit->gvn().transform(mem)); 599 kit->record_for_igvn(region); 600 kit->record_for_igvn(oop); 601 kit->record_for_igvn(io); 602 kit->record_for_igvn(mem); 603 604 // Use cloned ValueTypeNode to propagate oop from now on 605 Node* res_oop = kit->gvn().transform(oop); 606 ValueTypeNode* vt = clone()->as_ValueType(); 607 vt->set_oop(res_oop); 608 kit->replace_in_map(this, kit->gvn().transform(vt)); 609 return res_oop; 610 } 611 612 bool ValueTypeNode::is_allocated(PhaseGVN* phase) const { 613 const Type* oop_type = phase->type(get_oop()); 614 return oop_type->meet(TypePtr::NULL_PTR) != oop_type; 615 } 616 617 Node* ValueTypeNode::tagged_klass(PhaseGVN& gvn) { 618 ciValueKlass* vk = value_klass(); 619 const TypeKlassPtr* tk = TypeKlassPtr::make(vk); 620 intptr_t bits = tk->get_con(); 621 set_nth_bit(bits, 0); 622 return gvn.makecon(TypeRawPtr::make((address)bits)); 623 } 624 625 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) { 626 n->init_req(pos, tagged_klass(kit.gvn())); 627 } 628 629 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) { 630 ciValueKlass* vk = value_klass(); 631 if (base_vk == NULL) { 632 base_vk = vk; 633 } 634 uint edges = 0; 635 for (uint i = 0; i < field_count(); i++) { 636 ciType* f_type = field_type(i); 637 int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 638 Node* arg = field_value(i); 639 if (f_type->is_valuetype()) { 640 ciValueKlass* embedded_vk = f_type->as_value_klass(); 641 edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset); 642 } else { 643 int j = 0; int extra = 0; 644 for (; j < base_vk->nof_nonstatic_fields(); j++) { 645 ciField* f = base_vk->nonstatic_field_at(j); 646 if (offset == f->offset()) { |