< prev index next >

src/share/vm/opto/parse1.cpp

Print this page

        

*** 1743,1778 **** // Reload current state because it may have been updated by ensure_phi m = map()->in(j); ValueTypeNode* vtm = m->as_ValueType(); // Current value type ValueTypeNode* vtn = n->as_ValueType(); // Incoming value type if (TraceOptoParse) { - tty->print_cr("Merging value types"); #ifdef ASSERT tty->print_cr("Current:"); ! vtm->dump(1); tty->print_cr("Incoming:"); ! vtn->dump(1); #endif } ! // Merge oop inputs ! phi = vtm->get_oop()->as_Phi(); ! phi->set_req(pnum, vtn->get_oop()); ! if (pnum == PhiNode::Input) { ! // Last merge ! vtm->set_oop(_gvn.transform_no_reclaim(phi)); ! record_for_igvn(phi); ! } ! // Merge field values ! for (uint index = 0; index < vtm->field_count(); ++index) { ! phi = vtm->get_field_value(index)->as_Phi(); ! phi->set_req(pnum, vtn->get_field_value(index)); ! if (pnum == PhiNode::Input) { ! // Last merge ! vtm->set_field_value(index, _gvn.transform_no_reclaim(phi)); ! record_for_igvn(phi); ! } ! } } else if (phi != NULL) { assert(n != top() || r->in(pnum) == top(), "live value must not be garbage"); assert(phi->region() == r, ""); phi->set_req(pnum, n); // Then add 'n' to the merge if (pnum == PhiNode::Input) { --- 1743,1763 ---- // Reload current state because it may have been updated by ensure_phi m = map()->in(j); ValueTypeNode* vtm = m->as_ValueType(); // Current value type ValueTypeNode* vtn = n->as_ValueType(); // Incoming value type if (TraceOptoParse) { #ifdef ASSERT + tty->print_cr("\nMerging value types"); tty->print_cr("Current:"); ! vtm->dump(2); tty->print_cr("Incoming:"); ! vtn->dump(2); ! tty->cr(); #endif } ! // Do the merge ! map()->set_req(j, vtm->merge_with(this, vtn, pnum)); } else if (phi != NULL) { assert(n != top() || r->in(pnum) == top(), "live value must not be garbage"); assert(phi->region() == r, ""); phi->set_req(pnum, n); // Then add 'n' to the merge if (pnum == PhiNode::Input) {
*** 1966,1979 **** if (o->is_Phi() && o->as_Phi()->region() == region) { return o->as_Phi(); } ValueTypeNode* vt = o->isa_ValueType(); ! if (vt != NULL && vt->get_oop()->is_Phi() && vt->get_oop()->as_Phi()->region() == region) { // ValueTypeNode already has Phi inputs return NULL; } // Now use a Phi here for merging assert(!nocreate, "Cannot build a phi for a block already parsed."); const JVMState* jvms = map->jvms(); const Type* t = NULL; --- 1951,1972 ---- if (o->is_Phi() && o->as_Phi()->region() == region) { return o->as_Phi(); } ValueTypeNode* vt = o->isa_ValueType(); ! if (vt != NULL) { ! // Value types are merged by merging their field values ! if (vt->get_oop()->is_Phi() && vt->get_oop()->as_Phi()->region() == region) { // ValueTypeNode already has Phi inputs return NULL; } + // Create a cloned ValueTypeNode with phi inputs that + // represents the merged value type and update the map. + vt = vt->clone_with_phis(gvn(), region); + map->set_req(idx, vt); + return NULL; + } // Now use a Phi here for merging assert(!nocreate, "Cannot build a phi for a block already parsed."); const JVMState* jvms = map->jvms(); const Type* t = NULL;
*** 2003,2037 **** if (t == Type::TOP || t == Type::HALF) { map->set_req(idx, top()); return NULL; } - // Value types are merged by merging their field values - if (vt != NULL) { - // Create new ValueTypeNode that represents the merged value type - vt = vt->clone()->as_ValueType(); - - // Create a PhiNode for merging the oop - const TypeValueTypePtr* vtptr = TypeValueTypePtr::make(t->is_valuetype()); - PhiNode* oop = PhiNode::make(region, vt->get_oop(), vtptr); - gvn().set_type(oop, vtptr); - vt->set_oop(oop); - - // Create a PhiNode for merging each field value - for (uint i = 0; i < vt->field_count(); ++i) { - const Type* field_type = Type::get_const_basic_type(vt->get_field_type(i)); - PhiNode* phi = PhiNode::make(region, vt->get_field_value(i), field_type); - gvn().set_type(phi, field_type); - vt->set_field_value(i, phi); - } - - // Update map to use cloned value type - gvn().set_type(vt, t); - map->set_req(idx, vt); - return NULL; - } - PhiNode* phi = PhiNode::make(region, o, t); gvn().set_type(phi, t); if (C->do_escape_analysis()) record_for_igvn(phi); map->set_req(idx, phi); return phi; --- 1996,2005 ----
< prev index next >