hotspot/src/share/vm/opto/memnode.cpp
changeset 26412 80741eb33ba2
parent 25930 eae8b7490d2c
child 26442 2944daffe62a
equal deleted inserted replaced
26408:d6defe172e25 26412:80741eb33ba2
  1797         ciKlass *ss = klass->super_of_depth(depth);
  1797         ciKlass *ss = klass->super_of_depth(depth);
  1798         return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR;
  1798         return ss ? TypeKlassPtr::make(ss) : TypePtr::NULL_PTR;
  1799       }
  1799       }
  1800       const Type* aift = load_array_final_field(tkls, klass);
  1800       const Type* aift = load_array_final_field(tkls, klass);
  1801       if (aift != NULL)  return aift;
  1801       if (aift != NULL)  return aift;
  1802       if (tkls->offset() == in_bytes(ArrayKlass::component_mirror_offset())
       
  1803           && klass->is_array_klass()) {
       
  1804         // The field is ArrayKlass::_component_mirror.  Return its (constant) value.
       
  1805         // (Folds up aClassConstant.getComponentType, common in Arrays.copyOf.)
       
  1806         assert(Opcode() == Op_LoadP, "must load an oop from _component_mirror");
       
  1807         return TypeInstPtr::make(klass->as_array_klass()->component_mirror());
       
  1808       }
       
  1809       if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) {
  1802       if (tkls->offset() == in_bytes(Klass::java_mirror_offset())) {
  1810         // The field is Klass::_java_mirror.  Return its (constant) value.
  1803         // The field is Klass::_java_mirror.  Return its (constant) value.
  1811         // (Folds up the 2nd indirection in anObjConstant.getClass().)
  1804         // (Folds up the 2nd indirection in anObjConstant.getClass().)
  1812         assert(Opcode() == Op_LoadP, "must load an oop from _java_mirror");
  1805         assert(Opcode() == Op_LoadP, "must load an oop from _java_mirror");
  1813         return TypeInstPtr::make(klass->java_mirror());
  1806         return TypeInstPtr::make(klass->java_mirror());
  2198       return allocated_klass;
  2191       return allocated_klass;
  2199     }
  2192     }
  2200   }
  2193   }
  2201 
  2194 
  2202   // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*.
  2195   // Simplify k.java_mirror.as_klass to plain k, where k is a Klass*.
  2203   // Simplify ak.component_mirror.array_klass to plain ak, ak an ArrayKlass.
       
  2204   // See inline_native_Class_query for occurrences of these patterns.
  2196   // See inline_native_Class_query for occurrences of these patterns.
  2205   // Java Example:  x.getClass().isAssignableFrom(y)
  2197   // Java Example:  x.getClass().isAssignableFrom(y)
  2206   // Java Example:  Array.newInstance(x.getClass().getComponentType(), n)
       
  2207   //
  2198   //
  2208   // This improves reflective code, often making the Class
  2199   // This improves reflective code, often making the Class
  2209   // mirror go completely dead.  (Current exception:  Class
  2200   // mirror go completely dead.  (Current exception:  Class
  2210   // mirrors may appear in debug info, but we could clean them out by
  2201   // mirrors may appear in debug info, but we could clean them out by
  2211   // introducing a new debug info operator for Klass*.java_mirror).
  2202   // introducing a new debug info operator for Klass*.java_mirror).
  2212   if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass()
  2203   if (toop->isa_instptr() && toop->klass() == phase->C->env()->Class_klass()
  2213       && (offset == java_lang_Class::klass_offset_in_bytes() ||
  2204       && offset == java_lang_Class::klass_offset_in_bytes()) {
  2214           offset == java_lang_Class::array_klass_offset_in_bytes())) {
       
  2215     // We are loading a special hidden field from a Class mirror,
  2205     // We are loading a special hidden field from a Class mirror,
  2216     // the field which points to its Klass or ArrayKlass metaobject.
  2206     // the field which points to its Klass or ArrayKlass metaobject.
  2217     if (base->is_Load()) {
  2207     if (base->is_Load()) {
  2218       Node* adr2 = base->in(MemNode::Address);
  2208       Node* adr2 = base->in(MemNode::Address);
  2219       const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr();
  2209       const TypeKlassPtr* tkls = phase->type(adr2)->isa_klassptr();
  2221           && (tkls->klass()->is_instance_klass() ||
  2211           && (tkls->klass()->is_instance_klass() ||
  2222               tkls->klass()->is_array_klass())
  2212               tkls->klass()->is_array_klass())
  2223           && adr2->is_AddP()
  2213           && adr2->is_AddP()
  2224           ) {
  2214           ) {
  2225         int mirror_field = in_bytes(Klass::java_mirror_offset());
  2215         int mirror_field = in_bytes(Klass::java_mirror_offset());
  2226         if (offset == java_lang_Class::array_klass_offset_in_bytes()) {
       
  2227           mirror_field = in_bytes(ArrayKlass::component_mirror_offset());
       
  2228         }
       
  2229         if (tkls->offset() == mirror_field) {
  2216         if (tkls->offset() == mirror_field) {
  2230           return adr2->in(AddPNode::Base);
  2217           return adr2->in(AddPNode::Base);
  2231         }
  2218         }
  2232       }
  2219       }
  2233     }
  2220     }