< prev index next >
src/share/vm/opto/valuetypenode.cpp
Print this page
*** 41,54 ****
// Create a new ValueTypeNode with default values
ValueTypeNode* vt = ValueTypeNode::make(gvn, vk);
for (uint i = 0; i < vt->field_count(); ++i) {
ciType* field_type = vt->field_type(i);
Node* value = NULL;
! if (field_type->is_primitive_type()) {
! value = gvn.zerocon(field_type->basic_type());
! } else {
value = ValueTypeNode::make_default(gvn, field_type->as_value_klass());
}
vt->set_field_value(i, value);
}
return gvn.transform(vt);
}
--- 41,54 ----
// Create a new ValueTypeNode with default values
ValueTypeNode* vt = ValueTypeNode::make(gvn, vk);
for (uint i = 0; i < vt->field_count(); ++i) {
ciType* field_type = vt->field_type(i);
Node* value = NULL;
! if (field_type->is_valuetype()) {
value = ValueTypeNode::make_default(gvn, field_type->as_value_klass());
+ } else {
+ value = gvn.zerocon(field_type->basic_type());
}
vt->set_field_value(i, value);
}
return gvn.transform(vt);
}
*** 108,118 ****
} else {
ciField* field = holder->get_field_by_offset(offset, false);
adr_type = gvn.C->alias_type(field)->adr_type();
}
Node* adr = gvn.transform(new AddPNode(base, ptr, gvn.MakeConX(offset)));
! value = LoadNode::make(gvn, NULL, mem, adr, adr_type, Type::get_const_type(ftype), ftype->basic_type(), MemNode::unordered);
}
}
set_field_value(i, gvn.transform(value));
}
}
--- 108,119 ----
} else {
ciField* field = holder->get_field_by_offset(offset, false);
adr_type = gvn.C->alias_type(field)->adr_type();
}
Node* adr = gvn.transform(new AddPNode(base, ptr, gvn.MakeConX(offset)));
! BasicType bt = type2field[ftype->basic_type()];
! value = LoadNode::make(gvn, NULL, mem, adr, adr_type, Type::get_const_type(ftype), bt, MemNode::unordered);
}
}
set_field_value(i, gvn.transform(value));
}
}
*** 141,151 ****
} else {
ciField* field = holder->get_field_by_offset(offset, false);
adr_type = kit->C->alias_type(field)->adr_type();
}
Node* adr = kit->basic_plus_adr(base, ptr, offset);
! kit->store_to_memory(kit->control(), adr, value, field_type(i)->basic_type(), adr_type, MemNode::unordered);
}
}
}
Node* ValueTypeNode::store_to_memory(GraphKit* kit) {
--- 142,161 ----
} else {
ciField* field = holder->get_field_by_offset(offset, false);
adr_type = kit->C->alias_type(field)->adr_type();
}
Node* adr = kit->basic_plus_adr(base, ptr, offset);
! BasicType bt = type2field[field_type(i)->basic_type()];
! if (is_java_primitive(bt)) {
! kit->store_to_memory(kit->control(), adr, value, bt, adr_type, MemNode::unordered);
! } else {
! const TypeOopPtr* ft = TypeOopPtr::make_from_klass(field_type(i)->as_klass());
! assert(adr->bottom_type()->is_ptr_to_narrowoop() == UseCompressedOops, "inconsistent");
! bool is_array = base_type->isa_aryptr() != NULL;
! kit->store_oop(kit->control(), base, adr, adr_type, value, ft, bt, is_array, MemNode::unordered);
! }
!
}
}
}
Node* ValueTypeNode::store_to_memory(GraphKit* kit) {
*** 168,193 ****
PhiNode* io = new PhiNode(region, Type::ABIO);
PhiNode* mem = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
// Oop is non-NULL, use it
region->init_req(1, kit->control());
! // Fixme if we cast oop to not null we fail if the control path is not folded
! // castnode.cpp:69: # assert(ft == Type::TOP) failed: special case #3
! //oop ->init_req(1, not_null_oop);
! oop ->init_req(1, in_oop);
io ->init_req(1, kit->i_o());
mem ->init_req(1, kit->merged_memory());
// Oop is NULL, allocate value type
kit->set_control(null_ctl);
kit->kill_dead_locals();
ciValueKlass* vk = value_klass();
Node* klass_node = kit->makecon(TypeKlassPtr::make(vk));
Node* alloc_oop = kit->new_instance(klass_node);
- AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_oop, &kit->gvn());
- // TODO enable/fix this
- // alloc->initialization()->set_complete_with_arraycopy();
// Write field values to memory
store_values(kit, alloc_oop, alloc_oop, vk);
region->init_req(2, kit->control());
oop ->init_req(2, alloc_oop);
io ->init_req(2, kit->i_o());
--- 178,197 ----
PhiNode* io = new PhiNode(region, Type::ABIO);
PhiNode* mem = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
// Oop is non-NULL, use it
region->init_req(1, kit->control());
! oop ->init_req(1, not_null_oop);
io ->init_req(1, kit->i_o());
mem ->init_req(1, kit->merged_memory());
// Oop is NULL, allocate value type
kit->set_control(null_ctl);
kit->kill_dead_locals();
ciValueKlass* vk = value_klass();
Node* klass_node = kit->makecon(TypeKlassPtr::make(vk));
Node* alloc_oop = kit->new_instance(klass_node);
// Write field values to memory
store_values(kit, alloc_oop, alloc_oop, vk);
region->init_req(2, kit->control());
oop ->init_req(2, alloc_oop);
io ->init_req(2, kit->i_o());
< prev index next >