< prev index next >

src/share/vm/opto/valuetypenode.cpp

Print this page

        

*** 133,157 **** if (value->isa_DecodeN()) { // Skip DecodeN value = value->in(1); } if (value->isa_Load()) { ! AddPNode* load_addr = value->in(MemNode::Address)->as_AddP(); ! if (base == NULL) { // Set base and check if pointer type matches ! base = load_addr->base_node(); const TypeValueTypePtr* vtptr = phase->type(base)->isa_valuetypeptr(); if (vtptr == NULL || !vtptr->value_type()->eq(t)) { return NULL; } } - // Check if base and offset of field load matches - Node* off = load_addr->in(AddPNode::Offset); - int load_offset = LP64_ONLY(off->get_long()) NOT_LP64(off->get_int()); - if (base != load_addr->base_node() || offset != load_offset) { - return NULL; - } } else if (value->isa_ValueType()) { // Check value type field load recursively ValueTypeNode* vt = value->as_ValueType(); base = vt->is_loaded(phase, t, base, offset - vt->value_klass()->first_field_offset()); if (base == NULL) { --- 133,155 ---- if (value->isa_DecodeN()) { // Skip DecodeN value = value->in(1); } if (value->isa_Load()) { ! // Check if base and offset of field load matches value type layout ! intptr_t loffset = 0; ! Node* lbase = AddPNode::Ideal_base_and_offset(value->in(MemNode::Address), phase, loffset); ! 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_type()->eq(t)) { return NULL; } } } else if (value->isa_ValueType()) { // Check value type field load recursively ValueTypeNode* vt = value->as_ValueType(); base = vt->is_loaded(phase, t, base, offset - vt->value_klass()->first_field_offset()); if (base == NULL) {
< prev index next >