< prev index next >

src/hotspot/share/opto/valuetypenode.cpp

Print this page

        

*** 188,199 **** int start = jvms->debug_start(); int end = jvms->debug_end(); // Replace safepoint edge by SafePointScalarObjectNode and add field values assert(jvms != NULL, "missing JVMS"); uint first_ind = (sfpt->req() - jvms->scloff()); ! const TypeValueTypePtr* res_type = value_type_ptr(); ! SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(res_type, #ifdef ASSERT NULL, #endif first_ind, nfields); sobj->init_req(0, root); --- 188,198 ---- int start = jvms->debug_start(); int end = jvms->debug_end(); // Replace safepoint edge by SafePointScalarObjectNode and add field values assert(jvms != NULL, "missing JVMS"); uint first_ind = (sfpt->req() - jvms->scloff()); ! SafePointScalarObjectNode* sobj = new SafePointScalarObjectNode(value_ptr(), #ifdef ASSERT NULL, #endif first_ind, nfields); sobj->init_req(0, root);
*** 325,335 **** con_type = Type::make_from_constant(constant, /*require_const=*/ true); } if (con_type != NULL) { // Found a constant field value value = gvn.transform(gvn.makecon(con_type)); ! if (con_type->isa_valuetypeptr()) { // Constant, non-flattened value type field value = ValueTypeNode::make_from_oop(gvn, ctl, mem, value, ft->as_value_klass()); } } else { // Load field value from memory --- 324,334 ---- con_type = Type::make_from_constant(constant, /*require_const=*/ true); } if (con_type != NULL) { // Found a constant field value value = gvn.transform(gvn.makecon(con_type)); ! if (con_type->is_valuetypeptr()) { // Constant, non-flattened value type field value = ValueTypeNode::make_from_oop(gvn, ctl, mem, value, ft->as_value_klass()); } } else { // Load field value from memory
*** 402,412 **** } // Not able to prove that value type is allocated. // Emit runtime check that may be folded later. assert(!is_allocated(&kit->gvn()), "should not be allocated"); RegionNode* region = new RegionNode(3); ! PhiNode* oop = new PhiNode(region, value_type_ptr()); PhiNode* io = new PhiNode(region, Type::ABIO); PhiNode* mem = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM); // Oop is non-NULL, use it region->init_req(1, kit->control()); --- 401,411 ---- } // Not able to prove that value type is allocated. // Emit runtime check that may be folded later. assert(!is_allocated(&kit->gvn()), "should not be allocated"); RegionNode* region = new RegionNode(3); ! PhiNode* oop = new PhiNode(region, value_ptr()); PhiNode* io = new PhiNode(region, Type::ABIO); PhiNode* mem = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM); // Oop is non-NULL, use it region->init_req(1, kit->control());
*** 593,603 **** IfNode* iff = gvn.transform(new IfNode(ctl, tst, PROB_MAX, COUNT_UNKNOWN))->as_If(); Node* region = new RegionNode(3); region->init_req(1, gvn.transform(new IfTrueNode(iff))); region->init_req(2, gvn.transform(new IfFalseNode(iff))); ! Node* new_oop = new PhiNode(region, vt->value_type_ptr()); new_oop->init_req(1, oop); new_oop->init_req(2, gvn.zerocon(T_VALUETYPE)); gvn.hash_delete(vt); vt->set_oop(gvn.transform(new_oop)); --- 592,602 ---- IfNode* iff = gvn.transform(new IfNode(ctl, tst, PROB_MAX, COUNT_UNKNOWN))->as_If(); Node* region = new RegionNode(3); region->init_req(1, gvn.transform(new IfTrueNode(iff))); region->init_req(2, gvn.transform(new IfFalseNode(iff))); ! Node* new_oop = new PhiNode(region, vt->value_ptr()); new_oop->init_req(1, oop); new_oop->init_req(2, gvn.zerocon(T_VALUETYPE)); gvn.hash_delete(vt); vt->set_oop(gvn.transform(new_oop));
*** 664,675 **** if (lbase == NULL || (lbase != base && base != NULL) || loffset != offset) { return NULL; } else if (base == NULL) { // Set base and check if pointer type matches base = lbase; ! const TypeValueTypePtr* vtptr = phase->type(base)->isa_valuetypeptr(); ! if (vtptr == NULL || !vtptr->value_klass()->equals(vk)) { return NULL; } } } else if (value->isa_ValueType()) { // Check value type field load recursively --- 663,674 ---- if (lbase == NULL || (lbase != base && base != NULL) || loffset != offset) { return NULL; } else if (base == NULL) { // Set base and check if pointer type matches base = lbase; ! const TypeInstPtr* vtptr = phase->type(base)->isa_instptr(); ! if (vtptr == NULL || !vtptr->klass()->equals(vk)) { return NULL; } } } else if (value->isa_ValueType()) { // Check value type field load recursively
*** 915,924 **** } ValueTypePtrNode* ValueTypePtrNode::make_from_oop(PhaseGVN& gvn, Node*& ctl, Node* mem, Node* oop) { // Create and initialize a ValueTypePtrNode by loading all field // values from a heap-allocated version and also save the oop. ! ciValueKlass* vk = gvn.type(oop)->is_valuetypeptr()->value_klass(); ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, oop); vtptr->load(gvn, ctl, mem, oop, oop, vk); return vtptr; } --- 914,923 ---- } ValueTypePtrNode* ValueTypePtrNode::make_from_oop(PhaseGVN& gvn, Node*& ctl, Node* mem, Node* oop) { // Create and initialize a ValueTypePtrNode by loading all field // values from a heap-allocated version and also save the oop. ! ciValueKlass* vk = gvn.type(oop)->value_klass(); ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, oop); vtptr->load(gvn, ctl, mem, oop, oop, vk); return vtptr; }
< prev index next >