< prev index next >
src/share/vm/opto/escape.cpp
Print this page
*** 2095,2106 ****
// Ignore array length load.
} else if (find_second_addp(n, n->in(AddPNode::Base)) != NULL) {
// Ignore first AddP.
} else {
const Type* elemtype = adr_type->isa_aryptr()->elem();
! if (elemtype->isa_valuetype()) {
! assert(field_offset != Type::OffsetBot, "invalid field offset");
ciValueKlass* vk = elemtype->is_valuetype()->value_klass();
field_offset += vk->first_field_offset();
bt = vk->get_field_by_offset(field_offset, false)->layout_type();
} else {
bt = elemtype->array_element_basic_type();
--- 2095,2105 ----
// Ignore array length load.
} else if (find_second_addp(n, n->in(AddPNode::Base)) != NULL) {
// Ignore first AddP.
} else {
const Type* elemtype = adr_type->isa_aryptr()->elem();
! if (elemtype->isa_valuetype() && field_offset != Type::OffsetBot) {
ciValueKlass* vk = elemtype->is_valuetype()->value_klass();
field_offset += vk->first_field_offset();
bt = vk->get_field_by_offset(field_offset, false)->layout_type();
} else {
bt = elemtype->array_element_basic_type();
*** 2113,2123 ****
n->has_out_with(Op_CompareAndSwapP, Op_CompareAndSwapN, Op_WeakCompareAndSwapP, Op_WeakCompareAndSwapN)) {
bt = T_OBJECT;
}
}
}
! return (bt == T_OBJECT || bt == T_NARROWOOP || bt == T_ARRAY);
}
// Returns unique pointed java object or NULL.
JavaObjectNode* ConnectionGraph::unique_java_object(Node *n) {
assert(!_collecting, "should not call when contructed graph");
--- 2112,2124 ----
n->has_out_with(Op_CompareAndSwapP, Op_CompareAndSwapN, Op_WeakCompareAndSwapP, Op_WeakCompareAndSwapN)) {
bt = T_OBJECT;
}
}
}
! // TODO enable when using T_VALUETYPEPTR
! //assert(bt != T_VALUETYPE, "should not have valuetype here");
! return (bt == T_OBJECT || bt == T_VALUETYPE || bt == T_VALUETYPEPTR || bt == T_NARROWOOP || bt == T_ARRAY);
}
// Returns unique pointed java object or NULL.
JavaObjectNode* ConnectionGraph::unique_java_object(Node *n) {
assert(!_collecting, "should not call when contructed graph");
*** 3181,3191 ****
}
} else if (use->Opcode() == Op_Return) {
assert(_compile->tf()->returns_value_type_as_fields(), "must return a value type");
// Get ValueKlass by removing the tag bit from the metadata pointer
Node* klass = use->in(TypeFunc::Parms);
! intptr_t ptr = (intptr_t)igvn->find_intptr_t_con(klass, -1);
clear_nth_bit(ptr, 0);
assert(Metaspace::contains((void*)ptr), "should be klass");
assert(((ValueKlass*)ptr)->contains_oops(), "returned value type must contain a reference field");
} else {
uint op = use->Opcode();
--- 3182,3192 ----
}
} else if (use->Opcode() == Op_Return) {
assert(_compile->tf()->returns_value_type_as_fields(), "must return a value type");
// Get ValueKlass by removing the tag bit from the metadata pointer
Node* klass = use->in(TypeFunc::Parms);
! intptr_t ptr = igvn->type(klass)->isa_rawptr()->get_con();
clear_nth_bit(ptr, 0);
assert(Metaspace::contains((void*)ptr), "should be klass");
assert(((ValueKlass*)ptr)->contains_oops(), "returned value type must contain a reference field");
} else {
uint op = use->Opcode();
< prev index next >