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