775 ret_type = ret_type->is_valuetypeptr()->value_type(); 776 } 777 int ret_size = type2size[ret_type->basic_type()]; 778 Node* ret_phi = new PhiNode(region, ret_type); 779 gvn().set_type_bottom(ret_phi); 780 _exits.ensure_stack(ret_size); 781 assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range"); 782 assert(method()->return_type()->size() == ret_size, "tf agrees w/ method"); 783 _exits.set_argument(0, ret_phi); // here is where the parser finds it 784 // Note: ret_phi is not yet pushed, until do_exits. 785 } 786 } 787 788 // Helper function to create a ValueTypeNode from its fields passed as 789 // arguments. Fields are passed in order of increasing offsets. 790 Node* Compile::create_vt_node(Node* n, ciValueKlass* vk, ciValueKlass* base_vk, int base_offset, int base_input) { 791 assert(base_offset >= 0, "offset in value type always positive"); 792 PhaseGVN& gvn = *initial_gvn(); 793 ValueTypeNode* vt = ValueTypeNode::make(gvn, vk); 794 for (uint i = 0; i < vt->field_count(); i++) { 795 ciType* field_type = vt->get_field_type(i); 796 int offset = base_offset + vt->get_field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 797 if (field_type->is_valuetype()) { 798 ciValueKlass* embedded_vk = field_type->as_value_klass(); 799 Node* embedded_vt = create_vt_node(n, embedded_vk, base_vk, offset, base_input); 800 vt->set_field_value(i, embedded_vt); 801 } else { 802 int j = 0; int extra = 0; 803 for (; j < base_vk->nof_nonstatic_fields(); j++) { 804 ciField* f = base_vk->nonstatic_field_at(j); 805 if (offset == f->offset()) { 806 assert(f->type() == field_type, "inconsistent field type"); 807 break; 808 } 809 BasicType bt = f->type()->basic_type(); 810 if (bt == T_LONG || bt == T_DOUBLE) { 811 extra++; 812 } 813 } 814 assert(j != base_vk->nof_nonstatic_fields(), "must find"); 815 Node* parm = NULL; 816 if (n->is_Start()) { | 775 ret_type = ret_type->is_valuetypeptr()->value_type(); 776 } 777 int ret_size = type2size[ret_type->basic_type()]; 778 Node* ret_phi = new PhiNode(region, ret_type); 779 gvn().set_type_bottom(ret_phi); 780 _exits.ensure_stack(ret_size); 781 assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range"); 782 assert(method()->return_type()->size() == ret_size, "tf agrees w/ method"); 783 _exits.set_argument(0, ret_phi); // here is where the parser finds it 784 // Note: ret_phi is not yet pushed, until do_exits. 785 } 786 } 787 788 // Helper function to create a ValueTypeNode from its fields passed as 789 // arguments. Fields are passed in order of increasing offsets. 790 Node* Compile::create_vt_node(Node* n, ciValueKlass* vk, ciValueKlass* base_vk, int base_offset, int base_input) { 791 assert(base_offset >= 0, "offset in value type always positive"); 792 PhaseGVN& gvn = *initial_gvn(); 793 ValueTypeNode* vt = ValueTypeNode::make(gvn, vk); 794 for (uint i = 0; i < vt->field_count(); i++) { 795 ciType* field_type = vt->field_type(i); 796 int offset = base_offset + vt->field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); 797 if (field_type->is_valuetype()) { 798 ciValueKlass* embedded_vk = field_type->as_value_klass(); 799 Node* embedded_vt = create_vt_node(n, embedded_vk, base_vk, offset, base_input); 800 vt->set_field_value(i, embedded_vt); 801 } else { 802 int j = 0; int extra = 0; 803 for (; j < base_vk->nof_nonstatic_fields(); j++) { 804 ciField* f = base_vk->nonstatic_field_at(j); 805 if (offset == f->offset()) { 806 assert(f->type() == field_type, "inconsistent field type"); 807 break; 808 } 809 BasicType bt = f->type()->basic_type(); 810 if (bt == T_LONG || bt == T_DOUBLE) { 811 extra++; 812 } 813 } 814 assert(j != base_vk->nof_nonstatic_fields(), "must find"); 815 Node* parm = NULL; 816 if (n->is_Start()) { |