< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

@@ -2256,11 +2256,11 @@
         // Return precise klass
         return TypeKlassPtr::make(ik);
       }
 
       // Return root of possible klass
-      return TypeKlassPtr::make(TypePtr::NotNull, ik, Type::Offset(0));
+      return TypeKlassPtr::make(TypePtr::NotNull, ik, Type::Offset(0), tinst->flatten_array());
     }
   }
 
   // Check for loading klass from an array
   const TypeAryPtr *tary = tp->isa_aryptr();

@@ -2291,11 +2291,11 @@
             }
             // Return precise array klass
             return TypeKlassPtr::make(ak);
           }
         }
-        return TypeKlassPtr::make(TypePtr::NotNull, ak, Type::Offset(0));
+        return TypeKlassPtr::make(TypePtr::NotNull, ak, Type::Offset(0), false);
       } else if (ak->is_type_array_klass()) {
         //assert(!UseExactTypes, "this code should be useless with exact types");
         return TypeKlassPtr::make(ak); // These are always precise
       }
     }

@@ -2315,15 +2315,15 @@
       // // e.g., element type could be object and array may contain strings
       // return TypeKlassPtr::make(TypePtr::Constant, elem, 0);
 
       // The array's TypeKlassPtr was declared 'precise' or 'not precise'
       // according to the element type's subclassing.
-      return TypeKlassPtr::make(tkls->ptr(), elem, Type::Offset(0));
+      return TypeKlassPtr::make(tkls->ptr(), elem, Type::Offset(0), elem->flatten_array());
     } else if (klass->is_value_array_klass() &&
                tkls->offset() == in_bytes(ObjArrayKlass::element_klass_offset())) {
       ciKlass* elem = klass->as_value_array_klass()->element_klass();
-      return TypeKlassPtr::make(tkls->ptr(), elem, Type::Offset(0));
+      return TypeKlassPtr::make(tkls->ptr(), elem, Type::Offset(0), true);
     }
     if( klass->is_instance_klass() && tkls->klass_is_exact() &&
         tkls->offset() == in_bytes(Klass::super_offset())) {
       ciKlass* sup = klass->as_instance_klass()->super();
       // The field is Klass::_super.  Return its (constant) value.

@@ -2341,11 +2341,11 @@
 // Also feed through the klass in Allocate(...klass...)._klass.
 Node* LoadKlassNode::Identity(PhaseGVN* phase) {
   return klass_identity_common(phase);
 }
 
-const Type* GetNullFreePropertyNode::Value(PhaseGVN* phase) const {
+const Type* GetStoragePropertyNode::Value(PhaseGVN* phase) const {
   if (in(1) != NULL) {
     const Type* in1_t = phase->type(in(1));
     if (in1_t == Type::TOP) {
       return Type::TOP;
     }

@@ -2353,32 +2353,38 @@
     ciArrayKlass* ak = tk->klass()->as_array_klass();
     ciKlass* elem = ak->element_klass();
     if (tk->klass_is_exact() || (!elem->is_java_lang_Object() && !elem->is_interface() && !elem->is_valuetype())) {
       int props_shift = in1_t->isa_narrowklass() ? oopDesc::narrow_storage_props_shift : oopDesc::wide_storage_props_shift;
       ArrayStorageProperties props = ak->storage_properties();
-      intptr_t storage_properties = props.encode<intptr_t>(props_shift);
+      intptr_t storage_properties = 0;
+      if ((Opcode() == Op_GetFlattenedProperty && props.is_flattened()) ||
+          (Opcode() == Op_GetNullFreeProperty && props.is_null_free())){
+        storage_properties = 1;
+      }
       if (in1_t->isa_narrowklass()) {
         return TypeInt::make((int)storage_properties);
       }
       return TypeX::make(storage_properties);
     }
   }
   return bottom_type();
 }
 
-Node* GetNullFreePropertyNode::Ideal(PhaseGVN *phase, bool can_reshape) {
+Node* GetStoragePropertyNode::Ideal(PhaseGVN *phase, bool can_reshape) {
   if (!can_reshape) {
     return NULL;
   }
   if (in(1) != NULL && in(1)->is_Phi()) {
     Node* phi = in(1);
     Node* r = phi->in(0);
     Node* new_phi = new PhiNode(r, bottom_type());
     for (uint i = 1; i < r->req(); i++) {
       Node* in = phi->in(i);
       if (in == NULL) continue;
-      new_phi->init_req(i, phase->transform(new GetNullFreePropertyNode(in)));
+      Node* n = clone();
+      n->set_req(1, in);
+      new_phi->init_req(i, phase->transform(n));
     }
     return new_phi;
   }
   return NULL;
 }
< prev index next >