< prev index next >
src/share/vm/opto/parse3.cpp
Print this page
*** 174,185 ****
}
}
ciType* field_klass = field->type();
bool is_vol = field->is_volatile();
! // TODO change this when we support non-flattened value type fields that are non-static
! bool flattened = (bt == T_VALUETYPE) && !field->is_static();
// Compute address and memory type.
int offset = field->offset_in_bytes();
const TypePtr* adr_type = C->alias_type(field)->adr_type();
Node *adr = basic_plus_adr(obj, obj, offset);
--- 174,184 ----
}
}
ciType* field_klass = field->type();
bool is_vol = field->is_volatile();
! bool flattened = field->is_flattened();
// Compute address and memory type.
int offset = field->offset_in_bytes();
const TypePtr* adr_type = C->alias_type(field)->adr_type();
Node *adr = basic_plus_adr(obj, obj, offset);
*** 233,243 ****
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(_gvn, field_klass->as_value_klass(), map()->memory(), obj, obj, field->holder(), offset);
} else {
ld = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, needs_atomic_access);
}
// Adjust Java stack
--- 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
*** 279,288 ****
--- 278,288 ----
}
}
void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
bool is_vol = field->is_volatile();
+ bool is_flattened = field->is_flattened();
// If reference is volatile, prevent following memory ops from
// floating down past the volatile write. Also prevents commoning
// another volatile read.
if (is_vol) insert_mem_bar(Op_MemBarRelease);
*** 312,325 ****
if (!field->type()->is_loaded()) {
field_type = TypeInstPtr::BOTTOM;
} else {
field_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
}
! if (bt == T_VALUETYPE && !field->is_static()) {
! // Store flattened value type to non-static field
val->as_ValueType()->store_flattened(this, obj, obj, field->holder(), offset);
} else {
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);
--- 312,329 ----
if (!field->type()->is_loaded()) {
field_type = TypeInstPtr::BOTTOM;
} else {
field_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
}
! 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);
*** 649,658 ****
// 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(gvn(), vk, map()->memory(), not_null_obj, not_null_obj, target_vcc_klass, vk->first_field_offset());
// Push the value type onto the stack
push(vt);
}
--- 653,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);
}
< prev index next >