< prev index next >

src/share/vm/opto/parse1.cpp

Print this page

        

*** 816,872 **** _exits.set_argument(0, ret_phi); // here is where the parser finds it // Note: ret_phi is not yet pushed, until do_exits. } } - // Helper function to create a ValueTypeNode from its fields passed as - // arguments. Fields are passed in order of increasing offsets. - Node* Compile::create_vt_node(Node* n, ciValueKlass* vk, ciValueKlass* base_vk, int base_offset, int base_input, bool in) { - assert(base_offset >= 0, "offset in value type always positive"); - PhaseGVN& gvn = *initial_gvn(); - ValueTypeNode* vt = ValueTypeNode::make(gvn, vk); - for (uint i = 0; i < vt->field_count(); i++) { - ciType* field_type = vt->field_type(i); - int offset = base_offset + vt->field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0); - if (field_type->is_valuetype()) { - ciValueKlass* embedded_vk = field_type->as_value_klass(); - Node* embedded_vt = create_vt_node(n, embedded_vk, base_vk, offset, base_input, in); - vt->set_field_value(i, embedded_vt); - } else { - int j = 0; int extra = 0; - for (; j < base_vk->nof_nonstatic_fields(); j++) { - ciField* f = base_vk->nonstatic_field_at(j); - if (offset == f->offset()) { - assert(f->type() == field_type, "inconsistent field type"); - break; - } - BasicType bt = f->type()->basic_type(); - if (bt == T_LONG || bt == T_DOUBLE) { - extra++; - } - } - assert(j != base_vk->nof_nonstatic_fields(), "must find"); - Node* parm = NULL; - if (n->is_Start()) { - assert(in, "return from start?"); - parm = gvn.transform(new ParmNode(n->as_Start(), base_input + j + extra)); - } else { - if (in) { - assert(n->is_Call(), "nothing else here"); - parm = n->in(base_input + j + extra); - } else { - parm = gvn.transform(new ProjNode(n->as_Call(), base_input + j + extra)); - } - } - vt->set_field_value(i, parm); - // Record all these guys for later GVN. - record_for_igvn(parm); - } - } - return gvn.transform(vt); - } - //----------------------------build_start_state------------------------------- // Construct a state which contains only the incoming arguments from an // unknown caller. The method & bci will be NULL & InvocationEntryBci. JVMState* Compile::build_start_state(StartNode* start, const TypeFunc* tf) { int arg_size_sig = tf->domain_sig()->cnt(); --- 816,825 ----
*** 901,911 **** // argument per field of the value type. Build ValueTypeNodes // from the value type arguments. const Type* t = tf->domain_sig()->field_at(i); if (t->isa_valuetypeptr() && t->is_valuetypeptr()->klass() != C->env()->___Value_klass()) { ciValueKlass* vk = t->is_valuetypeptr()->value_type()->value_klass(); ! Node* vt = create_vt_node(start, vk, vk, 0, j, true); map->init_req(i, gvn.transform(vt)); j += vk->value_arg_slots(); } else { Node* parm = gvn.transform(new ParmNode(start, j)); map->init_req(i, parm); --- 854,864 ---- // argument per field of the value type. Build ValueTypeNodes // from the value type arguments. const Type* t = tf->domain_sig()->field_at(i); if (t->isa_valuetypeptr() && t->is_valuetypeptr()->klass() != C->env()->___Value_klass()) { ciValueKlass* vk = t->is_valuetypeptr()->value_type()->value_klass(); ! Node* vt = ValueTypeNode::make(gvn, start, vk, j, true); map->init_req(i, gvn.transform(vt)); j += vk->value_arg_slots(); } else { Node* parm = gvn.transform(new ParmNode(start, j)); map->init_req(i, parm);
< prev index next >