< prev index next >

src/hotspot/share/opto/graphKit.cpp

Print this page

        

@@ -3451,43 +3451,46 @@
     uncommon_trap(Deoptimization::Reason_class_check,
                   Deoptimization::Action_none);
   }
 }
 
-// Deoptimize if 'ary' is a null-free value type array and 'val' is null
-void GraphKit::gen_value_array_null_guard(Node* ary, Node* val, int nargs) {
+// Check if 'ary' is a null-free value type array
+Node* GraphKit::gen_null_free_array_check(Node* ary) {
   assert(EnableValhalla, "should only be used if value types are enabled");
-  const Type* val_t = _gvn.type(val);
-  if (val->is_ValueType() || !TypePtr::NULL_PTR->higher_equal(val_t)) {
-    return; // Never null
-  }
-  RegionNode* region = new RegionNode(3);
-  Node* null_ctl = top();
-  null_check_oop(val, &null_ctl);
-  if (null_ctl != top()) {
-    PreserveJVMState pjvms(this);
-    set_control(null_ctl);
     // Extract null free property from klass pointer
     Node* k_adr = basic_plus_adr(ary, oopDesc::klass_offset_in_bytes());
     const TypePtr *k_adr_type = k_adr->bottom_type()->isa_ptr();
     Node* klass = NULL;
     if (k_adr_type->is_ptr_to_narrowklass()) {
       klass = _gvn.transform(new LoadNKlassNode(NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT->make_narrowklass(), MemNode::unordered));
     } else {
       klass = _gvn.transform(new LoadKlassNode(NULL, immutable_memory(), k_adr, TypeInstPtr::KLASS, TypeKlassPtr::OBJECT, MemNode::unordered));
     }
-
     Node* null_free = _gvn.transform(new GetNullFreePropertyNode(klass));
-    // Deoptimize if null-free array
     Node* cmp = NULL;
     if (_gvn.type(klass)->isa_klassptr()) {
-      cmp = new CmpLNode(null_free, zerocon(T_LONG));
+    cmp = _gvn.transform(new CmpLNode(null_free, zerocon(T_LONG)));
     } else {
-      cmp = new CmpINode(null_free, zerocon(T_INT));
+    cmp = _gvn.transform(new CmpINode(null_free, zerocon(T_INT)));
     }
-    cmp = _gvn.transform(cmp);
-    Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::eq));
+  return _gvn.transform(new BoolNode(cmp, BoolTest::eq));
+}
+
+// Deoptimize if 'ary' is a null-free value type array and 'val' is null
+void GraphKit::gen_value_array_null_guard(Node* ary, Node* val, int nargs) {
+  const Type* val_t = _gvn.type(val);
+  if (val->is_ValueType() || !TypePtr::NULL_PTR->higher_equal(val_t)) {
+    return; // Never null
+  }
+  RegionNode* region = new RegionNode(3);
+  Node* null_ctl = top();
+  null_check_oop(val, &null_ctl);
+  if (null_ctl != top()) {
+    PreserveJVMState pjvms(this);
+    set_control(null_ctl);
+    // Deoptimize if null-free array
+    Node* bol = gen_null_free_array_check(ary);
     { BuildCutout unless(this, bol, PROB_MAX);
       inc_sp(nargs);
       uncommon_trap(Deoptimization::Reason_null_check,
                     Deoptimization::Action_none);
     }

@@ -4363,11 +4366,11 @@
   int value_offset = java_lang_String::value_offset_in_bytes();
   const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
                                                      false, NULL, Type::Offset(0));
   const TypePtr* value_field_type = string_type->add_offset(value_offset);
   const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull,
-                                                  TypeAry::make(TypeInt::BYTE, TypeInt::POS),
+                                                  TypeAry::make(TypeInt::BYTE, TypeInt::POS, false, true, true),
                                                   ciTypeArrayKlass::make(T_BYTE), true, Type::Offset(0));
   Node* p = basic_plus_adr(str, str, value_offset);
   Node* load = access_load_at(str, p, value_field_type, value_type, T_OBJECT,
                               IN_HEAP | (set_ctrl ? C2_CONTROL_DEPENDENT_LOAD : 0) | MO_UNORDERED);
   return load;
< prev index next >