< 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 >