src/share/vm/opto/parse1.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File valhalla-experimental Sdiff src/share/vm/opto

src/share/vm/opto/parse1.cpp

Print this page




 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()) {


src/share/vm/opto/parse1.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File