< prev index next >
src/hotspot/share/opto/parse3.cpp
Print this page
*** 202,224 ****
type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
}
assert(type != NULL, "field singleton type must be consistent");
} else {
type = TypeOopPtr::make_from_klass(field_klass->as_klass());
! if (bt == T_VALUETYPE && !flattened) {
! // A non-flattened value type field may be NULL
! bool maybe_null = true;
! if (field->is_static()) {
! // Check if static field is already initialized
ciInstance* mirror = field->holder()->java_mirror();
ciObject* val = mirror->field_value(field).as_object();
if (!val->is_null_object()) {
! maybe_null = false;
! }
! }
! if (maybe_null) {
! type = type->is_valuetypeptr()->cast_to_ptr_type(TypePtr::BotPTR);
}
}
}
} else {
type = Type::get_const_basic_type(bt);
--- 202,218 ----
type = TypeOopPtr::make_from_constant(con)->isa_oopptr();
}
assert(type != NULL, "field singleton type must be consistent");
} else {
type = TypeOopPtr::make_from_klass(field_klass->as_klass());
! if (bt == T_VALUETYPE && field->is_static()) {
! // Check if static value type field is already initialized
! assert(!flattened, "static fields should not be flattened");
ciInstance* mirror = field->holder()->java_mirror();
ciObject* val = mirror->field_value(field).as_object();
if (!val->is_null_object()) {
! type = type->join_speculative(TypePtr::NOTNULL);
}
}
}
} else {
type = Type::get_const_basic_type(bt);
*** 232,242 ****
MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;
Node* ld = NULL;
if (flattened) {
// Load flattened value type
! ld = ValueTypeNode::make(this, field_klass->as_value_klass(), obj, obj, field->holder(), offset);
} else {
ld = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, needs_atomic_access);
}
// Adjust Java stack
--- 226,236 ----
MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;
Node* ld = NULL;
if (flattened) {
// Load flattened value type
! ld = ValueTypeNode::make_from_flattened(this, field_klass->as_value_klass(), obj, obj, field->holder(), offset);
} else {
ld = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, needs_atomic_access);
}
// Adjust Java stack
*** 317,329 ****
if (is_flattened) {
// Store flattened value type to a non-static field
assert(bt == T_VALUETYPE, "flattening is only supported for value type fields");
val->as_ValueType()->store_flattened(this, obj, obj, field->holder(), offset);
} else {
- if (bt == T_VALUETYPE) {
- field_type = field_type->cast_to_ptr_type(TypePtr::BotPTR)->is_oopptr();
- }
store_oop_to_object(control(), obj, adr, adr_type, val, field_type, bt, mo);
}
} else {
bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;
store_to_memory(control(), adr, val, bt, adr_type, mo, needs_atomic_access);
--- 311,320 ----
*** 651,662 ****
}
// Remove object from the top of the stack
pop();
! // Create a value type node with the corresponding type
ciValueKlass* vk = target_dvt_klass->as_value_klass();
! Node* vt = ValueTypeNode::make(this, vk, not_null_obj, not_null_obj, target_vcc_klass, vk->first_field_offset());
!
! // Push the value type onto the stack
push(vt);
}
--- 642,651 ----
}
// Remove object from the top of the stack
pop();
! // Create a value type node with the corresponding type and push it onto the stack
ciValueKlass* vk = target_dvt_klass->as_value_klass();
! ValueTypeNode* vt = ValueTypeNode::make_from_flattened(this, vk, not_null_obj, not_null_obj, target_vcc_klass, vk->first_field_offset());
push(vt);
}
< prev index next >