< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
@@ -210,10 +210,11 @@
}
Node* generate_typeArray_guard(Node* kls, RegionNode* region) {
return generate_array_guard_common(kls, region, TypeArray);
}
Node* generate_valueArray_guard(Node* kls, RegionNode* region) {
+ assert(ValueArrayFlatten, "can never be flattened");
return generate_array_guard_common(kls, region, ValueArray);
}
Node* generate_array_guard_common(Node* kls, RegionNode* region, ArrayKind kind);
Node* generate_virtual_guard(Node* obj_klass, RegionNode* slow_region);
CallJavaNode* generate_method_call(vmIntrinsics::ID method_id,
@@ -4033,21 +4034,25 @@
original_kls = load_object_klass(original);
}
}
}
- if (EnableValhalla) {
+ if (ValueArrayFlatten) {
// Either both or neither new array klass and original array
// klass must be flattened
- Node* flattened_klass = generate_valueArray_guard(klass_node, NULL);
+ Node* is_flat = generate_valueArray_guard(klass_node, NULL);
+ if (!original_t->is_not_flat()) {
generate_valueArray_guard(original_kls, bailout);
- if (flattened_klass != NULL) {
+ }
+ if (is_flat != NULL) {
RegionNode* r = new RegionNode(2);
record_for_igvn(r);
r->init_req(1, control());
- set_control(flattened_klass);
+ set_control(is_flat);
+ if (!original_t->is_not_flat()) {
generate_valueArray_guard(original_kls, r);
+ }
bailout->add_req(control());
set_control(_gvn.transform(r));
}
}
@@ -4755,11 +4760,12 @@
// It's an array.
PreserveJVMState pjvms(this);
set_control(array_ctl);
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
- if (bs->array_copy_requires_gc_barriers(true, T_OBJECT, true, BarrierSetC2::Parsing)) {
+ if (bs->array_copy_requires_gc_barriers(true, T_OBJECT, true, BarrierSetC2::Parsing) &&
+ (!obj_type->isa_aryptr() || !obj_type->is_aryptr()->is_not_flat())) {
// Flattened value type array may have object field that would require a
// write barrier. Conservatively, go to slow path.
generate_valueArray_guard(obj_klass, slow_region);
}
@@ -5240,19 +5246,15 @@
const Type* toop = TypeOopPtr::make_from_klass(dest_klass_t->klass());
src = _gvn.transform(new CheckCastPPNode(control(), src, toop));
src_type = _gvn.type(src);
top_src = src_type->isa_aryptr();
- if (top_dest != NULL &&
- top_dest->elem()->make_oopptr() != NULL &&
- top_dest->elem()->make_oopptr()->can_be_value_type()) {
+ if (top_dest != NULL && !top_dest->elem()->isa_valuetype() && !top_dest->is_not_flat()) {
generate_valueArray_guard(dest_klass, slow_region);
}
- if (top_src != NULL &&
- top_src->elem()->make_oopptr() != NULL &&
- top_src->elem()->make_oopptr()->can_be_value_type()) {
+ if (top_src != NULL && !top_src->elem()->isa_valuetype() && !top_src->is_not_flat()) {
generate_valueArray_guard(src_klass, slow_region);
}
{
PreserveJVMState pjvms(this);
< prev index next >